Быстрый способ преобразования цвета [] в байт [] - PullRequest
1 голос
/ 17 января 2020

Быстрое копирование массива Color32 [] в массив байтов []

Я уже видел, тихий подобный вопрос.

Но я хочу преобразовать массив color [] в байты []

private byte[] color2ByteArray(Color[] colors)
{
    int len = colors.Length;

    byte[] result = new byte[len * 3];

    int index = 0;

    for (int i = 0; i < len; i++)
    {
        result[index++] = (byte)(colors[i].r * 255);

        result[index++] = (byte)(colors[i].g * 255);

        result[index++] = (byte)(colors[i].b * 255);
    }

    return result;
}

Чтобы получить правильное значение цвета и преобразовать массив byte []. Я должен умножить цвет на 255.

Я видел много постов о Marshal.copy

Но я не знаю, как изменить его, чтобы сделать его быстрее

1 Ответ

1 голос
/ 17 января 2020

Тебе все равно придется здесь делать математику. есть несколько вещей, которые могут помочь, хотя:

  • избегайте подъема len для for l oop, но используйте colors.Length напрямую - вкл некоторые JIT / AOT, это помогает исключить проверки l oop bounds (for(int i = 0 ; i < someArray.Length ; i++) распознается как безопасный обход массива)
  • извлекает цвет только один раз, то есть var color = colors[i] или даже ref Color color = ref colors[i] в недавнем C#
  • возможно рассмотрим приведение Vector, позволяющее вам выполнять векторизованное умножение; то есть var vec = 255 * (Vector4)colors[i];, затем просто приведите 3 значения из Vector4, когда вы их извлекаете

Кроме того, если важна скорость, я бы не стал выделять здесь массив; опции:

  • передать в целевой массив для заполнения
  • передать в целевой span для заполнения
  • использовать арендованный массив, возможно, возвращая пользовательский IDisposable, который представляет сегмент аренды (я могу go более подробно при необходимости)
...