优化XNA上的颜色操作

Pio*_*trK 5 c# optimization xna profiling

我正在分析我简单的2D XNA游戏.我发现整个运行时间的4%是通过将两个颜色加在一起的简单操作来实现的,其中一个首先乘以浮点数.

我需要每帧调用这个方法rogulthy 2000次(对于地图上的每个tile),这给了我每秒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));

    }
Run Code Online (Sandbox Code Playgroud)

编辑:正如迈克尔斯图姆所建议的那样:

    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));
    }
Run Code Online (Sandbox Code Playgroud)

这将使用时间从4%降低到2.5%

Mik*_*vey 1

我的第一个问题是,为什么是浮点数?如果您只是缩放颜色以使其褪色,则不需要太多的精度。例子:

int factorTimes256;
tile.Color.R = Math.Max(255, tile.Color.R + (color.R * factorTimes256) / 256);
// same for G and B
Run Code Online (Sandbox Code Playgroud)

换句话说,将因子表示为 0 到 256 之间的整数,并对整数进行所有计算。您不需要比 8 位更高的精度,因为结果只有 8 位。

我的第二个问题是,你是说这段代码中你从 4% 变成了 2.5% 吗?那是很小的。使用仅进行检测或对程序计数器进行采样的分析器的人们通常会对这样的小改进感到满意。我敢打赌,你还有其他需要花费更多时间的事情正在发生,你可以攻击它们。这是我的意思的一个例子。