我有一个项目,我需要更新纹理的多个区域,并将这些区域每帧同步到 openGL。我正在将 openGL ES 2.0 与 xcode5 中的 iDevices 项目一起使用。
为了同步这些纹理更改,我使用 glTexSubImage2D,可能每帧调用此函数数百次,用于绑定(bind)纹理的小区域。在运行 ios6 的 iPhone4 上进行测试时,这足以满足我的需求。
当我在运行 ios7 的 iPad Mini Retina 上对其进行测试时,它明显停滞不前。 在 glTexSubImage2D 下调用的三个函数的 mach_msg_trap 中显示了停顿。
很遗憾,我无法发布配置文件的图像(由于缺少信誉点),但这三个函数是从 agxuBlitRender 调用的,总共占用了 86.1% 的 CPU: agxuCreateRenderTarget (38.2%) 提交数据包 (25.5%) agxuReleaseAllRenderTargets (16.2%)
我很欣赏 mach_msg_trap 只是意味着线程在等待时正在旋转,但我无法从分析器确定它在等待什么。
我最初想知道它是否可能是重建 mip-map 或 ios7 强制执行的其他一些过程。我没有打开 mipmap,尽管根据 gl.h 中的选项,我可能没有太多选择(所有 TextureMinFilters 都是面向 mipmap,即使我将其设置为 GL_NEAREST,它可能默认为 GL_NEAREST_MIPMAP_NEAREST 如果它认为 GL_NEAREST 无效)。如果 iPhone4 版本在底层处理 mipmapping,那么它使用完全相同的代码这一事实可能不是决定因素。
虽然我尝试每帧只复制整个纹理一次,但随着纹理尺寸的增大,这会显着变慢,因为函数 twiddle32x32_32 位于 openGL 的核心深处,每帧占用大量 CPU。
p>感谢您的帮助。
glTexSubImage2D() 在所有使用 PowerVR GPU 的设备上都非常慢,因为它们基于延迟渲染图 block 的设计和旋转。我更熟悉 Android,您可以在其中获取指向纹理的虚拟指针并使用 EGL 图像扩展直接访问像素。这通常快 4 倍。但是,我读到 iOS 中也有类似的功能。例如:
Using OpenGL ES texture caches instead of glReadPixels to get texture data
关于ios - ios7上的glTexSubImage2D慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21162688/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |