CVOpenGLESTextureCache против glTexSubImage2D на iOS

Мое приложение OpenGL использует OpenGL для рендеринга текстуры в полноэкранном режиме и регулярно обновляет ее часть. Пока что яЯ использовал glTexImage2D, чтобы выдвинуть мою исходную текстуру, а затем я обновил грязные области с помощью glTexSubImage2D. Для этого ям с использованием одиночной буферизации. Это хорошо работает.

Я видел, что может быть другой способ добиться того же, используя CVOpenGLESTextureCache. Текстуры, хранящиеся в кэше текстур, ссылаются на CVPixelBuffer. Я'Я хотел бы знать, смогу ли я изменить эти кэшированные текстуры. Я пытался воссоздать CVOpenGLESTexture для каждого обновления, но это резко снижает частоту кадров (неудивительно, ведь ям не указав грязный регион нигде). Может быть, я совершенно не понял вариант использования этого кеша текстур.

Может ли кто-нибудь дать какое-нибудь руководство?

ОБНОВЛЕНИЕ: вот код, который ям с помощью. Первое обновление работает отлично. Последующие обновления нет (ничего не происходит). Между каждым обновлением я изменяю необработанное растровое изображение.

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;

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

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