我編寫了一個快速應用程序,以瞭解RenderScript的極限,並發現當達到大約65,000個三角形時,系統根本不會繪製任何附加的三角形。例如,如果我創建了一個包含70,000個三角形的圓柱體,則圓柱體中缺少一個與超過〜65,000個計數的三角形相對應的楔形體。三角形被紋理化,爲了便於編寫應用程序,我只使用了TriangleMeshBuilder
類,因此沒有真正的優化,例如使用trifans或tristrips。硬件是三星Galaxy Nexus。 LogCat報告堆大小約15MB,免費3%。我沒有收到有關圖形系統或RenderScript的錯誤或警告。RenderScript中的最大三角形數
任何人都可以解釋三角形被丟棄的原因嗎?我是否處於RenderScript正在優雅處理的硬件限制?
UPDATE發生在三星銀河NEXUS(4.0.3),三星Galaxy Tab 7.0+(3.2)和摩托羅拉Xoom的(3.2)。全部在大約65,000個三角形的同一點。這些設備中的每一個都有不同的GPU。
UPDATE 2爲了迴應史蒂夫布萊克威爾的見解,我還有一些想法。
710-712行確實將int
索引向下轉換爲short
,因此65536變爲0,正如Steve指出的那樣。另外,757行的「強制轉換」並不像告訴RenderScript最終發送給它的二進制數據的格式那麼簡單。 RenderScript需要將所有數據打包成RenderScript特定的數據類型,稱爲Allocation
,以便從Java移動到RenderScript運行時,並且需要通知數據結構。根據Steve的觀點,這是一個bug,第757行告訴RenderScript將索引數據當作short
(無符號16位),但是它發送了一個32位有符號值(由於沒有檢查而被接受, ,然後只使用較低的16位,因此爲什麼我們在低於該閾值時繪製某些東西,以及在我們走過時連接回第一個索引的三角形)。
子類TriangleMeshBuilder
,看看我是否可以把它接受這些數值都爲整數來增加此限制沒有工作,這使我相信,在深代碼的地方,我們沒有獲得,還有一個額外的參考未簽名的短褲。看起來像唯一的解決辦法是按照Steve的建議添加額外的頂點緩衝區,這與現有的Mesh.AllocationBuilder
類很容易完成。我還會在開發人員環聊中與Google展開討論,以確定這實際上是一個錯誤還是故意。
你有沒有在其他設備上試過這個? –