为什么glReadPixels这么慢,还有别的选择吗?

分类: 365投注入口 时间: 2026-01-07 14:12:16 作者: admin 阅读: 5486

我需要对每一个帧进行截图,我需要非常高的性能(我正在使用freeGlut)。我想出来的是在glutIdleFunc(thisCallbackFunction)里面可以这样做

代码语言:javascript复制GLubyte *data = (GLubyte *)malloc(3 * m_screenWidth * m_screenHeight);

glReadPixels(0, 0, m_screenWidth, m_screenHeight, GL_RGB, GL_UNSIGNED_BYTE, data);

// and I can access pixel values like this: data[3*(x*512 + y) + color] or whatever它确实有效,但我有一个很大的问题,它真的很慢。当我的窗口是512x512时,当只呈现多维数据集时,它的运行速度不会超过每秒90帧,如果没有这两行,它将以6500 FPS运行!如果我们将它与irrlicht图形引擎进行比较,我就可以做到这一点。

代码语言:javascript复制// irrlicht code

video::IImage *screenShot = driver->createScreenShot();

const uint8_t *data = (uint8_t*)screenShot->lock();

// I can access pixel values from data in a similar manner here和512x512窗口运行在400 FPS,即使一个巨大的网格(地震3地图)加载!考虑到我正在使用openGL作为irrlicht内部的驱动程序。在我缺乏经验的人看来,glReadPixels似乎在将每个像素数据从一个地方复制到另一个地方,而(uint8_t*)screenShot->lock()只是在复制指向已经存在的数组的指针。我可以使用freeGlut做类似于后者的事情吗?我希望它比irrlicht快。

请注意,irrlicht也使用openGL (嗯,它还提供了directX和其他选项,但在我前面给出的示例中,我使用了openGL,顺便说一下,与其他选项相比,它是最快的)

相关文章

苹果手机的送话器在手机哪个位置

365流水不足无法提款 · 09-12 阅读 6946

华为Mate 40和苹果iPhone 12选哪个?读完就懂了

365流水不足无法提款 · 10-07 阅读 2602

电脑文件损坏怎么办?这些修复技巧你需要知道!

365投注入口 · 08-26 阅读 3546