Прозрачный материал не должен быть медленным, пока вы держите его на минимуме и держитесь подальше от очень старых телефонов. Следует также отметить, что альфа иногда игнорируется в некоторых реализациях, а иногда и квантуется до уродливых уровней (некоторые телефоны Motorola привязывают альфа-значения к ближайшему 2-битовому значению. Bleh).
У меня возникнет соблазн приблизиться к этому как один прозрачный слой, наложенный на экран. Сохраняйте массив int размером вашего экрана, на котором вы будете строить свои прозрачные пиксели (int [width * height]). На каждом кадре сделайте вызов Image.createRGBImage и нарисуйте это изображение на экране.
В качестве эксперимента вы можете сначала убедиться, что альфа-обработка не замедлит вас, заполнив этот массив постоянным значением и построив его на экран. Например. 0x80FF0000 должен сочетать красный оттенок с экраном, и вы можете легко увидеть, будет ли этот альфа-бизнес работать на вашем выбранном телефоне, т. Е. Вы можете измерить, как он влияет на частоту кадров.
Далее вам нужно нарисовать круги в этом массиве. Ищите Bresenham's circle drawing algorithm и переработайте его, чтобы нарисовать в int массив пикселей. Возможно, вам понадобится поддерживать таблицу поиска, которая имеет предварительно рассчитанный радиус/sqrt (2) для каждого радиуса, который вы хотите построить.
Далее следует, как смешивать цвета, чтобы их совпадение. Простейшим было бы просто построить значение цвета с альфой в пиксель. Вы не получили бы цветное смешивание с уже нанесенными кругами, но это было бы дешево, и круги бы смешались с фоном.
Другим методом является игнорирование цветовой смеси, но для простого слияния с альфой. Например.
newColour = ((destColour & 0xFF000000) + 0x20000000) | srcColour;
/* Where source colour is of the form 0x00RRGGBB. Note: Adding 0x20 to alpha each
* time will only work for 7 overlapping circles. */
Цвет перекрытия круга будет доминировать, лежащий в основе один, но альфа станет более непрозрачной, где они перекрываются, которые, по крайней мере, позволить игроку видеть все круги должным образом.
Если вы хотите сделать точную цветовую смесь, то вычисления намного сложнее, особенно если вы смешиваете одно значение с альфой на другом с альфой, поскольку цветные вклады от каждого пикселя варьируются в зависимости от доли альфы в каждый цвет. Это не невозможно, но сделать его эффективным - это боль. У меня возникнет соблазн пойти на более дешевый вариант.
Отличная идея, спасибо!Я сразу же напишу несколько примеров кода, чтобы проверить, могут ли устройства обрабатывать такой подход. –