2012-06-05 1 views
1

Я пытаюсь создать полностью автоматизированный игровой движок, который должен работать на основе событий. Проблема, с которой я сталкиваюсь, заключается в том, что я создал класс карты и инициализирован в игровом классе. Это почти статично, и для игры существует только одна карта. Новые карты загружаются путем очистки объектов на текущей карте и добавления новых карт. Здесь вы можете увидеть источник класса карты.Разработка Java-игр. Создание карты плитки быстрее. Советы по оптимизации

http://code.google.com/p/game-engine-for-java/source/browse/src/com/gej/map/Map.java

Основные проблемы приходят в обнаружении столкновения, где я использую обнаружение столкновений перебора, где я не должны. Это сильно замедляет игру, и я хочу проверить столкновение только для объектов, которые ближе к объекту. Я использую интерфейс MapLoader для построения карт. Я думаю, что вызов метода collision() объектов в другом потоке может помочь. Однако все объекты карты обновляются в классе Game.

Вот класс игры, в случае если это может помочь

http://code.google.com/p/game-engine-for-java/source/browse/src/com/gej/core/Game.java

Там другая проблема, что некоторые раза, объекты не уничтожаются. Я вызываю метод removeObject() карты, но он принимает 1-секундную задержку и несколько раз не удаляет все.

Это дает мне 48-64 кадров в секунду в платформенной игре с 158 объектами в игре. Но в игре в стиле космических захватчиков он дает мне всего 20-30 кадров в секунду. Любые советы по оптимизации очень ценны ...

Если бы кто-нибудь мог получить мне учебник по двоичному интервалу и т. Д., Я был бы благодарен.

ответ

2

Два предложения, взглянув на ваш код: во-первых, вы должны попытаться свести к минимуму выделение объектов при обнаружении столкновений, не создавать новые Rectangles, работать с данными, которые у вас уже есть, написав непосредственно алгоритм обнаружения столкновений.

Второй более важная вещь: двигатель обнаружения столкновений должен работать с использованием двух уровней:

  • грубый уровень столкновения уже исключает объекты, которые, безусловно, слишком далеко, чтобы столкнуться (вы можете использовать много методов здесь, как binary spatial partition алгоритм больших сталкивающихся сгустков, или иерархической структуры объектов)
  • штраф на уровне, который будет вычислять конкретные детали для столкновения, которое может произойти при более точных алгоритмов
+0

Вместо использования rectan gle я могу проверить границы самостоятельно ... –

+0

Изменен поток в классе Game. Теперь обнаружение столкновения выполняется в отдельном потоке, так что теперь обнаружение столкновения быстро на 3000 объектов на карте. Падает 1-2 кадра в секунду, но этого достаточно для простого 2D-движка –