Translations:Modding:Modding Efficiently/9/ru

From Vintage Story Wiki
  • Поиск объектов
    Используйте EntityPartitioning - api.ModLoader.GetModSystem<EntityPartitioning>().WalkEntityPartitions(). Эта система разбивает объекты на сегменты блоков 8x8x8 по всему загруженному игровому миру, а затем ищет только внутри этих сегментов в пределах заданного вами радиуса поиска, что значительно сокращает пространство поиска.
  • Поиск блока
    a) Если вы хотите, чтобы сущность нашла определенный, не слишком распространенный блок, используйте POI Registry. Этот реестр позволяет блочным объектам регистрировать точки интереса, которые объекты могут очень эффективно искать. Они также разделены на сегменты столбцов фрагментов, чтобы дополнительно сократить пространство поиска. Для примера кода ознакомьтесь с блочной сущностью ягодного куста
    b) Для регулярного полного сканирования чанка я рекомендую отдельный фоновый поток, который загружает чанк и получает доступ к необработанным данным блока через chunk.Blocks. Это массив с индексом (y * размер фрагмента + z) * размер фрагмента + x, где xyz — локальные координаты от 0 до фрагмента-1. Однако вы должны писать только в кусок в основном потоке! Если вы хотите пока избежать многопоточности, вы все равно можете перебирать chunk.Blocks в основном потоке и даже разбивать задачу на несколько тиков, как это делают ванильные ульи.
    c) Для сканирования редких областей используется api.World.GetBlockAccessorPrefetch(). Этот метод доступа к блокам позволяет предварительно загрузить область, а затем довольно эффективно перебирать каждый блок в заданной области.