maneira mais rápida de desenhar um buffer de tela no iphone

Eu tenho um "renderizador de software" que estou carregando do PC para o iPhone. qual é a maneira mais rápida de atualizar manualmente a tela com um buffer de pixels no iphone? por exemplo, no Windows, a função mais rápida que encontrei é SetDIBitsToDevice.

Eu não sei muito sobre o iphone ou as bibliotecas, e parece haver muitas camadas e tipos diferentes de elementos da interface do usuário, por isso posso precisar de muitas explicações ...

por enquanto, vou atualizar constantemente uma textura no opengl e renderizá-la na tela, duvido muito que essa seja a melhor maneira de fazer isso.

ATUALIZAR:

Eu tentei o método de textura de tamanho de tela openGL:

Eu tenho 17fps ...

Usei uma textura de 512x512 (porque precisa ser uma potência de dois)

apenas a chamada de

glTexSubImage2D(GL_TEXTURE_2D,0,0,0,512,512,GL_RGBA,GL_UNSIGNED_BYTE, baseWindowGUI->GetBuffer());

parecia praticamente responsável por toda a desaceleração.

comentar e deixar em todo o meu código de GUI de renderização de software, e a renderização da textura agora sem atualização, resultaram em 60fps, 30% de uso do renderizador e nenhum pico notável da CPU.

Observe que GetBuffer () simplesmente retorna um ponteiro para o backbuffer de software do sistema GUI, não há nenhuma re-apresentação ou redimensionamento do buffer de qualquer maneira, ele é dimensionado e formatado corretamente para a textura, por isso estou bastante certo de que a desaceleração ocorreu. nada a ver com o renderizador de software, que é uma boa notícia, parece que se eu conseguir encontrar uma maneira de atualizar a tela aos 60 anos, a renderização do software deve funcionar por enquanto.

Eu tentei fazer a chamada de atualização de textura com 512.320 em vez de 512.512, isso foi estranhamente ainda mais lento ... rodando a 10fps, também diz que a utilização da renderização é de apenas 5% e todo o tempo está sendo desperdiçado em uma chamada para Untwiddle32bpp dentro do openGLES .

Eu posso alterar minha renderização de software para renderizar nativamente para qualquer formato de pixle, se isso resultar em um blit mais direto.

fyi, testado em um 2.2.1 ipod touch G2 (como um iPhone 3G em esteróides)

ATUALIZAÇÃO 2:

Acabei de escrever o método CoreAnimation / Graphics, parece bom, mas estou um pouco preocupado com a forma como ele atualiza a tela em cada quadro, basicamente abandonando a CGImage antiga, criando um novo CGImage, criando um novo ... confira em 'someRandomFunction 'abaixo: esta é a maneira mais rápida de atualizar a imagem? Qualquer ajuda seria muito apreciada.

//
//  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