如何优化此像素不透明度计算?

时间:2011-03-17 09:22:18

标签: c# .net performance optimization xna

我有用于计算像素不透明度的C#代码,它在XNA中使用,我如何才能提高它的性能?

    public static uint GetPixelForOpacity(uint pixelBackground, uint pixelForeground, uint pixelCanvasAlpha)
    {
        byte surfaceR = (byte)((pixelForeground & 0x00FF0000) >> 16);
        byte surfaceG = (byte)((pixelForeground & 0x0000FF00) >> 8);
        byte surfaceB = (byte)((pixelForeground & 0x000000FF));

        byte sourceR = (byte)((pixelBackground & 0x00FF0000) >> 16);
        byte sourceG = (byte)((pixelBackground & 0x0000FF00) >> 8);
        byte sourceB = (byte)((pixelBackground & 0x000000FF));

        uint newR = sourceR * pixelCanvasAlpha / 256 + surfaceR * (255 - pixelCanvasAlpha) / 256;
        uint newG = sourceG * pixelCanvasAlpha / 256 + surfaceG * (255 - pixelCanvasAlpha) / 256;
        uint newB = sourceB * pixelCanvasAlpha / 256 + surfaceB * (255 - pixelCanvasAlpha) / 256;

        return (uint)255 << 24 | newR << 16 | newG << 8 | newB;
    }

3 个答案:

答案 0 :(得分:3)

  1. 使用premultiplied alpha
  2. 制作视频卡正是为了加速这样的操作。将像素数据放在Texture2D中,并使用适当的混合模式将其绘制到屏幕上。这将更快,更快。或者如果您不想立即在屏幕上显示redirect your rendering到另一个纹理。

答案 1 :(得分:1)

pixelCanvasAlpha / 256替换为pixelCanvasAlpha >> 8。不要用整数类型除以2的幂,移位总是更快。此外,unchecked应该有所帮助。

答案 2 :(得分:0)

我对此表示怀疑,但bitwise not可能比255-n更快

uint newR = (sourceR * pixelCanvasAlpha + surfaceR * (uint)(byte)~pixelCanvasAlpha) >> 8;

uint newR = (sourceR * pixelCanvasAlpha + surfaceR * ~pixelCanvasAlpha & 0x000000FF) >> 8;

要知道的唯一方法是进行基准测试。