首页 > 解决方案 > 创建新的 Qt OpenGL 纹理似乎比重用旧纹理更快

问题描述

我一直在使用 Qt 和 OpenGL 开发 Game Boy 模拟器。我对 Qt 和 OpenGL 都很陌生。它处于相当稳定的状态,我从 OpenGL 例程中删除了一些我认为是浪费的代码。我有一个由 Qt 信号每秒调用大约 60 次的例程,以更新模拟屏幕的 OpenGL 纹理。我将其更改为仅使用新屏幕缓冲区设置纹理数据。我遇到的问题是,留下破坏和创建新纹理的浪费代码以某种方式比仅设置新数据运行得更快。这就是我所拥有的:

void OpenGlWidget::updateEmulatedScreen(uint32_t *screenData) {
    emulatedScreenTexture->destroy();
    emulatedScreenTexture->create();
    emulatedScreenTexture->setFormat(QOpenGLTexture::RGBA8_UNorm);
    emulatedScreenTexture->setSize(EMULATED_SCREEN_RESOLUTION_X, EMULATED_SCREEN_RESOLUTION_Y);
    emulatedScreenTexture->setMinMagFilters(QOpenGLTexture::Nearest, QOpenGLTexture::Nearest);
    emulatedScreenTexture->setWrapMode(QOpenGLTexture::ClampToEdge);
    emulatedScreenTexture->allocateStorage();

    emulatedScreenTexture->setData(QOpenGLTexture::PixelFormat::RGBA, QOpenGLTexture::PixelType::UInt32_RGBA8, screenData);
    this->update();
}

我把它改成这样:

void OpenGlWidget::updateEmulatedScreen(uint32_t *screenData) {
    emulatedScreenTexture->setData(QOpenGLTexture::PixelFormat::RGBA, QOpenGLTexture::PixelType::UInt32_RGBA8, screenData);
    this->update();
}

对我来说,这似乎比每次都破坏和创建新纹理要有效得多,但它不知何故大大减慢了仿真速度。我已经测试了多次而没有更改任何其他内容,并且每次添加破坏/创建都会加快速度。我错过了什么吗?每次只设置数据实际上会更糟吗?

标签: c++qtopenglemulationgameboy

解决方案


推荐阅读