Трохи тла, я кодую еволюційну гру з другом на C ++, використовуючи ENTT для системи сутності. Істоти ходять по двовимірній карті, їдять зелень або інші істоти, відтворюють і їхні риси мутують.
Крім того, продуктивність хороша (60 кадрів в секунду без проблем), коли гра запускається в режимі реального часу, але я хочу мати можливість її значно прискорити, щоб не потрібно чекати 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
групи так, що коли істота перебирає надто велику їжу, щоб її з'їсти, вона зупиняється на цьому. Будь-які інші вдосконалення більш ніж вітаються!
EDIT: Дякую всім за відповіді! Я реалізував різні речі з різних відповідей:
По-перше, я просто зробив це так, що функція вини запускається лише раз на п’ять тиків, це зробило гру навколо 4 разів швидше, при цьому не помітно змінивши нічого про гру.
Після цього я зберігав у системі пошуку їжі масив із їжею, породженою в тій же галочці, в якій він працює. Таким чином мені потрібно лише порівняти їжу, яку переслідує істота, з новими продуктами, які з'явилися.
Нарешті, після дослідження розподілу космосу та розгляду BVH та квадрату я пішов із останнім, оскільки відчуваю, що це набагато простіше та краще підходить до мого випадку. Я реалізую це досить швидко, і це значно покращило продуктивність, пошук їжі ледве займає будь-який час!
Зараз візуалізація - це те, що сповільнює мою роботу, але це проблема для іншого дня. Дякую вам всім!
if (food.x>creature.x+149.64 or food.x<creature.x-149.64) continue;
має бути простішим, ніж реалізація "складної" структури сховища, якщо це достатньо ефективно. (Пов'язано: Це може нам допомогти, якщо ви опублікували трохи більше коду у внутрішньому циклі)