Более эффективный метод рисования тысяч частиц (Java / Android) - PullRequest
6 голосов
/ 15 июня 2011

Итак, я пишу своего рода симулятор частиц, например, «игру с падающим песком», если вы знаете, что это такое, и я сейчас нахожусь на контрольно-пропускном пункте. То, как я это делаю, это то, что у меня есть объект частицы, который в основном на данный момент имеет позицию (int x, int y) и все. Я рисую / перемещаю их с помощью потока и события onDraw для панели Android. Каждый раз, когда вызывается onDraw, я перебираю все частицы, смещаю их вниз на один пиксель, если они не достигают дна, а затем рисую их, это довольно плавно, пока я не доберусь до 200 частиц, тогда fps значительно падает. Я знаю, что это сложный способ вычислений, и я не спорю об этом, но есть ли какой-то способ, которым я мог бы сделать это, чтобы позволить рисовать намного больше частиц и с меньшим запаздыванием?

Заранее спасибо.

Ответы [ 5 ]

2 голосов
/ 15 июня 2011

Я никогда раньше такого не делал, но я сделал несколько сложных клеточных автоматов . Извините, если это слишком расплывчато.

Основная идея здесь состоит в том, чтобы пометить все частицы, которые должны "продолжать падать" или "не двигаться" и исключить их из сложной обработки (с особой короткой / быстрый процессор для «падающего» списка - все, что вам нужно сделать, это отбросить каждый на пиксель).

  • Ускорение для неподвижных частиц - статических частиц (я буду называть их S-частицами) состоит в том, что они не двигаются. Отметьте его для всех неподвижных областей (например, «стенка» или «чаша», не зависящая от силы тяжести, которую может создать пользователь. Отметьте частицы над ним S, если они стабильны, например, для жидкости, , если он имеет S частицы под обеими сторонами и не будут двигаться . Для чего-то вроде песка, который образует груды, , если в каждой из трех точек под есть S, он образует кучу , вы получите хорошие 45-градусные сваи, как это, я уверен, что вы можете изменить это, чтобы сделать некоторые вещи более крутыми или менее крутыми. Свяжитесь с S снизу вверх.
  • Ускорение для частиц без частиц под ними падает - F частиц. Частицы с F-частицей под ними также являются F-частицами. Отметьте также это снизу вверх.
  • Частицы, не помеченные F или S, являются сложными , они могут начать падать, прекращать падение или вращаться, использовать медленный процессор, который у вас уже есть, чтобы иметь дело с ними, их не должно быть много.

В итоге у вас будет много много быстрых частиц. Те, что в куче / озере, и те, кто идет вниз. Оставшиеся частицы - это частицы на краю склонов, на вершине озер или в других сложных местах. Там не должно быть почти столько же, сколько будет быстрых частиц.

Визуально отметьте каждый тип частиц некоторым цветом, сложные частицы ярко-красного цвета. Найдите случаи, когда он все еще медленный, и посмотрите , какие другие типы быстрых процессоров вы должны сделать. Например, вы можете обнаружить, что создание большого количества песчаных куч создает много красных областей вдоль склонов, вы можете инвестировать в ускорение «зон катания» вдоль склонов куч.

Надеюсь, это имеет смысл. Не забудьте вернуться и отредактировать, как только вы что-нибудь выясните!

2 голосов
/ 15 июня 2011

Возможно, вы захотите изучить OpenGL ES аппаратное ускорение и отрисовка . Это не дает вам более эффективного кода решения (см. Другие ответы для этого). Тем не менее, он открывает гораздо больше вычислительной мощности для использования. Вы даже можете запустить всю симуляцию на GPU (возможно, не знаете деталей вашей реализации).

Редактировать
Кроме того, если вы все еще решаете выполнить обработку в Java, вы должны посмотреть Метод Профилирование в DDMS . Это поможет вам понять, где находятся ваши узкие места в производительности.

2 голосов
/ 15 июня 2011

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

Я вижу несколько способов улучшить его.Сначала нужно поместить пиксели в растровое изображение в памяти, а затем нарисовать все растровое изображение одновременно.Во-вторых, поскольку частицы всегда движутся вниз на один пиксель, вы можете прокрутить часть растрового изображения вместо того, чтобы перестраивать все.Если в Android нет прокрутки, просто нарисуйте растровое изображение на один пиксель вниз и запустите новое растровое изображение для частиц над свитком.Вы должны будете исправить частицы на дне, но их меньше.

0 голосов
/ 15 июня 2011

Я думаю, что если частицы находятся близко друг к другу, вы можете создавать объекты, которые представляют 3 или более частиц.

При отображении нескольких частиц на экране наборы зерен могут остаться незамеченными.

0 голосов
/ 15 июня 2011

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

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

С уважением, Стефан

...