Класс дизайн для оружия в игре? - PullRequest
2 голосов
/ 04 марта 2011

Мне нравится делать игры, и теперь я впервые пробую себя на мобильных устройствах. Там производительность, конечно, гораздо более важная проблема, чем на хорошем ПК, и я особенно борюсь с дизайном класса оружия (или, скорее, снаряда). Их нужно много обновлять, много разрушать / создавать и, как правило, много обновлять.

В настоящий момент я делаю это очевидным образом, я создаю объект снаряда каждый раз, когда стреляю и уничтожаю его при ударе. Каждый кадр всех активных снарядов проверяется на столкновение с другими объектами. Кажется, что оба шага нуждаются в улучшении. Существуют ли общие способы эффективной обработки таких объектов?

В общем, я ищу совет о том, как сделать чистый и эффективный дизайн класса, мои навыки поиска в Google были слабыми в этом.

Я с удовольствием приму любой совет на эту тему.

Ответы [ 3 ]

5 голосов
/ 04 марта 2011

Когда у вас есть много объектов, которые создаются и уничтожаются за короткий промежуток времени, общий подход состоит в том, чтобы иметь уже выделенный пул экземпляров, который вы просто повторно инициализируете.Только если пул пуст, вы выделяете новые экземпляры.Apple делает это с MapKit и представлениями таблицы, среди других.Изучение этих интерфейсов, вероятно, вам пригодится.

3 голосов
/ 04 марта 2011

Я не думаю, что это касается дизайна класса. Ваши занятия в порядке; это алгоритмы, которые требуют работы.

Их нужно много обновлять, много разрушать / создавать и, как правило, много обновлять.

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

Что касается обновления, вам нужно обновить все, что меняется, - на самом деле этого нет.

Каждый кадр всех активных снарядов проверяется на столкновение с другими объектами.

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

#Bad
for obj1 in all_objects:
    for obj2 in all_objects:
        if obj1 hit obj2:
            resolve_collision

#Good
for obj1 in all_objects:
    for obj2 in all_objects_after_obj1:
        if obj1 hit obj2:
            resolve_collision

Как реализовать 'all_objects_after_obj1', зависит от языка, но если у вас есть массив или другая структура произвольного доступа, содержащая ваши объекты, вы можете просто начать индексирование с 1 после obj1.

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

Кажется, что оба шага определенно нуждаются в улучшении.

Они только «кажутся»? Профилируйте приложение и посмотрите, где медленные части. Это редко хорошая идея, чтобы догадываться о производительности, потому что современные языки и аппаратные средства могут удивлять.

0 голосов
/ 05 марта 2011

Как писал Джим, вы можете создавать пул объектов и управлять ими.Если вы ищете конкретный шаблон дизайна, есть Flyweight . Надеюсь, это поможет вам.

...