我需要在使用PowerVR SGX硬件的ARM设备上实现屏幕外渲染纹理。
一切都已完成(使用了pixelbuffers和OpenGL ES 2.0 API)。唯一未解决的问题是glReadPixels
函数很慢。
我不是OpenGL ES的专家,所以我问社区:是否可以将纹理直接渲染到用户空间内存中?或者可能有某种方法来获取纹理内存区域的硬件地址?其他一些技术(EGL扩展)?
我不需要通用解决方案,只需为PowerVR硬件工作一个。
更新:关于'慢功能glReadPixels
'的更多信息。将512x512 RGB纹理数据复制到CPU的内存:
glReadPixels(0, 0, WIDTH, HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, &arr)
需要210毫秒,glReadPixels(0, 0, WIDTH, HEIGHT, GL_BGRA, GL_UNSIGNED_BYTE, &arr)
需要24毫秒(GL_BGRA
不是glReadPixels的标准,它是PoverVR扩展名),memcpy(&arr, &arr2, WIDTH * HEIGHT * 4)
需要5毫秒如果纹理较大,差异也会更大。
答案 0 :(得分:4)
解决。
如何强制OpenVR硬件渲染到用户分配的内存中的方法: http://processors.wiki.ti.com/index.php/Render_to_Texture_with_OpenGL_ES#Pixmaps
一个例子,如何使用它: https://gforge.ti.com/gf/project/gleslayer/
在完成所有这些之后,我可以将渲染图像的速度提高到5毫秒。
答案 1 :(得分:0)
当您调用opengl函数时,您将在渲染队列中排队命令。这些命令由GPU异步执行。当你调用glReadPixels时,cpu必须等待gpu才能完成渲染。所以电话可能正在等待抽奖结束。在大多数硬件上(至少是我工作的硬件),内存由cpu和gpu共享,因此如果渲染完成,读取像素不应该那么慢。
如果您可以等待结果或将其推迟到下一帧,您可能不会再看到该延迟
答案 2 :(得分:0)
Frame buffer objects正是您要找的。它们在OpenGL ES和PowerVr-SGX
上受支持编辑: 请记住,GPU / CPU硬件非常优化,可以在一个方向上将数据从CPU端移动到GPU端。从GPU到CPU的反向路径通常要慢得多(它不是花费硬件资源的优先级)。那么你使用什么技术(例如FBO / getTexImage)你将会遇到这个限制。