Немного предыстории, я пишу эволюционную игру с другом на C ++, используя ENTT для системы сущностей. Существа ходят по 2D-карте, едят зелень или других существ, размножаются, и их черты видоизменяются.
Кроме того, производительность хороша (60fps без проблем), когда игра запускается в режиме реального времени, но я хочу иметь возможность значительно ускорить ее, чтобы не пришлось ждать 4 часа, чтобы увидеть какие-либо существенные изменения. Поэтому я хочу получить это как можно быстрее.
Я изо всех сил пытаюсь найти эффективный метод для существ, чтобы найти их еду. Каждое существо должно искать лучшую еду, которая достаточно близка к ним.
Если оно хочет есть, существо, изображенное в центре, должно осмотреть себя в радиусе 149,64 (расстояние обзора) и решить, какую пищу ему следует искать, исходя из питания, расстояния и типа (мясо или растение) ,
Функция, отвечающая за нахождение каждого существа, его пища съедает около 70% времени выполнения. Упрощение того, как это написано в настоящее время, выглядит примерно так:
for (creature : all_creatures)
{
for (food : all_entities_with_food_value)
{
// if the food is within the creatures view and it's
// the best food found yet, it becomes the best food
}
// set the best food as the target for creature
// make the creature chase it (change its state)
}
Эта функция запускается каждый тик для каждого существа, ищущего пищу, пока существо не найдет еду и не изменит свое состояние. Он также запускается каждый раз, когда появляются новые продукты для существ, которые уже гоняются за определенной пищей, чтобы убедиться, что все ищут лучшую из доступных им продуктов.
, но я не знаю, возможно ли это вообще.
Один из способов, которым я уже улучшил его, - это сортировка all_entities_with_food_value
группы таким образом, чтобы, когда существо перебирает пищу, слишком большую для него, оно останавливается там. Любые другие улучшения приветствуются!
РЕДАКТИРОВАТЬ: Спасибо всем за ответы! Я реализовал разные вещи из разных ответов:
Во-первых, я просто сделал так, чтобы функция виновности запускалась только раз в пять тиков, это сделало игру примерно в 4 раза быстрее, и при этом ничего не изменило в игре.
После этого я хранил в поисковой системе продуктов массив с порожденными продуктами в том же тике, что и при запуске. Таким образом, мне нужно только сравнить еду, которую преследует существо, с новыми продуктами, которые появились.
Наконец, после исследования разделения пространства и рассмотрения BVH и quadtree, я выбрал последнее, так как я чувствую, что это намного проще и лучше подходит для моего случая. Я реализовал это довольно быстро, и это значительно улучшило производительность, поиск продуктов почти не занимал времени!
Теперь рендеринг - это то, что замедляет мой темп, но это проблема для другого дня. Спасибо вам всем!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
должно быть проще, чем реализация «сложной» структуры хранения, ЕСЛИ она достаточно производительная. (Связано: это может помочь нам, если вы разместите немного больше кода во внутреннем цикле)