CVOpenGLESTextureCache vs glTexSubImage2D unter iOS

Meine OpenGL-App verwendet OpenGL, um eine Textur im Vollbildmodus zu rendern und einen Teil davon in regelmäßigen Abständen zu aktualisieren. Bisher habe ich glTexImage2D verwendet, um meine anfängliche Textur zu pushen, und dann habe ich die schmutzigen Regionen mit glTexSubImage2D aktualisiert. Dazu verwende ich die Einzelpufferung. Das funktioniert gut.

Ich habe gesehen, dass es einen anderen Weg gibt, um dasselbe mit CVOpenGLESTextureCache zu erreichen. Die im Textur-Cache enthaltenen Texturen verweisen auf einen CVPixelBuffer. Ich würde gerne wissen, ob ich diese zwischengespeicherten Texturen ändern kann. Ich habe versucht, für jedes Update eine CVOpenGLESTexture neu zu erstellen, aber dies verringert meine Framerate drastisch (nicht überraschend, da ich nirgendwo den Dirty-Bereich spezifiziere). Vielleicht habe ich den Anwendungsfall für diesen Textur-Cache total missverstanden.

Kann jemand eine Anleitung geben?

UPDATE: Hier ist der Code, den ich verwende. Das erste Update funktioniert einwandfrei. Die nachfolgenden Updates nicht (nichts passiert). Zwischen jedem Update ändere ich die rohe Bitmap.

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;

Antworten auf die Frage(1)

Ihre Antwort auf die Frage