Получение позиции объекта в игре - PullRequest
1 голос
/ 11 сентября 2010

Недавно я начал делать простые 2D-игры и столкнулся с дилеммой - использовать или не использовать методы получения и установки для положений x и y объекта. Было бы яснее, если бы я не использовал методы, а вместо этого обращался к переменным напрямую, а также, многие вызовы методов для объекта могли бы снизить производительность. Кроме того, получение и установка позиции в значительной степени остается простым, поэтому здесь нет необходимости в инкапсуляции? Или мы должны всегда придерживаться соглашения методов getter и setter?

Ответы [ 4 ]

5 голосов
/ 11 сентября 2010

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

Это называется методом встраивания.


Java 2выпуск Java VM автоматически включает простые методы во время выполнения.В неоптимизированной Java VM каждый раз, когда вызывается новый метод, создается новый кадр стека.Создание нового фрейма стека требует дополнительных ресурсов, а также некоторого переопределения стека, в результате чего создание новых фреймов стека сопряжено с небольшими издержками.

Метод встраивания метода повышает производительность за счет уменьшения количестваметод вызывает вашу программу. Встроенный код Java VM содержит методы, которые возвращают константы или только для доступа к внутренним полям .


Ресурсы:

На ту же тему:

4 голосов
/ 11 сентября 2010

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

Вместо этого у вас есть методы, такие как .updatePosition (), .draw (), .moveTo (), .collideWith (),и т. д., чтобы вам никогда не приходилось получать или устанавливать значения непосредственно извне.

Есть несколько редких случаев, когда вы действительно хотите получить / установить значения непосредственно извне, но эти случаи редки и болеечасто, чем не указывает на плохой дизайн (хотя допустимые использования).

3 голосов
/ 11 сентября 2010

Я бы использовал геттеры / сеттеры. Почему?

  1. Инкапсуляция ключ . Возможно, позже вы измените способ хранения местоположения (например, декартово на полярное?). Получатели / установщики позволят вам выполнить соответствующие преобразования.
  2. Сеттеры позволят вашему объекту применять условия (например, есть x> 0 и <10?) </li>

Еще одна причина (хотя, возможно, в настоящее время не соответствующая вашим потребностям) заключается в том, что многие среды Java используют классы отражения и интроспекции для сеттеров / получателей в обычном формате setX / getX. Благодаря реализации таких методов ваши классы сразу же доступны для повторного использования в самых разных средах.

Не беспокойтесь о производительности, пока она не станет известной проблемой. Преждевременная оптимизация вызовет у вас слишком много головной боли.

1 голос
/ 11 сентября 2010

В Стендаль мы используем геттеры / сеттеры.У нас есть около 60 000 подвижных объектов, которые обрабатываются каждый ход.Из моего опыта работы в Stendhal простые методы не оказывают какого-либо ощутимого влияния на производительность.Мы немного успокоили профилирование, чтобы найти различные проблемы, и значительно улучшили производительность за последние пару месяцев.

Основная горлышко бутылки, которое у нас есть, - это поиск пути (особенно обнаружение столкновений с другими подвижными объектами).Возникла проблема, связанная с созданием нового объекта Pair при каждой возможной проверке столкновений или созданием нового объекта Rectangle всякий раз, когда у объекта запрашивались его позиция и размер.

Эти вещи очень легко обнаружить в профилировщике Профилирование игрового цикла на стороне сервера в java на gamedev).

Другими распространенными причинами отставания от логической части игрового цикла являются взаимодействие клиент-сервер и доступ к базе данных.

...