Tôi có một "trình kết xuất phần mềm" mà tôi đang chuyển từ PC sang iPhone. cách nhanh nhất để tự cập nhật màn hình bằng bộ đệm pixel trên iphone là gì? ví dụ trong các cửa sổ chức năng nhanh nhất mà tôi đã tìm thấy là SetDIBitsToDevice.Cách nhanh nhất để vẽ bộ đệm màn hình trên iphone
Tôi không biết nhiều về iphone, hoặc các thư viện, và có vẻ như có rất nhiều lớp và các loại khác nhau của các yếu tố giao diện người dùng, vì vậy tôi có thể cần rất nhiều lời giải thích ...
cho bây giờ Tôi chỉ sẽ liên tục cập nhật một kết cấu trong opengl và đưa nó lên màn hình, tôi rất nghi ngờ rằng đây sẽ là cách tốt nhất để làm điều đó.
UPDATE:
Tôi đã thử phương pháp kết cấu màn hình có kích thước OpenGL:
tôi đã 17fps ...
tôi đã sử dụng một kết cấu 512x512 (vì nó cần phải được một sức mạnh của hai)
chỉ là tiếng gọi của
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,512,512,GL_RGBA,GL_UNSIGNED_BYTE, baseWindowGUI->GetBuffer());
dường như khá nhiều lại tài trợ cho TẤT CẢ sự chậm lại.
nhận xét nó ra, và để lại trong tất cả phần mềm của tôi hiển thị mã GUI và kết xuất của kết cấu hiện không cập nhật, kết quả là 60fps, sử dụng trình kết xuất 30% và không có đột biến đáng chú ý từ cpu.
lưu ý rằng GetBuffer() đơn giản trả về con trỏ cho phần mềm backbuffer của hệ thống GUI, không có re-gigging hoặc thay đổi kích thước của bộ đệm trong anyway, nó là đúng kích cỡ và định dạng cho kết cấu, vì vậy tôi khá chắc chắn sự chậm lại không liên quan gì đến trình kết xuất phần mềm, đó là tin tốt, có vẻ như nếu tôi có thể tìm cách cập nhật màn hình ở mức 60, việc hiển thị phần mềm sẽ hoạt động trong thời gian này.
Tôi đã thử thực hiện cuộc gọi kết cấu cập nhật với 512,320 thay vì 512,512 điều này thậm chí còn chậm hơn ... chạy ở tốc độ 10 khung hình/giây, đồng thời cho biết việc sử dụng kết xuất chỉ là 5% và tất cả thời gian bị lãng phí trong cuộc gọi vào Untwiddle32bpp bên trong openGLES.
Tôi có thể thay đổi phần mềm của mình để hiển thị tự nhiên thành bất kỳ định dạng pixle nào, nếu nó dẫn đến một blit trực tiếp hơn.
FYI, thử nghiệm trên một 2.2.1 G2 ipod touch (vì vậy giống như một Iphone 3G trên steroid)
UPDATE 2:
Tôi vừa writting phương pháp CoreAnimation/Graphics xong, nó có vẻ tốt, nhưng tôi hơi lo lắng về cách nó cập nhật màn hình mỗi khung hình, về cơ bản bỏ qua CGImage cũ, tạo một thương hiệu mới ... kiểm tra nó trong 'someRandomFunction' bên dưới: là cách nhanh nhất để cập nhật hình ảnh? Mọi sự trợ giúp sẽ rất được trân trọng.
//
// catestAppDelegate.m
// catest
//
// Created by User on 3/14/10.
// Copyright __MyCompanyName__ 2010. All rights reserved.
//
#import "catestAppDelegate.h"
#import "catestViewController.h"
#import "QuartzCore/QuartzCore.h"
const void* GetBytePointer(void* info)
{
// this is currently only called once
return info; // info is a pointer to the buffer
}
void ReleaseBytePointer(void*info, const void* pointer)
{
// don't care, just using the one static buffer at the moment
}
size_t GetBytesAtPosition(void* info, void* buffer, off_t position, size_t count)
{
// I don't think this ever gets called
memcpy(buffer, ((char*)info) + position, count);
return count;
}
CGDataProviderDirectCallbacks providerCallbacks =
{ 0, GetBytePointer, ReleaseBytePointer, GetBytesAtPosition, 0 };
static CGImageRef cgIm;
static CGDataProviderRef dataProvider;
unsigned char* imageData;
const size_t imageDataSize = 320 * 480 * 4;
NSTimer *animationTimer;
NSTimeInterval animationInterval= 1.0f/60.0f;
@implementation catestAppDelegate
@synthesize window;
@synthesize viewController;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
[window makeKeyAndVisible];
const size_t byteRowSize = 320 * 4;
imageData = malloc(imageDataSize);
for(int i=0;i<imageDataSize/4;i++)
((unsigned int*)imageData)[i] = 0xFFFF00FF; // just set it to some random init color, currently yellow
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
dataProvider =
CGDataProviderCreateDirect(imageData, imageDataSize,
&providerCallbacks); // currently global
cgIm = CGImageCreate
(320, 480,
8, 32, 320*4, colorSpace,
kCGImageAlphaNone | kCGBitmapByteOrder32Little,
dataProvider, 0, false, kCGRenderingIntentDefault); // also global, probably doesn't need to be
self.window.layer.contents = cgIm; // set the UIWindow's CALayer's contents to the image, yay works!
// CGImageRelease(cgIm); // we should do this at some stage...
// CGDataProviderRelease(dataProvider);
animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(someRandomFunction) userInfo:nil repeats:YES];
// set up a timer in the attempt to update the image
}
float col = 0;
-(void)someRandomFunction
{
// update the original buffer
for(int i=0;i<imageDataSize;i++)
imageData[i] = (unsigned char)(int)col;
col+=256.0f/60.0f;
// and currently the only way I know how to apply that buffer update to the screen is to
// create a new image and bind it to the layer...???
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
cgIm = CGImageCreate
(320, 480,
8, 32, 320*4, colorSpace,
kCGImageAlphaNone | kCGBitmapByteOrder32Little,
dataProvider, 0, false, kCGRenderingIntentDefault);
CGColorSpaceRelease(colorSpace);
self.window.layer.contents = cgIm;
// and that currently works, updating the screen, but i don't know how well it runs...
}
- (void)dealloc {
[viewController release];
[window release];
[super dealloc];
}
@end
Tôi cũng gặp vấn đề này, là giải pháp duy nhất để tạo và tiêu diệt một khung hình CGImage? (đã thử điều này và chậm hơn so với glTexsubimage). Dường như toàn bộ điểm của nhà cung cấp trực tiếp là nó nên trỏ đến bộ đệm đó vì vậy nếu tôi thay đổi nó, hình ảnh được cập nhật. Bất kỳ trợ giúp về điều này? –
Tôi nghĩ rằng điểm của việc sử dụng CGDataProviderCreateDirect là truy cập trực tiếp vào một bộ đệm pixel, làm mới bằng cách sử dụng CADisplayLink. Thật không may, điều này là khủng khiếp chậm. Bất kỳ cách giải quyết nào được phát hiện? – aoakenfo