Как я могу оптимизировать этот расчет непрозрачности пикселей? - PullRequest
2 голосов
/ 17 марта 2011

У меня есть код 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 ]

3 голосов
/ 17 марта 2011
  1. Использование предварительно умноженного альфа .
  2. Видеокарты созданы именно для ускорения подобных операций.Поместите ваши данные пикселей в Texture2D и нарисуйте их на экране в соответствующем режиме наложения.Это будет намного, намного быстрее.Или, если вы не хотите, чтобы он сразу отображался на экране, перенаправьте ваш рендеринг на другую текстуру.
1 голос
/ 17 марта 2011

Заменить pixelCanvasAlpha / 256 на pixelCanvasAlpha >> 8. Не делите на целые два типа целых чисел, сдвиг всегда быстрее. Также, unchecked должно помочь.

0 голосов
/ 17 марта 2011

Я сомневаюсь в этом, но bitwise not может быть быстрее, чем 255-н

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

или

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

Единственный способ узнать - это сравнительный тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...