самый быстрый способ нарисовать экранный буфер на 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

Ответы на вопрос(5)

Ваш ответ на вопрос