2010-01-16 62 views
6

我現在想了很長一段時間來優化我的遊戲幀率,而沒有真正取得進展。我正在運行最新的iPhone SDK並擁有iPhone 3G 3.1.2設備。iPhone的openGLES性能調整

我調用角落找尋150 drawcalls,總共渲染約1900三角形(所有對象都使用兩個texturelayers和多紋理紋理化。最紋理來自存儲在PVRTC 2bpp壓縮紋理相同textureAtlasTexture)。 這使我的手機呈現在30 fps的周圍,這對我來說似乎太低了,只有1900個三角形。

我嘗試了很多事情來優化性能,包括將對象組合在一起,轉換CPU上的頂點並將它們渲染成單個drawcall。這個字節8個drawcalls(作爲oposed到150 drawcalls),但性能差不多(fps下降到大約26fps)

我使用存儲在交錯數組中的32byte頂點(12bytes位置,12bytes normals,8bytes uv) 。我正在渲染triangleLists,頂點按TriStrip順序排列。

我做了一些分析,但我不知道如何解釋它。

  1. 儀器採樣 使用儀器和採樣yelds這樣的結果: http://neo.cycovery.com/instruments_sampling.gif 告訴我說了很多時間在「mach_msg_trap」是花。我搜索了它,似乎這個函數被稱爲等待一些其他的東西。但等待什麼?

  2. 儀器的OpenGL 儀器符合OpenGL模塊yelds這樣的結果: http://neo.cycovery.com/intstruments_openglES_debug.gif 但在這裏,我真的不知道這些數字告訴我

  3. 鯊魚分析: 與鯊魚卻沒有告訴剖析我不到多少: http://neo.cycovery.com/shark_profile_release.gif 數量最多爲10%,由DrawTriangles花 - 和所有的剩餘在非常小的比例的功能花了

任何人都可以告訴我還有什麼可以做的,以找出瓶頸,並可以幫助我解釋這些分析信息?

非常感謝!

回答

0

我遺憾的是沒有精通OpenGL的,但這裏有一些事情我從三個結果中脫穎而出:

1)從採樣儀器,你可能有某種背景的網絡連接去?

2)呈現的利用率對我來說似乎很低(儘管我不知道如何改善它們)。 3)雖然10%似乎很低,但這似乎是一個很好的攻擊點 - 但是幾乎同樣懷疑在memcpy中花費了很多時間。另外ValidateState的數量也很大,可能會讓你失望。

工具明智我認爲您使用正確的工具來檢查性能,您只需要更多地考慮這些對您的應用程序意味着什麼。

1

你可能是CPU綁定的。 OpenGL ES儀器中的tiler /渲染器利用率統計數據表明,以20-30 fps渲染時,GPU的佔空比在20-30%之間,這表明如果饋送足夠快,GPU可以以60 fps運行。看起來好像有幾件事可以通過儀器和鯊魚獲取更多信息來了解更多信息:

默認情況下,採樣器顯示每個線程的每個採樣,這意味着創建了大部分空閒的幫助線程通過系統框架將支配你的觀點。爲了更好地瞭解CPU的實際工作情況,請確保顯示詳細視圖(左下角的第三個按鈕),並將樣本透視圖更改爲運行樣本時間,以排除線程空閒/阻塞的樣本。

我從你的應用程序本身沒有看到鯊魚蹤跡中的任何樣本。這可能是因爲你的代碼速度足夠快,不會出現在熱門函數列表中的任何地方,但也可能是因爲Shark無法爲你的應用程序找到符號。您可能需要在其首選項中配置搜索路徑,或者手動將Shark指向您的應用程序二進制文件。此外,Shark默認顯示按照CPU時間消耗的順序排列的函數列表。將視圖更改爲更像常規調用樹的視圖可能會很有用,因此您可以直觀地瞭解整個渲染循環如何花費時間。要做到這一點,請將右下角的視圖選項更改爲「樹(自上而下)」(如果您在這裏沒有看到您的應用程序名稱或功能,那麼Shark肯定會丟失您的符號。)

0

沒有完整的資料來源,很難確切地說出發生了什麼。儀器跟蹤顯示20%渲染利用率,這有點低。這可能意味着你是CPU綁定的。但是,如果是這種情況,我期望在第一個跟蹤中看到更多特定於應用的採樣點。

我的建議是推出自己的計時課程。事情是這樣的(C++):

#include <sys/time.h> 

class Timer 
{ 
public: 
    Timer() 
    { 
     gettimeofday(&m_time, NULL); 
    } 
    void Reset() 
    { 
     gettimeofday(&m_time, NULL); 
    } 
    // returns time since construction or Reset in microseconds. 
    unsigned long GetTime() const 
    { 
     timeval now; 
     gettimeofday(&now, NULL); 
     unsigned long micros = (now.tv_sec-m_time.tv_sec)*1000000+ 
           (now.tv_usec-m_time.tv_usec); 
     return micros; 
    } 
    protected: 
     timeval m_time; 
}; 

時間你的代碼段確切地知道你的時間被消耗。

另一個快速解決方法是禁用Thumb指令集。這可以幫助您的浮點性能提高20%或更多,但是會犧牲可執行文件的大小。

0

如果您使用glFlush或glFinish,請刪除所有這些。