Вопрос Перебор сущностей в async

Версия Minecraft
1.20.X

Wayfarer

Пользователь
Сообщения
52
Решения
1
Для чанка есть метод получения его снапшота, с которым можно работать асинхронно и перебирать там блоки, не нагружая основной поток. Есть ли аналогичный же способ, но для сущностей? Стандартная функция world.getNearbyEntitiesByType(), не работает в асинке
 
Решение
Преждевременная оптимизация, конечно, если будет только этот метод, то ничего страшного, всего-то 1-2% от тика занимает.
Продолжать использовать штатный синхронный метод по-моему наиболее здравая идея. Можно при нужном ивенте собирать список энтити с близлежащих чанков, в отдельном потоке точно фильтровать по расстоянию, возвращаться в основной поток и что-то там им командовать – можно попробовать делать это в новомодных виртуальных потоках, но я не думаю, что это даст заметный прирост по производительности. К тому же не ясно, сколько в среднем на практике это все будет занимать времени, может положение энтити критически изменится, что все это в конечном счете будет никому не нужно.
Кажется, нет, на стандартных платформах доступ к энтити возможен только из-под главного потока, любые операции с энтити не являются потокобезопасными. Полагаю, ничего не мешает итерироваться по всей коллекции из мира/чанка/чанков в отдельном потоке и там же реализовать какую-то логику по отбору. Без контекста задачи сложно что-то дельное предложить.
 
Кажется, нет, на стандартных платформах доступ к энтити возможен только из-под главного потока, любые операции с энтити не являются потокобезопасными. Полагаю, ничего не мешает итерироваться по всей коллекции из мира/чанка/чанков в отдельном потоке и там же реализовать какую-то логику по отбору. Без контекста задачи сложно что-то дельное предложить.
Ну так суть - найти сущность и передать в основной поток информацию.
Условно говоря есть крипер, который ежетикно проверяет сущности в округе. Если сущность, такой же крипер, но готовящийся взорваться, то передаём основнову криперу сигнал, что тот должен начать убегать в противоположном направлении. Как-то так
 
Ну так суть - найти сущность и передать в основной поток информацию.
Условно говоря есть крипер, который ежетикно проверяет сущности в округе. Если сущность, такой же крипер, но готовящийся взорваться, то передаём основнову криперу сигнал, что тот должен начать убегать в противоположном направлении. Как-то так
offtop
Сделай криперам тупа иммунитет ко взрыву, при условии что причина взрыва - другой крипер, и не парься, если это приемлемо
 
offtop
Сделай криперам тупа иммунитет ко взрыву, при условии что причина взрыва - другой крипер, и не парься, если это приемлемо
offtop Так спонсоров не впечатлить
 
Ну так суть - найти сущность и передать в основной поток информацию.
Условно говоря есть крипер, который ежетикно проверяет сущности в округе. Если сущность, такой же крипер, но готовящийся взорваться, то передаём основнову криперу сигнал, что тот должен начать убегать в противоположном направлении. Как-то так
Вопрос возник из-за желания преждевременной оптимизации или с этим уже по факту есть проблемы?
 
Последнее редактирование:
Вопрос возник из-за желания преждевременной оптимизации или с этим уже по факту есть проблемы?
Преждевременная оптимизация, конечно, если будет только этот метод, то ничего страшного, всего-то 1-2% от тика занимает. Но это если один игрок. Проэкстраполировав на игроков 10, то там может вырасти до 10% от тика в лучшем случае, а кол-во мобов сокращать - мир будет пустым. А если ещё идеи возникнут, где понадобится перебор? То там уже выйдет прожорливый плагин, а проверять сущности в основном потоке не всегда обязательно, это же не напрямую на мир влияет, по крайней мере поиск путей реализован через чанкснапшоты, а передача готового результата идёт в основной поток
 
Преждевременная оптимизация, конечно, если будет только этот метод, то ничего страшного, всего-то 1-2% от тика занимает.
Продолжать использовать штатный синхронный метод по-моему наиболее здравая идея. Можно при нужном ивенте собирать список энтити с близлежащих чанков, в отдельном потоке точно фильтровать по расстоянию, возвращаться в основной поток и что-то там им командовать – можно попробовать делать это в новомодных виртуальных потоках, но я не думаю, что это даст заметный прирост по производительности. К тому же не ясно, сколько в среднем на практике это все будет занимать времени, может положение энтити критически изменится, что все это в конечном счете будет никому не нужно.
 
Для чанка есть метод получения его снапшота, с которым можно работать асинхронно и перебирать там блоки, не нагружая основной поток. Есть ли аналогичный же способ, но для сущностей? Стандартная функция world.getNearbyEntitiesByType(), не работает в асинке
1) Получать сущностей асинхронно из чанка - очень плохая идея - могут быть самые разные непредвиденные ошибки
2) И без тебя, сотни/тысячи сущностей тысячи/десятки-тысяч раз каждый тик вызывают эквивалентные методы под капотом (ии, навигация, движения)
3) Правильный синхронный алгоритм может поставить на колени асинхронный
4) Переложить задачу в другой поток - тоже не бесплатно
5) Spigot API не дает тебе реальной свободы в действиях, если тебе нужно что-то большее - Sponge Mixins к вашим услугам (в связке c Forge/Fabric)
 
1) Получать сущностей асинхронно из чанка - очень плохая идея - могут быть самые разные непредвиденные ошибки
Думал, что может есть метод, который сможет вытащить их копию, ссылку, хз, с которой можно работать, напр. считать расстояние

2) И без тебя, сотни/тысячи сущностей тысячи/десятки-тысяч раз каждый тик вызывают эквивалентные методы под капотом (ии, навигация, движения)
И будет ещё больше, не тестировал сервер на высоком онлайне (у меня ни сервера, ни онлайна)

3) Правильный синхронный алгоритм может поставить на колени асинхронный
4) Переложить задачу в другой поток - тоже не бесплатно
Слышал про то, что передача данных из потоков тоже время занимает, но не знаю насколько это "не бесплатно". Есть инфа?
5) Spigot API не дает тебе реальной свободы в действиях, если тебе нужно что-то большее - Sponge Mixins к вашим услугам (в связке c Forge/Fabric)
Я на бумаге, там свободы поболее будет, ну или через патчи ядра можно сделать на крайний (или плохая идея?)
 
Думал, что может есть метод, который сможет вытащить их копию, ссылку, хз, с которой можно работать, напр. считать расстояние
Если так надо - вытащи синхронно и дальше делай что нужно асинхронно, делов то

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

Я на бумаге, там свободы поболее будет
Значит ты не знаком с миксинами, ня, ознакомься
 
Назад
Сверху Снизу