gpt4 book ai didi

c# - 访问网格顶点性能问题

转载 作者:行者123 更新时间:2023-11-30 15:53:46 26 4
gpt4 key购买 nike

我遇到了这段代码运行缓慢的问题(执行循环大约需要 250 毫秒)

mesh.triangles.Length 为 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 和一些其他有用的功能,这些功能将加快访问速度,保持一切正常堆栈。 This article是一本有趣的读物,在 Unity catch 时会很有用。

编辑:如果您的网格没有改变(这很可能),那么您可以预定义一个包含您需要的确切顶点的数组。然后您还只需要增加一个变量。这是一个极端的微观优化。这可能有助于 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++ ];
}
}

关于c# - 访问网格顶点性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51855127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com