- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个项目,我需要更新纹理的多个区域并将这些区域每一帧同步到 openGL 中。我将 openGL ES 2.0 与 xcode5 中的 iDevices 项目一起使用。
为了同步这些纹理变化,我使用 glTexSubImage2D,对于绑定(bind)纹理的小区域,每帧可能会调用此函数数百次。在运行 ios6 的 iPhone4 上进行测试时,这足以满足我的需求。
当我在运行 ios7 的 iPad Mini Retina 上对其进行测试时,它明显停顿。停顿显示在 mach_msg_trap 中,来自 glTexSubImage2D 下调用的三个函数。
不幸的是,我无法发布配置文件的图像(由于缺少信誉点),但这三个函数是从 agxuBlitRender 调用的,总共占用了 86.1% 的 CPU:agxuCreateRenderTarget (38.2%)提交数据包 (25.5%)agxuReleaseAllRenderTargets (16.2%)
我很欣赏 mach_msg_trap 只是意味着线程在等待时正在旋转,但我无法从分析器中确定它在等待什么。
我最初想知道它是否可能正在重建 mip-maps 或 ios7 强制执行的其他一些进程。我没有打开 mipmap,虽然根据 gl.h 中的选项,我可能没有太多选择(所有 TextureMinFilters 都是面向 mipmap 的,即使我将它设置为 GL_NEAREST,它可能默认为 GL_NEAREST_MIPMAP_NEAREST 如果它认为 GL_NEAREST 无效)。 iPhone4 版本使用完全相同的代码这一事实可能不是它处理底层 mipmap 的决定性因素。
虽然我尝试过每帧只复制一次整个纹理,但随着纹理尺寸变大,这会变得非常慢,因为 openGL 核心的函数 twiddle32x32_32 每帧占用了大部分 CPU。
感谢收到的任何帮助。
最佳答案
glTexSubImage2D() 在所有使用 PowerVR GPU 的设备上都非常慢,这是因为它们基于延迟渲染图 block 的设计和旋转。我更熟悉 Android,您可以在其中获得指向纹理的虚拟指针并使用 EGL 图像扩展直接访问像素。这通常快 4 倍。但是,我了解到 iOS 中也有类似的功能。例如:
Using OpenGL ES texture caches instead of glReadPixels to get texture data
关于ios - glTexSubImage2D 在 ios7 上运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21162688/
当使用 OpenGL 的 glTexSubImage2D 和 glTexSubImage3D 函数时,子图像不等于纹理的实际尺寸,数据指针应该包含打包的数据以匹配实际纹理尺寸还是子图像的尺寸? 例如,
当我使用 glTexImage2D 绑定(bind)我的图像时,它呈现得很好。 首先是片段着色器中的代码: uniform sampler2D tex; in vec2 tex_coord; // m
我是一名优秀的程序员,十分优秀!