Обмен данными: Клиент 3Д<->Сервер
И возник вопрос..
Как реализовать обмен информацией между клиентской частью и серверной так чтобы они как можно меньше загружали друг друга.
Т.е. клиентская часть постоянно отправляет данные о местоположении игрока. С координатами по 3 осям а также дополнительную инфомацию. В тоже время серверная часть постоянно перебирает масивы с базами данных об объектах окружения игрока и передает ему данные об положениях и свойствах окружающих 3Д обектах.
Мне совершенно не понравилось как у меня это работает. ФПС-ы в клиентской части упали с 800 до 60 это крайне нехорошо.
И тут возникает вопрос, можно ли гдето почитать как реализуют систему обмена между Клиентской и серверной частью в играх где Он-лайн свыше 1000 ?
И возник вопрос..
Как реализовать обмен информацией между клиентской частью и серверной так чтобы они как можно меньше загружали друг друга.
Т.е. клиентская часть постоянно отправляет данные о местоположении игрока. С координатами по 3 осям а также дополнительную инфомацию. В тоже время серверная часть постоянно перебирает масивы с базами данных об объектах окружения игрока и передает ему данные об положениях и свойствах окружающих 3Д обектах.
Мне совершенно не понравилось как у меня это работает. ФПС-ы в клиентской части упали с 800 до 60 это крайне нехорошо.
И тут возникает вопрос, можно ли гдето почитать как реализуют систему обмена между Клиентской и серверной частью в играх где Он-лайн свыше 1000 ?
Скажу из игр в которые я играл:
Ultima Online (конечно не 3д, но онлайн приличный) - все действия клиента передаются на сервер (абсолютно все)... а сервер говорит можно ли это действие выполнить... а вот информация о всех объектах вокруг хранится на клиентской машине
WoW - информация об объектах на клиентской машине, но есть оптимизация - для каждого действия не нужно подтверждение с сервера... сервер говорит только положение монстров/игроков
Итог - твою клиентскую часть сильно тормозят объекты, которые передаются с сервера... попробуй статику впихнуть сразу в клиента
Ultima Online (конечно не 3д, но онлайн приличный) - все действия клиента передаются на сервер (абсолютно все)... а сервер говорит можно ли это действие выполнить... а вот информация о всех объектах вокруг хранится на клиентской машине
WoW - информация об объектах на клиентской машине, но есть оптимизация - для каждого действия не нужно подтверждение с сервера... сервер говорит только положение монстров/игроков
Итог - твою клиентскую часть сильно тормозят объекты, которые передаются с сервера... попробуй статику впихнуть сразу в клиента
Ну текструы и модельки и вся графика находитсья в клиентской части.
Статические объекты типа Город или лесистая местность передаетсья от сервера 1 раз когда клиент сообщает что вошол в локацию сервер ему выплевывает информацию о том какой объект где расставить в сцене и все после этого сервер посылает сигнал о начале того что сцена загружена и клиент может начать реинлдеринг сцены, передает тока информацию о динамических объектах. Но он передает это постоянно
Я вот уже думаю о том чтобы передовать данные о динамических моделях тока в том случаи если предмет начал менять свои свойства или координаты.
Хранить данные об свойсвах объекта в клиентской части плохо ибо это приведет к читерству. Пример этого тотже самый ВоВ. куча читов к нему наделали люди в свое время.
Я просто к чему поднял этот топик, хочеться увидить блок схему работы как реализовано это к примеру в других он-лайн играх.
Я просто к чему поднял этот топик, хочеться увидить блок схему работы как реализовано это к примеру в других он-лайн играх.
Блок схему тебе никто не даст, так как тут скорее всего нет разработчиков таких игр... хотя хто знает ;)
Хранить данные об свойсвах объекта в клиентской части плохо ибо это приведет к читерству. Пример этого тотже самый ВоВ. куча читов к нему наделали люди в свое время.
Я просто к чему поднял этот топик, хочеться увидить блок схему работы как реализовано это к примеру в других он-лайн играх.
Именно поэтому читы есть ко всем играм. По другому никак - все онлайн игры имеют довольно "толстые" клиенты. Дабы уменшить нагрузку на сеть.
Ох, и что ж ты сразу-то об этом не подумал? Теперь всё переделывать.
Клиент дожен передавать информацию лишь о том, что производит какое-либо действие. Действие может быть проведено успешно, а может быть отклонено серверной частью. Если клиент не инициирует действий, о которых необходимо знать другим клиентам, никакой передачи данных клиентской частью производиться не должно. Аналогично, сервер передаёт информацию о действиях, которые необходимо синхронизировать с остальными клиентами, лишь в том случае, если таковые имели место и были одобрены серверной частью приложения.
За советы спасибо, есть пищья для размышления.
А защититься от вских читов на свете конешно невозможно, на каждую жопу найдеться свой болт :)
Вот такая например мысля. Игрок движетсья по 3Д миру мне передовать данные об изменении игрока постоянно или предположим каждые 10 миллисекунд? Т.е наскоко часто передовать данные при активных действиях?
или в ручную, самому каждый элемент обнулять?
Извините за дубль. Удаляйте
Ограничений на сервере по количеству соединений не было.
Реально проверялось на 3 клиентах, понимаю - это немного, но разницы между 1 или 3 клиентами замечено не было.
Думаю, если сервак многопроцессорный и на каждого клиента по потоку, потерь больших не будет.
{
WaitForMultipleObjects (/*объекты - сигнал о завершении сервера, и всякие другие объекты*/, 20) // 20 - время в миллисекундах
if (объект == завершитьСервак)
{
ЗавершитьСервак();
return;
}
//обрабатываем другие объекты
....
// Если пришли сюда - значит произошел выход из функции WaitForMultipleObjects в результате таймаута. Тут можно обменяться данными с клиентом
// Обмен данными (досрочный) возможен и в другие моменты времени, к примеру, при срабатывании одного из объектов синхронизации в WaitForMultipleObjects
}
А если проблемы с нагрузкой на сервер - надо ставить многопроцессорный :)