Как сделать это более эффективным? - PullRequest
6 голосов
/ 15 марта 2012

Я создаю клон Астероидов, но с еще несколькими прибамбасами.

На данный момент у меня есть ArrayList<Asteroid>, который содержит все астероиды на экране. Каждый из них имеет Vector, связанный с ним, и расширяет мой общий класс GameObject, который обрабатывает рисование и обновление, а также другие общие вещи, общие для каждого игрового объекта.

При этом каждый раз, когда я уничтожаю астероид, я создаю новый объект Asteroid и добавляю его к ArrayList<Asteroid> ... Когда это происходит, происходит заметное отставание, поскольку я также создаю частицы взрыва и предполагаю, что ГК.

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

Это правильная идея? И каков наиболее организованный и эффективный способ сделать это?

Любые другие идеи также были бы великолепны. Просто пытаюсь уменьшить создание всех этих объектов, потому что это определенно вызывает заметное отставание. Спасибо!

Ответы [ 4 ]

5 голосов
/ 15 марта 2012

(1) Подумайте над дизайном ваших объектов с помощью шаблона Flyweight.Это шаблон, обычно используемый для объектов с повторяющимися характеристиками.Пример кода Java доступен здесь: http://en.wikipedia.org/wiki/Flyweight_pattern

(2) Если вы уже знаете, сколько объектов вы будете использовать, рассмотрите возможность включения создания вашего объекта и некоторого другого процесса инициализации в загрузочную страницу.

5 голосов
/ 15 марта 2012

Создание пула объектов и их повторное использование - хорошая идея.Также я думаю, что вы могли бы переключиться с ArrayList на Vector, потому что векторы оптимизированы для случайной индексации, что вы очень много сделаете при использовании пула.астероид, вы добавляете новый, кажется, что вы работаете с постоянным количеством астероидов.Таким образом, вы можете создать пул с постоянным количеством членов.

4 голосов
/ 15 марта 2012

Я считаю, что ваши эффекты частиц являются виновниками замедления, а не создания объектов.

Разработчики игр обычно делают все возможное, чтобы убедиться, что их графика быстра, но зато делают многокомпромиссы производительности в сценариях.Это по очень веской причине: снижение производительности при создании и хранении игровых объектов в большинстве случаев незначительно по сравнению с ударом по вычислению их физики и рисованию графики.

Попробуйте уменьшить количество и сложность графики (особенно если они имеют прозрачность ; эффекты этого очень быстро накапливаются до безумия) ваших частиц.

4 голосов
/ 15 марта 2012

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

Вы можете убедиться, что именно GC вызывает проблему, которую вы наблюдаете, включив "подробное ведение журнала GC" (Google для этого имеет несколько аргументов командной строки для JVM, которые включают его с разным уровнем детализации)...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...