Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обмен данными: Клиент 3Д<->Сервер

24K
17 октября 2007 года
Delta_Q
26 / / 06.09.2007
Я тут сделал обмен данными между клиентом и сервером.
И возник вопрос..
Как реализовать обмен информацией между клиентской частью и серверной так чтобы они как можно меньше загружали друг друга.
Т.е. клиентская часть постоянно отправляет данные о местоположении игрока. С координатами по 3 осям а также дополнительную инфомацию. В тоже время серверная часть постоянно перебирает масивы с базами данных об объектах окружения игрока и передает ему данные об положениях и свойствах окружающих 3Д обектах.
Мне совершенно не понравилось как у меня это работает. ФПС-ы в клиентской части упали с 800 до 60 это крайне нехорошо.
И тут возникает вопрос, можно ли гдето почитать как реализуют систему обмена между Клиентской и серверной частью в играх где Он-лайн свыше 1000 ?
13K
17 октября 2007 года
specter
113 / / 28.09.2007
Цитата: Delta_Q
Я тут сделал обмен данными между клиентом и сервером.
И возник вопрос..
Как реализовать обмен информацией между клиентской частью и серверной так чтобы они как можно меньше загружали друг друга.
Т.е. клиентская часть постоянно отправляет данные о местоположении игрока. С координатами по 3 осям а также дополнительную инфомацию. В тоже время серверная часть постоянно перебирает масивы с базами данных об объектах окружения игрока и передает ему данные об положениях и свойствах окружающих 3Д обектах.
Мне совершенно не понравилось как у меня это работает. ФПС-ы в клиентской части упали с 800 до 60 это крайне нехорошо.
И тут возникает вопрос, можно ли гдето почитать как реализуют систему обмена между Клиентской и серверной частью в играх где Он-лайн свыше 1000 ?


Скажу из игр в которые я играл:
Ultima Online (конечно не 3д, но онлайн приличный) - все действия клиента передаются на сервер (абсолютно все)... а сервер говорит можно ли это действие выполнить... а вот информация о всех объектах вокруг хранится на клиентской машине
WoW - информация об объектах на клиентской машине, но есть оптимизация - для каждого действия не нужно подтверждение с сервера... сервер говорит только положение монстров/игроков

Итог - твою клиентскую часть сильно тормозят объекты, которые передаются с сервера... попробуй статику впихнуть сразу в клиента

24K
17 октября 2007 года
Delta_Q
26 / / 06.09.2007
Цитата: specter
Скажу из игр в которые я играл:
Ultima Online (конечно не 3д, но онлайн приличный) - все действия клиента передаются на сервер (абсолютно все)... а сервер говорит можно ли это действие выполнить... а вот информация о всех объектах вокруг хранится на клиентской машине
WoW - информация об объектах на клиентской машине, но есть оптимизация - для каждого действия не нужно подтверждение с сервера... сервер говорит только положение монстров/игроков

Итог - твою клиентскую часть сильно тормозят объекты, которые передаются с сервера... попробуй статику впихнуть сразу в клиента



Ну текструы и модельки и вся графика находитсья в клиентской части.
Статические объекты типа Город или лесистая местность передаетсья от сервера 1 раз когда клиент сообщает что вошол в локацию сервер ему выплевывает информацию о том какой объект где расставить в сцене и все после этого сервер посылает сигнал о начале того что сцена загружена и клиент может начать реинлдеринг сцены, передает тока информацию о динамических объектах. Но он передает это постоянно
Я вот уже думаю о том чтобы передовать данные о динамических моделях тока в том случаи если предмет начал менять свои свойства или координаты.
Хранить данные об свойсвах объекта в клиентской части плохо ибо это приведет к читерству. Пример этого тотже самый ВоВ. куча читов к нему наделали люди в свое время.
Я просто к чему поднял этот топик, хочеться увидить блок схему работы как реализовано это к примеру в других он-лайн играх.

13K
17 октября 2007 года
specter
113 / / 28.09.2007
Цитата: Delta_Q
Ну текструы и модельки и вся графика
Я просто к чему поднял этот топик, хочеться увидить блок схему работы как реализовано это к примеру в других он-лайн играх.


Блок схему тебе никто не даст, так как тут скорее всего нет разработчиков таких игр... хотя хто знает ;)

240
17 октября 2007 года
aks
2.5K / / 14.07.2006
На самом деле подобная тема уже понималась. И не одну страницу там обсуждали. Поищи поиском. Там автор делал open source стрелялку и обсуждал как от читов обезопасить клиентскую часть.
398
17 октября 2007 года
Alexandoros
630 / / 21.10.2005
Цитата: Delta_Q

Хранить данные об свойсвах объекта в клиентской части плохо ибо это приведет к читерству. Пример этого тотже самый ВоВ. куча читов к нему наделали люди в свое время.
Я просто к чему поднял этот топик, хочеться увидить блок схему работы как реализовано это к примеру в других он-лайн играх.


