Сообщение от EvilChaotic
ЗЫ. Все это очень стремно. Не знаю зачем тебе это понадобилось, если расскажешь подробней то в свободное время напишу нормально.
|
Сообщение от MoKa
Это типо hash таблица получается. Удобно если нужно делать сетевую игру, где ты знаешь что все объекты имеют свой уникальный ID.
|
Вот и ответ.
Я сделал что то наподобие сетевой системы на архитектуре клиент-сервер построенной на UDP протоколе (Udp выбран не случайно, хочу потом на основе этого сделать небольшой сетевой шутер).
Работает правильно, но из за кучи циклов
for-each (которые используются мной для прохода по типам) при количестве клиентов больше пяти сервер начинает не сразу читать и отвечать на запросы сообщения клиентов.
Все объекты типа "клиент" имеют свой уникальный
ID.
И всё это хорошо работает, если сервер не начинает отсылать всем клиентам банальный запрос пинга (тут происходит первая "пробежка" по типу
cClient, которая работает и не подвешивает сервер). А в ответ на эти запросы пинга все клиенты начинают ему отвечать, соответственно в разное время, вот тут происходит ещё куча "пробежек" по типу
cClient для поиска
ID каждого приславшего клиента.
Т.е. выглядит это так у меня:
1) сервер посылает запрос;
2) каждый клиент получает данный запрос в разное время (соответственно скорости соединения клиента/сервера);
3) каждый клиент обрабатывает запрос;
4) каждый клиент посылает ответ серверу, содержащий
id клиента и какие то данные;
5) сервер на каждый ответ проходит циклом
for-each по типу
cCLient для поиска
ID который пришёл от клиента и обрабатывает данные.
далее снова п.1
Я пробовал уже делать стек команд (работает, но прироста к скорости работы сервера много не дало), пробовал сделать отсылание команд клиентам в определённый интервал (вот тут как раз добавилась возможность нормально подключиться ещё двум-трём клиентам). Так же пробовал реализовать одновременно стек команд, выполняющийся по определённому интервалу времени. Всё это либо не помогло, либо помогло, но очень слабо.
Я понимаю, что сервер на блице - это глупость, но хочу попробовать пока что на нём реализовать (сначала на чистом UDP блица, а потом на RakNet'е, если с ним разберусь). Моя архитектура работает, но вот забивается при большом количестве поступивших команд
вот для этого я и хочу сразу брать нужный мне
id из типа
cClient сразу, что бы сервер не грузил себя тучей циклов
for-each. Если кто то мне объяснит как вообще реализуется подобное - буду неимоверно благодарен.
Я всё это делал взяв за основу архитектуру сетевой части движка IdTech 2 (Quake II, в котором более-менее разобрался и даже начал вносить свои небольшие изменения в геймплей). Но он то написан на C++, и большинство конструкций я просто не представляю как на блице можно реализовать, да и невозможно это наверно в принципе. В принципе, могу попробовать переделать IdTech 2 под свои нужды для сервера, но я хочу именно разобраться в данном вопросе и создать свой собственный сервер на блице.
зыЖ Свой код приводить не буду, ибо проще изобрести CryEngine 4, чем разобраться в моём творчестве. Да никто этого делать и не будет, наверно.