您可以利用影格剖析,診斷一些可能與頂點相關的效能問題。使用「Commands」(指令) 窗格,即可查看遊戲在特定影格中執行的所有繪製呼叫,以及每次繪製呼叫繪製的基本呼叫數。這可以估計在單一影格中提交的端點總數。
![glDrawElements 呼叫的影格剖析檢視畫面,懸停即可查看繪製呼叫參數的詳細資料](https://developer.android.com/static/images/agi/vertex-formats-images/sample_drawcall.png?authuser=0000&hl=zh-tw)
glDrawElements
呼叫的影格剖析檢視畫面,顯示繪製了 2,718 個三角形基元Vertex 屬性壓縮
遊戲可能會遇到的其中一個常見問題,就是平均頂點尺寸過大。如果提交的頂點數量達到較高的平均頂點大小,GPU 讀取作業時就會產生較大的頂點記憶體讀取頻寬。
如要觀察特定繪製呼叫的頂點格式,請完成下列步驟:
選取所需的繪圖通話。
這可以是一般的場景繪製呼叫、包含大量端點的繪製呼叫、複雜字元模型的繪製呼叫,或其他其他類型的繪製呼叫。
前往「Pipeline」窗格,然後按一下「IA」取得輸入組合。這會定義傳入 GPU 的頂點格式。
觀察一系列屬性及其格式;例如,
R32G32B32_SFLOAT
是 3 元件的 32 位元帶正負號浮點值。
![繪製呼叫輸入組件的影格剖析檢視畫面,包含未壓縮頂點屬性](https://developer.android.com/static/images/agi/vertex-formats-images/sample_bigvertex.png?authuser=0000&hl=zh-tw)
頂點屬性經常可以壓縮,並盡量減少繪製的模型品質。我們特別建議您採取以下做法:
- 將頂點位置壓縮為半精度 16 位元浮點值
- 將 UV 紋理座標壓縮為 16 位元無正負號整數 Ushort
- 透過四元數編碼法線、正切和雙面向量來壓縮切線空間
其他屬性也可能會依個案情況考慮至較低精確度類型。
頂點串流分割
您也可以調查頂點屬性串流是否正確分割。在行動裝置 GPU 等圖塊轉譯架構上,系統會先在繫結傳遞中使用頂點位置,建立每個圖塊處理的基本特徵分塊。如果頂點屬性與單一緩衝區交錯,所有頂點資料都會讀取到快取以進行繫結,即使只使用頂點位置亦然。
為減少頂點讀取記憶體頻寬並提升快取效率,並減少繫結傳遞耗費的時間,頂點資料應拆分為兩個不同的串流,一個用於頂點位置,另一個則用於所有其他頂點屬性。
如何調查頂點屬性是否正確分割:
選取所需的繪圖通話,並記下繪製通話號碼。
這可以是一般的場景繪製呼叫、包含大量端點的繪製呼叫、複雜字元模型的繪製呼叫,或其他其他類型的繪製呼叫。
前往「Pipeline」窗格,然後按一下「IA」取得輸入組合。這會定義傳入 GPU 的頂點格式。
觀察頂點屬性的繫結;通常這些屬性可能會線性增加 (0、1、2、3 等),但並非一定如此。頂點位置通常是所列的第一個頂點屬性。
在「State」窗格中找出
LastDrawInfos
,然後展開相符的繪製呼叫號碼。然後展開這個繪製呼叫的BoundVertexBuffers
。觀察指定繪製呼叫期間繫結的頂點緩衝區,索引與稍早的頂點屬性繫結相符。
展開繪製呼叫的頂點屬性繫結,然後展開緩衝區。
觀察緩衝區的
VulkanHandle
,代表端點資料來源的基礎記憶體。如果VulkanHandle
不同,表示屬性來自不同的基礎緩衝區。如果VulkanHandle
相同,但偏移值較大 (例如大於 100),則屬性可能依然來自不同的子緩衝區,但需要進一步調查。
![繪製呼叫輸入組合的影格剖析檢視畫面,以及顯示繫結頂點緩衝區的狀態](https://developer.android.com/static/images/agi/vertex-formats-images/sample_attributestreams.png?authuser=0000&hl=zh-tw)
如要進一步瞭解頂點串流分割,以及如何在不同遊戲引擎上解析端點,請參閱我們的網誌文章。