2

我正在制作一个基于 2d 瓷砖的游戏。我的一些测试级别很少有瓷砖,有些有 500,000 用于测试目的。运行 Visual Studio 附带的性能分析器会显示瓶颈: 图片必须在这里,它显示了 <code>if (blocks[i].Visible)</code> 如何花费 87% 的时间

需要这么长时间的确切原因是什么?我该如何避免这种情况?

UPD:没关系,我只是遍历整个数组,而不是仅遍历约 200 个可见图块。

4

4 回答 4

2

.Visible 是一个属性。要了解为什么这是一个瓶颈,您需要查看该 getter 的实现。虽然它看起来只是一个简单的布尔值,但它在幕后可能很复杂。

于 2012-04-23T00:43:17.227 回答
2

并不是说评估每个单独的 Visibility 属性/字段会花费很多时间-而是您要执行 500k 次-它加起来。由于这是分析器估计的瓶颈,这意味着绝大多数项目已Visibility设置为 false - 否则您会假设Draw()方法调用将显示为瓶颈。优化这一点的一种方法是分离可见项目并仅对其进行迭代。

于 2012-04-23T00:44:07.417 回答
1

500k是典型场景吗?请记住,根据您的实际需求,复杂性会有很大差异。

如果你真的必须处理 500k 块,我会有第二个可见块列表,或者一个包含这些可见块的数组索引的整数列表。

于 2012-04-23T00:43:57.663 回答
1

为查找具有特定属性的对象而进行的顺序检查意味着运行“n”次迭代的最坏情况,其中“n”是记录总数。这无疑是一个瓶颈。

您可能希望单独保留一组可见项目。

于 2012-04-23T00:44:21.887 回答