我正在分析我的简单2D XNA游戏。我发现整个运行时间的4%是通过将两种颜色加在一起的简单操作来完成的,其中一种颜色首先乘以浮点数。
我需要将此方法称为每帧2000次(对于 map 上的每个图块),这对于XNA的60 fps每秒可以给我120000次。即使是单次调用的最小提升,也将产生巨大的速度影响。但是我简单地不知道如何使它更有效
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%
最佳答案
我的第一个问题是,为什么要浮点数?如果只是缩放颜色以使其褪色,则不需要太多的精度。例子:
int factorTimes256;
tile.Color.R = Math.Max(255, tile.Color.R + (color.R * factorTimes256) / 256);
// same for G and B
换句话说,将因子表示为0到256之间的整数,并对整数进行所有计算。您不需要8位以上的精度,因为结果只有8位。
我的第二个问题是,您是否说过您将这段代码的使用率从4%提高到2.5%?
那是小。
使用仅执行检测或对程序计数器采样的探查器的人通常会对如此小的改进感到满意。
我敢打赌,您还有其他事情要做,这可能会花费更多时间,您可能会发起攻击。 Here's an example of what I mean.
关于c# - 优化XNA上的色彩处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1929753/