самый быстрый способ нарисовать экранный буфер на iphone
У меня есть «программный рендер», который я портирую с ПК на iPhone. Какой самый быстрый способ вручную обновить экран с буфером пикселей на iphone? Например, в Windows самая быстрая функция, которую я нашел, это SetDIBitsToDevice.
Я не очень разбираюсь в iphone или библиотеках, и, кажется, что существует так много слоев и различных типов элементов пользовательского интерфейса, поэтому мне может понадобиться много объяснений ...
сейчас я просто собираюсь постоянно обновлять текстуру в opengl и рендерить ее на экран, я очень сомневаюсь, что это будет лучшим способом сделать это.
ОБНОВИТЬ:
Я попробовал метод текстуры с размером экрана openGL:
Я получил 17fps ...
Я использовал текстуру 512x512 (потому что она должна быть степенью двойки)
просто зов
glTexSubImage2D(GL_TEXTURE_2D,0,0,0,512,512,GL_RGBA,GL_UNSIGNED_BYTE, baseWindowGUI->GetBuffer());
Казалось, в значительной степени ответственность за все замедление.
закомментировав его, оставив во всем моем коде графического интерфейса рендеринга программного обеспечения и рендеринг теперь не обновляющейся текстуры, результат 60 кадров в секунду, 30% использования рендерера и никаких заметных всплесков от процессора.
обратите внимание, что GetBuffer () просто возвращает указатель на программный буфер системы графического интерфейса, в любом случае нет перенастройки или изменения размера буфера, он имеет правильный размер и формат для текстуры, поэтому я вполне уверен, что замедление Ничего общего с программным рендерером, что является хорошей новостью, похоже, если я найду способ обновить экран на 60, рендеринг программного обеспечения должен работать в настоящее время.
Я попытался выполнить вызов текстуры для обновления с 512 320, а не с 512 512, это было странно даже медленнее ... работает на скорости 10 кадров в секунду, также он говорит, что использование рендеринга составляет всего лишь 5%, и все время тратится впустую при вызове Untwiddle32bpp внутри openGLES ,
Я могу изменить программный рендеринг на нативный рендеринг в любом формате пикселей, если это приведет к более прямому блицу.
К вашему сведению, протестировано на Ipod Touch G2 2.2.1 (так, как Iphone 3G на стероидах)
ОБНОВЛЕНИЕ 2:
Я только что закончил писать метод CoreAnimation / Graphics, он выглядит хорошо, но меня немного беспокоит то, как он обновляет экран в каждом кадре, в основном отказываясь от старого CGImage, создавая новый ... проверьте это в someRandomFunction 'ниже: это самый быстрый способ обновить изображение? любая помощь будет принята с благодарностью.
//
// 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