OpenGL 程式設計/效能
外觀
一個常見的陷阱是過分痴迷於最佳化,以至於在微不足道的最佳化上花費大量的編碼時間,同時使程式碼複雜化,並使其難以除錯。
確保您在有證據證明受影響的程式碼確實減慢了應用程式速度時進行最佳化。進行測量。在不同的用例和可能不同的硬體中進行比較。
此外,我們建議在實現新功能時,首先儘可能清晰地編寫您的第一個版本,並在功能正常工作後在第二步中進行最佳化。
在應用程式中衡量效能的一種常見方法是使用 FPS(每秒幀數)。但是,由於 FPS 本身的定義(幀 / 1 秒),它並不能完全傳達效能,因為它是非線性的。網上有許多頁面完全描述了這一點,但基本思想是:FPS 的線性變化不會導致實際效能的線性變化。從 900 FPS 下降 450 FPS 大約是 1 毫秒的額外時間,但從 60 FPS 下降 5 FPS 大約是 1 毫秒的額外時間。效能下降的程度與 FPS 損失的程度成反比,因此當 FPS 趨向於 0 時,執行時間開始失控地快速增長。然而,您只看到 FPS 的線性變化,因此您只是聳聳肩。
相反,您應該使用幀時間,或者渲染 1 幀所需的時間。雖然這似乎違反直覺,但它提供了一種可靠的方法來衡量程式碼是否會導致瓶頸。
以下是一段簡單的程式碼,可以在控制檯中顯示每幀花費的時間(以毫秒為單位)
/* Global */
static unsigned int fps_start = 0;
static unsigned int fps_frames = 0;
/* init_resources() */
fps_start = glutGet(GLUT_ELAPSED_TIME);
/* idle() */
/* FPS count */
{
fps_frames++;
int delta_t = glutGet(GLUT_ELAPSED_TIME) - fps_start;
if (delta_t > 1000) {
cout << delta_t / fps_frames << endl;
fps_frames = 0;
fps_start = glutGet(GLUT_ELAPSED_TIME);
}
}
通常,OpenGL 被配置為在推送新的顏色緩衝區之前等待物理螢幕的垂直重新整理。
- 這可以防止撕裂,這是一種混合了部分先前緩衝區和部分新緩衝區的視覺偽像。
- 在視覺上,沒有必要顯示超過螢幕能夠處理的幀數,通常是 60-75Hz(取決於螢幕)。
- 這節省了資源,例如電池。
但是,這意味著即使我們可以顯示 200 FPS,我們的應用程式也將被限制在 60-75 FPS,這使得測量效能變得困難。
在這種情況下,停用垂直同步可能很有用。
- 您的顯示卡驅動程式可能附帶實用程式來啟用和停用它。
- 使用 Mesa,您可以使用
vblank_mode=0啟動應用程式,或在~/.drirc中更永久地配置此行為;一些早期版本存在錯誤,因此您可能需要嘗試兩種方法。
請參閱 模板緩衝區 部分中的效能提示。
瀏覽和下載 完整的程式碼 