Реализация KnownList
Вопрос к думающим людям.
В процессе разработки эмулятора на C# подошел к тому, что пора реализовать KnownList - списки всех объектов, находящихся в определенном радиусе от персонажа\моба. Пока что решил реализовать его следующим образом. При входе в игру мы чекаем всех персонажей в онлайне и если они в определенном радиусе от персонажа - то добавляем входящего в игру в их knownlist и соответственно их добавляем в knownlist нашего персонажа. knownlist - подписан на событие Player_Enterworld Код:
private void Player_EnterWorld(Player player) И так теперь нужно подумать, ведь персонаж передвигается и соответственно kownlist должен постоянно изменятся. По этому реализовал следующий статический метод. Код:
public static void RecalcKnownPlayersList(Player ownerPlayer) На реализацию удаления из листа овнера далеких игроков не обращать внимания, позже сделаю покрасивее через итератор. по поводу пробежки по всему онлайн листу. Так как нагрузка на данный метод растет по экспоненте думаю это не совсем лучший вариант. Потом разобью мир на регионы и пробежка будет уже по текущему региону и по его соседним регионам. Дабы не было такой ситуации что объекты находящиеся в соседнем регионе грузились только при пересечении границы. А вот собственно вопрос. Когда запускать пересчет данного листа?. приатачил его к приходу пакета MoveToLock. но фиг его знает. PS. На сервере который я разрабатываю инстанс зон не будет. PSS. По поводу локеров. Используется ReadWriteLockSlim - самый быстрый из доступных локеров в .net И вот собственно методы добавления удаления Код:
private void AddPlayerWithLock(Player player) |
Re: Реализация KnownList
1. При входе в игру добавляешь объект в регион (учитывая возможно инстанс зоны если такие будут)
2. Отправляешь игроку информацию об объектах его региона и соседних 8 (если по примеру, то взгляни на num клаву, регион игрока это цифра 5, цифры 1,2,3,4,6,7,8,9 - соседние регионы) опять учитывая инстансы, а так же отправляешь информацию плеерам этих регионов инфу о игроке. https://upload.wikimedia.org/wikiped...0px-Numpad.JPG 3. при смене региона игроком, изменяются соседние регионы, к примеру на нашей nym клавиатуре игрок пошел прямо и попал с региона №5 в регион №8 инфу нужно удалить инфу об объектах с регионов 1,2,3 и послать информацию об обектах новых соседних регионов Num Lock, /, * ...тут же не забываем обновлять информацию про нашего игрока у игроков регионов с которых он выбежал и куда забежал. Не знаю понятно ли я объяснил, надеюсь да. |
Re: Реализация KnownList
Цитата:
|
Re: Реализация KnownList
А нафига Вам реализация кноулистов? Они не требуются в lineage2 и их нет в ретейле, плюс лишняя нагрузка на проц и память. Если нужно, то могу потом объяснить чем черевато использование кноулистов.
|
Re: Реализация KnownList
Давно уже никто их не использует - пережитки быдлокодинга
|
Re: Реализация KnownList
Цитата:
Кноунлист - четкое представление того что видит клиент. Допусим послал клиент Action c objectId - и дабы быстро понять что хотел клиент можно было пробежаться по его кноунлисту. И если в его кноун листе такого нет - значит наш игрок балуется с пакетами. и все в таком духе. А по поводу нагрузки... при тесте из 1000 мобов в локации и 20 персонажей. (мобы добавляются в другй кноун лист) при пересчете кноун листа и отсылке изменений всем этим 20ти окнам серверу нужно в среднем 294622 наносекунд. Примерно 0,00029 сек. чтобы просчитать все ближайшие регеоны, подготовить, зашифровать и отправить все эти 20 пакетов. (при Release сборке с оптимизацией). Честно говоря я вообще не ожидал что скорость будет настолько высокая. А пересчет для кноунлиста с 1000 мобами вообще занимает 0,000138 секунд.... Лирическое отступление - похоже я близок к тому чтобы убрать фризы при осадах :redlol: (нет) А если выпилить из клиента стандартную шифрацию\дешифрацию то эти дела будут работать еще быстрее чуть ли не в разы, ибо процесс дешифрации пакетов на сервере занимает чуть ли не половину всего времени жизни потока пришедшего пакета. Пока реализовывал WorldRegion назрел следующий вопрос про боардкасты. Дело в том, что я использую асинхронный сервер, и возможна следующая ситуация- при обновлении knownList допустим при телепортации в другую локацию где много объектов, сервер может просто зафлудить нахрен клиент. В java пакеты идут с минимально возможной задержкой (10мс - слип селектора очереди отправления пакетов(если они не "склеены" в одну посылку)) А при асинхроннике за эти 10 мс клиенту может придти огромное число пакетов, так не сойдет ли он с ума? я просто не знаю как в клиенте устроен процесс чтения пакетов. или же лучше исскуственно делать задержку на отправку. Добавлено через 2 минуты Цитата:
Добавлено через 3 минуты Цитата:
Добавлено через 12 минут Хотя я возможно и сам понимаю чем это черевато. - Блокировки. При большом кол-ве уникальных кноунлистов получается лишний расход цп на их обсчет и получение и ожидания блокировок. Но с другой стороны это дает серверу четкое понимание о "картине" клиента и упрощает разработку. Но на сколько я понял вы имеете ввиду, сейчас все java кодеры отказались от кноунлистов и шлют боардкасты из WorldRegion с учетом координат обьектов? |
Re: Реализация KnownList
Цитата:
|
Re: Реализация KnownList
Цитата:
Идем далее. Куча постоянных локов, а значит и паркинга потоков, что не есть быстро. Прибавляем к этому постоянное движение игроков, монстров и получаем уже не слишком хорошую работу сервера. Ну и конечно же хранение в коллекции кучи объектов на энные тысячи и тысячи объектов кноулистов. В особенности при вменяемом онлайне. Цитата:
Цитата:
У меня, к примеру, АИ тикает по регионам, каждый регион тикает отдельно, если статус региона неактивный, то тики пропускаются. Добавлено через 5 минут Цитата:
|
Re: Реализация KnownList
Цитата:
Тогда получается что пакеты можно "склеивать" и посылать несколько пакетов за раз, а по идее разделять их будет первые 2байта размера, и клиент их нормально спарсит? |
Re: Реализация KnownList
Alay, размер буфера не помню. А пакеты и нужно посылать кучей, пока буфер на сервере не заполнится, либо очередь на отправку не опустеет, а не по одной штуке:)
|
Текущее время: 18:07. Часовой пояс GMT +3. |
Powered by vBulletin® Version 3.8.6
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot