c++ - 创建新的 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();
}
对我来说,这似乎比每次都破坏和创建新纹理要有效得多,但它不知何故大大减慢了仿真速度。我已经测试了多次而没有更改任何其他内容,并且每次添加破坏/创建都会加快速度。我错过了什么吗?每次只设置数据实际上会更糟吗?
解决方案
推荐阅读
- java - 为什么在我的方法 onActivityResult 中它没有达到 else if 条件。我想使用 UCrop 将裁剪后的图像保存到 Firebase
- c - 我应该如何制作一个在元素周期表中添加新元素的函数?
- algorithm - 找到包含无向图中给定边的欧拉路径的最小成本(算法)
- python - 使用 python 找到 N^(1/17)
- python - 从充满文件的目录中提取字符串
- azure - 无效或未知密钥:network_security_group_id
- javascript - 如何切换侧边栏?
- node.js - 如何从 Google Maps Direction API 响应中渲染地图?
- json - 在 Google BigQuery 中读取多级重复 JSON 结构数据
- jquery - 无法以 jQuery 形式获取选择值