分析頂點格式

您可以利用影格剖析,診斷一些可能與頂點相關的效能問題。使用「Commands」(指令) 窗格,即可查看遊戲在特定影格中執行的所有繪製呼叫,以及每次繪製呼叫繪製的基本呼叫數。這可以估計在單一影格中提交的端點總數。

glDrawElements 呼叫的影格剖析檢視畫面,懸停即可查看繪製呼叫參數的詳細資料
圖 1 單一 glDrawElements 呼叫的影格剖析檢視畫面,顯示繪製了 2,718 個三角形基元

Vertex 屬性壓縮

遊戲可能會遇到的其中一個常見問題,就是平均頂點尺寸過大。如果提交的頂點數量達到較高的平均頂點大小,GPU 讀取作業時就會產生較大的頂點記憶體讀取頻寬。

如要觀察特定繪製呼叫的頂點格式,請完成下列步驟:

  1. 選取所需的繪圖通話。

    這可以是一般的場景繪製呼叫、包含大量端點的繪製呼叫、複雜字元模型的繪製呼叫,或其他其他類型的繪製呼叫。

  2. 前往「Pipeline」窗格,然後按一下「IA」取得輸入組合。這會定義傳入 GPU 的頂點格式。

  3. 觀察一系列屬性及其格式;例如,R32G32B32_SFLOAT 是 3 元件的 32 位元帶正負號浮點值。

繪製呼叫輸入組件的影格剖析檢視畫面,包含未壓縮頂點屬性
圖 2. 繪製呼叫的輸入組合,採用未壓縮的屬性產生 56 個位元組的頂點大小

頂點屬性經常可以壓縮,並盡量減少繪製的模型品質。我們特別建議您採取以下做法:

  • 將頂點位置壓縮為半精度 16 位元浮點值
  • 將 UV 紋理座標壓縮為 16 位元無正負號整數 Ushort
  • 透過四元數編碼法線、正切和雙面向量來壓縮切線空間

其他屬性也可能會依個案情況考慮至較低精確度類型。

頂點串流分割

您也可以調查頂點屬性串流是否正確分割。在行動裝置 GPU 等圖塊轉譯架構上,系統會先在繫結傳遞中使用頂點位置,建立每個圖塊處理的基本特徵分塊。如果頂點屬性與單一緩衝區交錯,所有頂點資料都會讀取到快取以進行繫結,即使只使用頂點位置亦然。

為減少頂點讀取記憶體頻寬並提升快取效率,並減少繫結傳遞耗費的時間,頂點資料應拆分為兩個不同的串流,一個用於頂點位置,另一個則用於所有其他頂點屬性。

如何調查頂點屬性是否正確分割:

  1. 選取所需的繪圖通話,並記下繪製通話號碼。

    這可以是一般的場景繪製呼叫、包含大量端點的繪製呼叫、複雜字元模型的繪製呼叫,或其他其他類型的繪製呼叫。

  2. 前往「Pipeline」窗格,然後按一下「IA」取得輸入組合。這會定義傳入 GPU 的頂點格式。

  3. 觀察頂點屬性的繫結;通常這些屬性可能會線性增加 (0、1、2、3 等),但並非一定如此。頂點位置通常是所列的第一個頂點屬性。

  4. 在「State」窗格中找出 LastDrawInfos,然後展開相符的繪製呼叫號碼。然後展開這個繪製呼叫的 BoundVertexBuffers

  5. 觀察指定繪製呼叫期間繫結的頂點緩衝區,索引與稍早的頂點屬性繫結相符。

  6. 展開繪製呼叫的頂點屬性繫結,然後展開緩衝區。

  7. 觀察緩衝區的 VulkanHandle,代表端點資料來源的基礎記憶體。如果 VulkanHandle 不同,表示屬性來自不同的基礎緩衝區。如果 VulkanHandle 相同,但偏移值較大 (例如大於 100),則屬性可能依然來自不同的子緩衝區,但需要進一步調查。

繪製呼叫輸入組合的影格剖析檢視畫面,以及顯示繫結頂點緩衝區的狀態
圖 3:繪製呼叫的輸入組合,右側狀態面板顯示繫結為 0 和 1 的屬性、頂點位置和正常屬性,共用單一基礎緩衝區

如要進一步瞭解頂點串流分割,以及如何在不同遊戲引擎上解析端點,請參閱我們的網誌文章