2015-11-10 6 views
0

Я создаю приложение для мобильной живописи. У меня есть две текстуры (Texture2D), которая является шаблоном изображения и цветовой картой для него.Unity3d Split Texture2d во время выполнения

Эта цветная карта содержит уникальный цвет для каждой области шаблона, где игрок может рисовать.

Мне нужно иметь несколько других текстур, по одной текстуре на каждый уникальный цвет в цветовой карте.

На данный момент я пытаюсь использовать GetPixels для цветовой карты, и используя словарь, я проверяю каждый пиксель.

Если в этом словаре нет цвета в качестве ключевого значения, создайте новую текстуру с помощью SetPixel, используя координату Если есть цвет в виде ключа, получите текстуру с помощью клавиши и SetPixel с координатами, чтобы получить эта текстура.

Но когда я запускаю это, даже мой компьютер начинает сильно отставать, никаких слов о мобильных телефонах.

Есть ли более эффективный способ?

Чтобы помочь вам визуализировать проблему, я добавляю цветовую карту, текстуру, которую мне нужно разделить. enter image description here

ответ

0

Я не вижу волшебно быстрый способ сделать это, но вот несколько советов, которые могут помочь:

  • Попробуйте использовать GetPixels32 (и SetPixels32) вместо того, чтобы просто GetPixels - возвращаемое значение это не цвет, а Color32, который использует байты, а не плавающие точки, он должен быть быстрее. См. http://docs.unity3d.com/ScriptReference/Texture2D.SetPixels32.htmlhttp://docs.unity3d.com/ScriptReference/Texture2D.GetPixels32.html
  • Не называть SetPixel для каждого пикселя, это очень медленно. Вместо этого для каждого цвета создайте временный массив Color32 и работайте с ним, и только в конце назначьте все массивы новым текстурам с помощью SetPixels32.
  • Если вы используете цикл foreach или Array.ForEach или некоторые элементы linq для анализа массива цветов, не делайте этого - используйте простой цикл, это самый быстрый способ.

Надеюсь, это поможет.