【发布时间】:2010-12-28 03:15:48
【问题描述】:
我正在分析我的简单 2D XNA 游戏。我发现整个运行时间的 4% 是通过将两个 Colors 相加的简单操作占用的,其中一个先乘以 float。
我需要每帧调用这个方法 rogulthy 2000 次(对于地图上的每个图块),这给了我每秒 120000 次 XNA 的 60 fps。即使是单个呼叫的最小提升也会产生巨大的速度影响。然而我只是不知道我怎样才能使它更有效
private void DoColorCalcs(float factor, Color color)
{
int mul = (int)Math.Max(Math.Min(factor * 255.0, 255.0), 0.0);
tile.Color = new Color(
(byte)Math.Min(tile.Color.R + (color.R * mul / 255), 255),
(byte)Math.Min(tile.Color.G + (color.G * mul / 255), 255),
(byte)Math.Min(tile.Color.B + (color.B * mul / 255), 255));
}
编辑:正如 Michael Stum 所建议的:
private void DoColorCalcs(float factor, Color color)
{
factor= (float)Math.Max(factor, 0.0);
tile.Color = new Color(
(byte)Math.Min(tile.Color.R + (color.R * factor), 255),
(byte)Math.Min(tile.Color.G + (color.G * factor), 255),
(byte)Math.Min(tile.Color.B + (color.B * factor), 255));
}
这将时间使用率从 4% 降低到 2.5%
【问题讨论】:
-
您要查找的词是优化,而不是优化。 :)
-
听起来很多人都在呼吁一个简单的 2D 游戏。你不能改变整体算法吗?通过例如缓存结果还是避免每帧都做所有事情?
-
我需要重新计算图块的动态光(我的照明模型包括光闪烁,它会以 Sin(time)*0.1 的速率改变每帧中给定图块的光强度)
-
您是否需要提高效率?现在的表现真的有问题吗?你刚才说它只需要总执行时间的 4%。这意味着您的“巨大”速度影响最多将是 4%。这意味着您的应用可能以 62.4 FPS 而不是 60 FPS 运行。这真的值得付出努力吗?
-
您可以尝试将您的图块分成 2 (4, 8) 个组并创建多个线程 - 每个线程计算一个图块组的颜色。因此,您可以使用您的处理器提供的所有内核。
标签: c# optimization profiling xna