Именно поэтому читы есть ко всем играм. По другому никак - все онлайн игры имеют довольно "толстые" клиенты. Дабы уменшить нагрузку на сеть.

534
17 октября 2007 года
HarryAxe
448 / / 19.01.2006
Цитата: Delta_Q
Я вот уже думаю о том чтобы передовать данные о динамических моделях тока в том случаи если предмет начал менять свои свойства или координаты.


Ох, и что ж ты сразу-то об этом не подумал? Теперь всё переделывать.
Клиент дожен передавать информацию лишь о том, что производит какое-либо действие. Действие может быть проведено успешно, а может быть отклонено серверной частью. Если клиент не инициирует действий, о которых необходимо знать другим клиентам, никакой передачи данных клиентской частью производиться не должно. Аналогично, сервер передаёт информацию о действиях, которые необходимо синхронизировать с остальными клиентами, лишь в том случае, если таковые имели место и были одобрены серверной частью приложения.

24K
17 октября 2007 года
Delta_Q
26 / / 06.09.2007
Ничего страшного, переделаю. :) (Я уже 2 варианат переделал.)
За советы спасибо, есть пищья для размышления.
А защититься от вских читов на свете конешно невозможно, на каждую жопу найдеться свой болт :)

Вот такая например мысля. Игрок движетсья по 3Д миру мне передовать данные об изменении игрока постоянно или предположим каждые 10 миллисекунд? Т.е наскоко часто передовать данные при активных действиях?
534
18 октября 2007 года
HarryAxe
448 / / 19.01.2006
По мере их возникновения. К примеру, "объект начал движение в направлении ...", "объект изменил направление движения на ...", "объект закончил движение". Если нагрузка на сеть настолько велика, что сервер не может обработать информацию вовремя, он может просто запросить точную информацию о состоянии объекта, и выбросить предыдущие информационные пакеты из очереди.
24K
21 октября 2007 года
Delta_Q
26 / / 06.09.2007
Когда выделяю облость памяти методом new значения переменныйх оказываются не нулевыми, а случайными (мусор памяти) как обнулить весь массив или созданный тип одним махом таким методом?
 
Код:
nPlayer* Data = new nPlayer;

или в ручную, самому каждый элемент обнулять?
240
21 октября 2007 года
aks
2.5K / / 14.07.2006
Че последним сообещием сказать хотел?
24K
22 октября 2007 года
Delta_Q
26 / / 06.09.2007
Я нашол ответ на свой вопрос: memset
350
29 октября 2007 года
cheburator
589 / / 01.06.2006
Я обменивался сообщениями каждые 20 мс примерно, поскольку не смог по-человечески ждать сообщений на сокете. Неблокирующие сокеты - сложноватая вещь, по крайней мере я в них толком не разобрался. Каждые 20 мс - нормально, у меня процессор не поднялся выше 0%
350
29 октября 2007 года
cheburator
589 / / 01.06.2006
Я обменивался сообщениями каждые 20 мс примерно, поскольку не смог по-человечески ждать сообщений на сокете. Неблокирующие сокеты - сложноватая вещь, по крайней мере я в них толком не разобрался. Каждые 20 мс - нормально, у меня процессор не поднялся выше 0%


Извините за дубль. Удаляйте
24K
29 октября 2007 года
Delta_Q
26 / / 06.09.2007
А сколько клиентов обрабатывала серверная часть? Или на какое максимальное число соединений был расчитан сервер?
350
07 ноября 2007 года
cheburator
589 / / 01.06.2006
Цитата: Delta_Q
А сколько клиентов обрабатывала серверная часть? Или на какое максимальное число соединений был расчитан сервер?



Ограничений на сервере по количеству соединений не было.
Реально проверялось на 3 клиентах, понимаю - это немного, но разницы между 1 или 3 клиентами замечено не было.
Думаю, если сервак многопроцессорный и на каждого клиента по потоку, потерь больших не будет.

350
07 ноября 2007 года
cheburator
589 / / 01.06.2006
В общем, цикл примерно такой (на каждом клиентском потоке).
Код:
while (true)
{
  WaitForMultipleObjects (/*объекты - сигнал о завершении сервера, и всякие другие объекты*/, 20)  // 20 - время в миллисекундах
  if (объект == завершитьСервак)
  {
    ЗавершитьСервак();
    return;
  }
  //обрабатываем другие объекты
  ....
  // Если пришли сюда - значит произошел выход из функции WaitForMultipleObjects в результате таймаута. Тут можно обменяться данными с клиентом
  // Обмен данными (досрочный) возможен и в другие моменты времени, к примеру, при срабатывании одного из объектов синхронизации в WaitForMultipleObjects
}

А если проблемы с нагрузкой на сервер - надо ставить многопроцессорный :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог