簡體   English   中英

關於在iPhone上加速OpenGL ES 1.1的建議

[英]Advice on speeding up OpenGL ES 1.1 on the iPhone

我正在開發一款嚴重依賴OpenGL的iPhone App。 現在它在iPhone 3G上運行有點慢,但在新的32G iPod Touch上看起來很快。 我認為這與硬件有關。 無論如何,我想讓iPhone的性能與iPod Touch的性能相似。 我相信我在OpenGL中做了很多次優化的事情,我想知道哪些改進會給我帶來最大的好處。

我的場景渲染是這樣的:

  • 重復35次
    • glPushMatrix
    • glLoadIdentity
    • glTranslate
    • 重復7次
      • glBindTexture
      • glVertexPointer
      • glNormalPointer
      • glTexCoordPointer
      • glDrawArrays(GL_TRIANGLES,...)
    • glPopMatrix

我的頂點,法線和紋理坐標已經交錯。

那么,我應該采取什么措施加快速度呢? 你先做什么步驟?

我的第一個想法是通過使用紋理圖集來消除所有那些glBindTexture()調用。

一些更有效的矩陣運算怎么樣? 我理解gl *()版本效率不高。

維多利亞州立大學呢?

更新

有8260個三角形。 紋理大小為64x64 png。 有58種不同的紋理。

我沒有運行樂器。

更新2

在iPhone 3G上運行OpenGL ES儀器后,我發現我的Tiler利用率在90-100%范圍內,我的渲染利用率在30%范圍內。

更新3

紋理圖集對問題沒有明顯的影響。 使用范圍仍然如上所述。

更新4

將我的Vertex和Normal指針轉換為GL_SHORT似乎可以提高FPS,但Tiler利用率在很多時候仍然在90%的范圍內。 我仍在使用GL_FLOAT作為紋理坐標。 我想我可以將它們擊倒到GL_SHORT並為每個頂點節省四個字節。

更新5

將我的紋理坐標轉換為GL_SHORT會產生另一個性能提升。 我現在一直都超過30 FPS。 Tiler利用率仍然在90%左右,但經常在70-80%的范圍內下降。 渲染器利用率徘徊在50%左右。 我想這可能與從GL_TEXTURE矩陣模式縮放紋理坐標有關。

我還在尋求其他改進。 我想接近40 FPS,因為這就是我的iPod Touch所帶來的,它在那里如絲般順滑。 如果有人還在關注,我還能選擇哪些其他低調的水果?

由於平鋪器利用率仍然高於90%,您可能仍然受頂點吞吐量限制。 渲染器利用率較高,因為GPU渲染的幀數較多。 如果您的主要關注點是提高舊設備的性能,那么關鍵還在於減少每個三角形所需的頂點數據量。 這有兩個方面:

減少每個頂點的數據量 :現在所有的頂點屬性都已經是GL_SHORT ,接下來要做的就是找到一種方法,使用更少的屬性或組件來做你想做的事。 例如,如果您可以在沒有鏡面高光的情況下生活,使用DOT3照明代替OpenGL ES固定功能照明將替換您的3條短褲(+ 1短填充),用於具有2條短褲的法線,以獲得額外的紋理坐標。 作為額外的獎勵,您可以逐像素地點亮模型。

減少每個三角形所需的頂點數量 :使用索引三角形繪制時,應確保對索引進行排序以便最大程度地重用。 通過Imagination Technologies的PVRTTriStrip工具運行幾何圖形可能是您最好的選擇。

如果你只有58種不同的64x64紋理,紋理圖集似乎是一個好主意,因為它們都適合單個512x512紋理......如果你不依賴紋理包裹模式,我當然至少會嘗試這個。

你的紋理是什么格式的? 您可以嘗試使用壓縮的PVRTC紋理; 我認為Tiler的負載較少,即使對於每像素2位紋理,我也對圖像質量感到驚喜。 (對於自然圖像有好處,如果你正在做一個看起來像8位視頻游戲的東西,那就不好了)

我要做的第一件事是在硬件設備上運行儀器分析,這很慢。 它應該很快向您展示您的特定情況的瓶頸所在。

儀器結果后更新:

這個問題在儀器上有類似的結果,也許這個建議也適用於你的情況(基本上減少數字頂點數據)

圖形編程的最大勝利歸結為:

批處理,批處理,批處理

TextureAtlasing將比你能做的其他任何東西都有更大的不同。 切換紋理就像停止高速列車每次都讓新乘客一樣。

將所有這些紋理組合成一個地圖集,並將繪制調用減少很多。

這個基於Web的工具可能會有所幫助:http: //zwoptex.zwopple.com/

您是否在開發中心查看了“適用於iPhone OS的OpenGL ES編程指南”? 有關於頂點數據和紋理數據的最佳實踐的部分。

您的數據是否格式化為能夠使用三角形條帶?

就努力程度而言,您的修改順序可能是:

  • 減少頂點屬性大小
  • 維也納組織

請注意,執行這些操作時,需要確保組件在其原始對齊方式上對齊,即浮點數或完整整數位於4字節邊界上,短路位於2字節邊界上。 如果你不這樣做,那將會影響你的表現。 通過鍵入您的屬性排序作為結構定義來精神映射它可能會有所幫助,這樣您就可以理智地檢查您的布局和對齊方式。

  • 確保您的數據被剝離以共享頂點
  • 使用紋理圖集來減少紋理交換

要嘗試將紋理轉換為16位RGB565格式,請在Apple的古老Texture2D.m中查看此代碼,搜索kTexture2DPixelFormat_RGB565

http://code.google.com/p/cocos2d-iphone/source/browse/branches/branch-0.1/OpenGLSupport/Texture2D.m

(此代碼加載PNG並在紋理創建時將它們轉換為RGB565;我不知道是否存在RGB565文件格式)

有關PVRTC壓縮紋理的更多信息(看起來比我使用時更好,即使每像素2位),請參閱Apple的PVRTextureLoader示例:

http://developer.apple.com/iPhone/library/samplecode/PVRTextureLoader/index.html

它既有用於在應用程序中加載PVRTC紋理的代碼,也有使用texturetool將.png文件轉換為.pvr文件的說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM