2014-01-16 90 views
2

我有一个项目,我需要更新纹理的多个区域,并将这些区域同步到openGL的每一帧。我正在使用openGL ES 2.0和iDevices的xcode5项目。glTexSubImage2D慢ios7

要同步那些纹理更改,我使用glTexSubImage2D,可能会为绑定纹理的小区域每帧几百次调用此函数。在运行ios6的iPhone4上进行测试时,此功能足以满足我的需求。

当我在运行ios7的iPad迷你视网膜上进行测试时,它显着停滞。 该档位显示在mach_msg_trap中,由glTexSubImage2D下调用的三个函数显示。

不幸的是我不能发布的配置文件的图像(由于缺乏信誉分),但三个功能从agxuBlitRender调用,占用了CPU的组合86.1%: agxuCreateRenderTarget(38.2%) SubmitPackets(25.5%) agxuReleaseAllRenderTargets(16.2%)

我很感激mach_msg_trap只是意味着线程在等待时正在旋转,但我无法从分析器中确定它正在等待什么。

我最初想知道它是重建mip-maps还是其他一些ios7强制的过程。我没有打开mipmap,虽然根据gl.h中的选项,我可能没有太多选择(即使将它设置为GL_NEAREST,所有TextureMinFilters都是以mipmap为导向的,但可能会默认为GL_NEAREST_MIPMAP_NEAREST if它认为GL_NEAREST无效)。 iPhone4版本使用完全相同的代码的事实可能不是决定性的因素,如果它涉及底层的mipmapping。

虽然我试过每帧只复制一次整个纹理,但当纹理尺寸较大时,如果函数twiddle32x32_32深入到openGL的核心,则每帧会消耗大部分CPU,这会变得明显慢一些。

任何帮助感激地收到。

+0

出于好奇,为什么你需要更新纹理的许多单独的区域,每帧多次?这是你试图重建每一帧的纹理图集? –

+0

@BradLarson我有一个粒子系统,其中许多对象被聚集成更大的块(或再次分割)进行处理。当我收集他们的物理特性时,我还需要收集它们的图形,比如四个小立方体被聚集成一个更大的立方体(等等,立方体越大越大)。所以我需要让小实体的纹理元素一起移动,以便简化为更大的纹理元组,从而随时调整UV。我想这是一种纹理图集,可能会有更简单(更好理解)的方法。如果Mini Retina的工作速度比iPhone4更快:) – Drainboy

回答

1

glTexSubImage2D()在使用PowerVR GPU的所有设备上都非常慢,因为它们的延迟渲染基于tile的设计以及由于旋转。我对Android更熟悉,您可以通过使用EGL Image extensions直接获取指向纹理的虚拟指针并直接访问像素。这通常快4倍。不过,我已经读过,iOS中也有相似的功能。例如:

Using OpenGL ES texture caches instead of glReadPixels to get texture data

+0

感谢Clay,尽管这非常适合从图形方面读取像素数据,而不是写入它。 – Drainboy

0

调用glTexSubImage2D() “数每帧时间” 实在是太差了。你应该退后一步,问自己为什么需要这样做。在任何平台上它都会很慢,因为GPU不是为了支持GPU而设计的。

你在做什么,需要在运行时更新纹理?

如果必须,一种方法是在主存中保留一个纹理副本(作为BGRA或LUMINENCE像素的数组)。在那里进行更新。然后通过一次调用将其上传到GPU。您只应在帧的开头或结尾上传,以最大限度地减少CPU停滞。 (如果GPU当前正在使用该纹理,CPU将会阻塞很长时间)。

+0

肖恩,我很欣赏我所做的是非典型的,如果它不适合我最初的原型,在不太强大的硬件上,我会说“不错的尝试,让我们做点别的事吧”。我的问题(具有完全相同的代码和内容),它足够满足我在iPhone4上的需求,而不是在全新硬件上运行的事实。对于iPad,我现在正在一次调用gTexlSubImage2D(CPU损失太多twiddle32x32_32),同时通过调用gTexlSubImage2D更新每个纹理更改(在代码中的同一点),我想知道为什么要更新iPhone4这是必要的,并尽可能避免。 – Drainboy

+0

具体而言,即使在最糟糕的情况下,我在做的事情占用了iPhone4上CPU的<1%。在iPad迷你视网膜上,坐在mach_msg_trap上占85%以上,而在1-2fps下运行。在相同的情况下,您可能想知道为什么:) – Drainboy

+0

@Drainboy - 我不确定您使用的基于CPU的功能分析将为您提供iOS设备上真实性能的准确表示,因为PowerVR GPU的延期性质。您几乎必须查看从开始到演示到屏幕的整个帧渲染时间,以获取有关渲染性能的任何有意义的数据。然而,你的视网膜iPad mini拥有A7芯片,而最新版本的Xcode有一个新的着色器分析器,它可以为你提供更好的分析信息。你可能想在这里尝试一下。 –