Предположим, у вас есть игра, в которой есть много (много много) сущностей, выполняющих некоторые функции, не все из которых постоянно необходимы или должны рассматриваться в каждом кадре. Конкретная проблема, над которой я работаю, - это детальное моделирование тела, включая его органы.
В игре каждое существо имеет свое собственное тело, которое разделено на более мелкие части (туловище, ноги и т. Д.), И иногда эти части содержат органы, которые выполняют определенную функцию в теле. Является ли орган в настоящее время для какой-либо цели или активен, на самом деле никогда не ясно. В конце концов, у животного может быть пустой желудок, поэтому ему не нужно ничего переваривать. Было бы довольно нелепо проверять или моделировать каждый объект в каждом кадре и очень дорого, как только у вас появилось много существ в мире. Поэтому я думал о том, как разумно провести различие между объектами, которые необходимо обновить, и объектами, которые не нужно обновлять.
То, что я придумал, кажется, по крайней мере, хорошим решением. Он создает простую очередь / стек (важно, чтобы каждый элемент удалялся, как только он прочитан; порядок не имеет значения), называемый «стеком внимания», в котором находятся объекты, которые необходимо смоделировать. Объекты, которые требуют внимания, просто помещают себя в стек или помещают туда другие объекты. Эти объекты, вероятно, реализуют простой интерфейс с функцией simulate ().
Применительно к моему предыдущему примеру пищеварения это будет означать:
Игрок выбирает что-нибудь поесть (предположим, это хлеб) из инвентаря и кладет это в рот своего персонажа, а рот кладет в стек внимания. В следующем кадре устье берется из стека и вызывается его функция имитации (). Так как это рот, было бы разумно симулировать жевание здесь. Это может продолжаться в течение нескольких кадров, в которых рот продолжает укладываться в стопку, пока не решит, что еда готова для проглатывания. В этом случае рот кладет пережеванный хлеб в желудок (я знаю, что он не идет туда напрямую, но пищевод оставлен для упрощения), который затем также кладется на стопку внимания. В следующем кадре начинается симуляция процесса пищеварения. И так далее для остальных необходимых органов.
Предполагаемая проблема с этим - объекты на холостом ходу. Спящее животное является хорошим примером этого. Это можно сделать, как описано ранее, держа спящего животного в стопке и каждый раз проверяя, нужно ли ему просыпаться, но это кажется расточительным, поскольку это единственное, что делается. Чтобы сделать объекты на холостом ходу более эффективными, я планировал добавить своего рода расписание, в котором будут храниться задания, которые должны быть выполнены в определенное время. Если животное ложится спать, оно ставит работу по этому графику, который будет назначаться на определенное время после того, как животное ложится спать. Затем эта работа позаботится о том, чтобы снова поставить спящего животного на стек внимания. Теперь вы можете сказать, что спящее животное, которого нет в стеке внимания, может пропустить атаку, потому что его ИИ не моделируется,
Честно говоря, я не знаю, насколько это близко к элегантному решению этой проблемы из-за недостатка опыта. Я близок к чему-то полезному? Как это обычно делается, или у кого-нибудь есть какие-либо предложения или лучшие решения?