3 回答

TA貢獻2037條經(jīng)驗 獲得超6個贊
在這里手動強制進行一些微優(yōu)化可能會對您有所幫助。
首先,mesh.triangles是一個屬性,有自己的 getter 和 setter。每次循環(huán)都會對性能造成輕微影響。因此,讓我們在循環(huán)開始之前將該地址存儲為局部變量。
其次, 的值mesh.triangles.Length始終相同。因此,讓我們將其存儲在局部變量中,而不是在每個循環(huán)中調(diào)用該屬性。
從那以后,您的代碼使用vertices [ ]而您的問題是指mesh.vertices [ ]. 如果您正在檢查mesh.vertices [ ]每個循環(huán),您還需要在本地存儲它。
現(xiàn)在,根據(jù)編譯器的不同,以下微優(yōu)化可能已經(jīng)完成。因此,您必須使用計時技術(shù)來驗證這是否值得。說了這么多,現(xiàn)在讓我們看一下代碼:
int [ ] triangles = mesh.triangles;
int length= triangles.Length;
int [ ] vertices = mesh.vertices;
while (j < length)
{
m_Particles [ currentParticlePos++ ].position = vertices [ triangles [ j ] ];
// allocate a particle to every 3rd vertex position.
j = j + 3;
}
作為旁注,雖然現(xiàn)在對您沒有幫助,但 C#7.x 引入ref struct了一些其他有用的功能,可以加快訪問速度,將所有內(nèi)容保留在堆棧中。這篇文章很有趣,當 Unity 迎頭趕上時會很有用。
編輯:如果您的網(wǎng)格沒有改變(這很可能),您可以預(yù)先定義您需要的確切頂點數(shù)組。然后你也只需要增加一個變量。這是一個極端的微觀優(yōu)化。這可能有助于 CPU 預(yù)取...(在此處插入聳肩表情符號)。
// The mesh. Assigned as you see fit.
Mesh mesh;
// The length of the new vertices array, holding every third vertex of a triangle.
int length = 0;
// The new vertices array holding every third vertex.
Vector3 [ ] vertices;
void Start ( )
{
int [ ] triangles = mesh.triangles;
length = triangles.Length / 3;
vertices = new Vector3 [ length ];
for ( int count = 0; count < length; count++ )
vertices [ count ] = mesh.vertices [ triangles [ count * 3 ] ] ;
}
private void Update ( )
{
int j = 0;
while ( j < length )
{
m_Particles [ j ].position = vertices [ j++ ];
}
}

TA貢獻1848條經(jīng)驗 獲得超2個贊
您正在使用mesh
但沒有修改任何值。在這種情況下,您可以考慮sharedMesh
改用。mesh
在您的特定情況下,問題在于,mesh
創(chuàng)建一個副本并返回它。有了它,sharedMesh
您就可以擺脫網(wǎng)格的另一個實例的額外開銷。查看mesh和sharedMesh的文檔以獲取更多信息。
- 3 回答
- 0 關(guān)注
- 257 瀏覽
添加回答
舉報