访问网格顶点性能问题



我遇到此代码运行缓慢的问题(执行循环大约 250 毫秒(

网格三角形长度为 8700。

我在最新的 Unity 平台(版本 2018.2.3(上使用 c#。

我怀疑这是因为我在每次迭代的两个数组之间切换,即。 我从三角形中获取一个值,然后查找它的顶点元素。

mesh.triangles是一个整数数组。 mesh.vertices 是 Vector3 的数组。


while (j < mesh.triangles.Length)  
{
m_Particles [currentParticlePos].position =  vertices[mesh.triangles[j]];   
// allocate a particle to every 3rd vertex position.
j = j + 3;
currentParticlePos++;
}

在此处手动强制进行一些微优化可能会对您有所帮助。

首先,mesh.triangles是一个属性,有自己的getter和setter。每个循环你都会得到轻微的性能打击。因此,让我们在循环开始之前将该地址存储为局部变量。

其次,mesh.triangles.Length的价值总是相同的。因此,让我们将其存储在局部变量中,而不是每个循环都调用该属性。

在此之后,您的代码使用vertices [ ],而您的问题指的是mesh.vertices [ ].如果要检查每个循环mesh.vertices [ ],则还需要将其存储在本地。

现在,根据编译器的不同,以下微优化可能已经得到处理。因此,您必须使用计时技术来验证这是否值得。话虽如此,现在让我们看一下代码:

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;
}

作为旁注,虽然它现在对你没有帮助,但 C#7.x 引入了ref struct和其他一些有用的功能,这些功能将加快访问速度,将所有内容保留在堆栈上。这篇文章读起来很有趣,当 Unity 赶上时会很有用。

编辑 :如果您的网格没有改变(这很可能(,您可以预定义您需要的确切顶点数组。然后,您也只需要增加单个变量。这是一个极端的微观优化。这可能有助于 CPU 预取...(在此处插入耸耸肩的表情符号(。

// 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++ ];
}
}

您正在使用mesh但没有修改任何值。在这种情况下,您可以考虑改用sharedMesh。在您的特定情况下,mesh的问题在于,mesh会创建一个副本并将其返回。有了sharedMesh,您就可以摆脱网格的另一个实例的额外开销。查看 mesh 和 sharedMesh 的文档以获取更多信息。

循环运行速度不慢;此循环、Unity 引擎以及您可能拥有或可能没有的任何其他资源为 250 毫秒。

我也遇到了这个问题。如果可能,您应该按照三角形数组指定的顺序预生成顶点数组。否则,您将访问内存中的随机位置,这确实会破坏性能。

相关内容

  • 没有找到相关文章

最新更新