Я пытаюсь собрать систему частиц в Android, используя OpenGL. Мне нужно несколько тысяч частиц, большая часть которых, вероятно, будет за кадром в любой момент времени. Визуально это довольно простые частицы, а мой мир 2D, но они будут двигаться, менять цвет (не размер — они 2x2), и тогда мне нужно будет иметь возможность добавлять и удалять их.
В настоящее время у меня есть массив, который я перебираю, обрабатывая изменения скорости, управляя жизненным циклом (удаляя старые, добавляя новые) и рисуя их с помощью glDrawArrays. Однако OpenGl указывает для этого вызова на одну вершину; Я использую glTranslatex в соответствующие координаты для каждой частицы, которую я хочу нарисовать, по одной за раз, устанавливаю цвет с помощью glColor4x, а затем glDrawArrays. Это работает, но немного медленно и работает только для нескольких сотен частиц. Я сам занимаюсь стрижкой.
Я написал систему для поддержки статических частиц, которые я загрузил в vertex/colorarray и построил с помощью glDrawArrays, но этот подход кажется подходящим только для частиц, которые никогда не изменят относительное положение (т.е. я перемещаю их все, используя glTranslate), цвет и где мне не нужно добавлять/удалять частицы. Несколько тестов на моем телефоне (HTC Desire) показывают, что попытка изменить содержимое этих массивов (которые представляют собой ByteBuffers, на которые указывает OpenGL) выполняется очень медленно.
Возможно, есть какой-то способ вручную написать экран с процессором. Если я просто рисую точки 1x1/2x2 на экране, и меня интересует только запись, а не смешивание/сглаживание, это вариант? Будет ли это быстрее, чем то, что делает OpenGl?
(200 или около того частиц на машине с тактовой частотой 1 ГГц и мегабайтами оперативной памяти. Это намного медленнее, чем я получал 20 лет назад на машине с тактовой частотой 7 МГц и оперативной памятью ‹500 тыс.! Я ценю, что использую здесь Java, но, безусловно, лучшее решение Должен ли я использовать NDK, чтобы получить мощь С++, или это то, что мне нужно)