OpenGL на iOS. Можно ли вызывать glTexImage2D в отдельном потоке? - PullRequest
1 голос
/ 02 марта 2011

В iOS я всегда предполагал, что не возможно сделать создание текстуры OpenGL - glTexImage2D - в отдельном потоке через подкласс NSOperation. Может кто-нибудь, пожалуйста, подтвердите / опровергните.

Поскольку создание текстур потенциально может повесить графический интерфейс - плохо! - кто-нибудь придумал обходной путь, которым он доволен?

Спасибо
Дуг

1 Ответ

2 голосов
/ 02 марта 2011

Да, взгляните на CCTextureCache.m в cocos2d для iPhone.

cocos2d-iphone / cocos2d / CCTextureCache.m

NSAutoreleasePool *autoreleasepool = [[NSAutoreleasePool alloc] init];

// textures will be created on the main OpenGL context
// it seems that in SDK 2.2.x there can't be 2 threads creating textures at the same time
// the lock is used for this purpose: issue #472
[contextLock_ lock];
if( auxGLcontext == nil ) {
    auxGLcontext = [[EAGLContext alloc]
                           initWithAPI:kEAGLRenderingAPIOpenGLES1
                           sharegroup:[[[[CCDirector sharedDirector] openGLView] context] sharegroup]];

    if( ! auxGLcontext )
        CCLOG(@"cocos2d: TextureCache: Could not create EAGL context");
}

if( [EAGLContext setCurrentContext:auxGLcontext] ) {

    // load / create the texture
    CCTexture2D *tex = [self addImage:async.data];

    /* This method calls glTexImage2D. */


    // The callback will be executed on the main thread
    [async.target performSelectorOnMainThread:async.selector withObject:tex waitUntilDone:NO];        

    [EAGLContext setCurrentContext:nil];
} else {
    CCLOG(@"cocos2d: TetureCache: EAGLContext error");
}
[contextLock_ unlock];

[autoreleasepool release];
...