CVOpenGLESTextureCache vs glTexSubImage2D sur iOS

Mon application OpenGL utilise OpenGL pour rendre une texture en plein écran et en met une partie à jour à intervalles réguliers. Jusqu'à présent, j'utilise glTexImage2D pour pousser ma texture initiale et ensuite je mets à jour les régions sales avec glTexSubImage2D. Pour ce faire, j'utilise un seul tampon. Cela fonctionne bien.

J'ai vu qu'il pourrait y avoir une autre façon d'get la même chose en utilisant CVOpenGLESTextureCache. Les textures conservées dans le cache de texture font reference à un CVPixelBuffer. J'aimerais savoir si je peux muter ces textures en cache. J'ai essayé de recréer un CVOpenGLESTexture pour chaque mise à jour, mais cela réduit mon taux de trame de façon spectaculaire (ce qui n'est pas surprenant après tout car je ne spécifie pas la région sale n'importe où). Peut-être que j'ai totalement mal compris le cas d'utilisation de ce cache de texture.

Quelqu'un peut-il donner des conseils?

MISE À JOUR: Voici le code que j'utilise. La première mise à jour fonctionne bien. Les mises à jour suivantes ne le font pas (rien ne se passe). Entre chaque mise à jour, je modifie le bitmap brut.

if (firstUpdate) { CVReturn err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, ctx, NULL, &texCache); CVPixelBufferRef pixelBuffer; CVPixelBufferCreateWithBytes(NULL, width_, height_, kCVPixelFormatType_32BGRA, bitmap, width_*4, NULL, 0, NULL, &pixelBuffer); CVPixelBufferLockBaseAddress(pixelBuffer, 0); CVOpenGLESTextureRef texture = NULL; CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, texCache, pixelBuffer, NULL, GL_TEXTURE_2D, GL_RGBA, width_, height_, GL_BGRA, GL_UNSIGNED_BYTE, 0, &texture); texture_[0] = CVOpenGLESTextureGetName(texture); CVPixelBufferUnlockBaseAddress(pixelBuffer, 0); } CVOpenGLESTextureCacheFlush(texCache, 0); if (firstUpdate) { glBindTexture(GL_TEXTURE_2D, texture_[0]); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); } glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY); if (firstUpdate) { static const float textureVertices[] = { -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, 1.0 }; static const float textureCoords[] = { 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0 }; glVertexPointer(2, GL_FLOAT, 0, &textureVertices[0]); glTexCoordPointer(2, GL_FLOAT, 0, textureCoords); } glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); firstUpdate = false; 

J'ai fait beaucoup de piratage avec ces API de texture et j'ai finalement réussi à produire un exemple d'écriture d'une texture via la memory en utilisant l'API de cache de texture. Ces API fonctionnent sur le périphérique iOS mais pas sur le simulateur, donc une solution de contournement spéciale était nécessaire (en appelant simplement glTexSubImage2D () explicitement dans le simulateur). Le code nécessaire pour doubler le chargement de la texture fait dans un autre thread pour éviter la mise à jour pendant le rendu. Le code source complet et les résultats de synchronisation sont à opengl_write_texture_cache . Le projet Xcode lié décode les files PNG et les performances sur les anciens appareils iPhone sont donc un peu faibles. Mais le code est libre de faire ce que vous voulez, donc il ne devrait pas être difficile de s'adapter à une autre source de pixels. Pour écrire uniquement une région sale, écrivez uniquement dans cette partie du tampon de memory dans le thread d'arrière-plan.