Насколько я помню, в вашем движке видимости весь мир поделен на горизонтальные полоски (если смотреть на карту сверху), для того чтобы избежать перебора всех обьектов в мире, при определении видимых обьектов. Вместо перебора всех обьектов в мире - перебирается несколько соседних полосок, ближайших к чару, и все обьекты внутри. LinearCellSize это ширина этих полосок, и от нее зависит расход памяти, скорость перебора, и погрешность при определении видимости.
Недостатки:
- сложности с переключением AI между активным и пассивным режимом, вплоть до того, что пришлось писать LightAI
- низкая скорость работы
- ненадежен, неудобен, постоянно давал сбои
Преимущества:
- высокая точность
В моем варианте - мир поделен на регионы (параллилепипеды), и перебираются соседние.
Недостатки:
- неточен, дает погрешность величиной в ширину региона. Если взять за размер региона 4000, то обьект виден, если он находится на расстоянии от 4000 до 8000. Но это не заметно игроку, и в принципе ничем не плохо. Кроме того, в случае необходимости, можно задействовать дополнительно проверку расстояния.
Преимущества:
- AI переключаются при включении/отключении региона, что не требует никаких дополнительных механизмов внутри самого AI. Т.е. вся эта путаница и тонна лишнего кода - просто ненужны
В результате намного выше скорость работы, нет этих бесконечных глюков с зависшими мобами.
- скорость в несколько раз выше, проверено на практике. Даже при использовании обычных списков. Если же заюзать имитацию динамических массивов, как было сделано в первом варианте - скорость еще в несколько раз возрастет.
- очень надежен, и удобен, имеет кучу возможностей. Например с его помощью легко состряпал фэйкового чара для обсервинга, написав буквально пару строчек.
Расход памяти в обоих вариантах одинаков