2014-01-16 64 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有一個新的着色器分析器,它可以爲你提供更好的分析信息。你可能想在這裏嘗試一下。 –