|
|
|
Канал Игры Мечты: «MMO Space c 30K пользователей.» |
|
|
Guest
2075 EGP
              Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004
 |
|
Sh.Tac. : |
допустим 100 + 100 это примерно 240 входящих на клиент датаграмм в секунду по полкило кажная
|
ИМХО, искать другую структуру передаваемых данных. Слишком резкое возрастание прокачиваемого траффика от кол-ва пользователей.
Конечно, это только со стороны сервера, хотя как посмотреть... игрокам нужно отображение других игроков. Но каждого с каждым - это всё же перебор с большим отрывом...
добавлено спустя 2 минуты:
С двадцатой стороны - при необходимости можно наверное как-то распределённую систему принятия данных организовать, гейты... 1мбод - всё же для сервера не слишком толстый канал, можно и 10мбод...
Но 30К...
_________________ Трещит земля как пустой орех
Как щепка трещит броня
Последний раз редактировалось: Guest (04:26 18-08-2009), всего редактировалось 1 раз |
|
|
VBKesha
817 EGP
      Рейтинг канала: 3(31) Репутация: 132 Сообщения: 3330 Откуда: обл.Брянская г. Трубчевск Зарегистрирован: 07.12.2005
 |
|
Хм а может поделить на зоны....
Тоесть в
1) Объект пределах досигаемости воздействия игроком сервер передаёт данные раз в Х
2) Объект в зоне которая может быстро стать зоной досигаемости передаём в X/1.5
3) объект в зоне видимости но дальще второй зоны пердаём X/2
4) объект в зоне видимости но ещё дальше чем 3 передаём в X/3
По идее это может дать неплохой разгруз без явных последствий.
|
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Все проще... Итак, общий вид пакета:
BYTE PacketId
[WORD PacketSize]
DATA PacketData
Размер пакета указывается только если пакет динамической длинны.
Далее, По поводу положений и прочей ерундистики:
Положение корабля игрока - float'ы, а вот других игроков - Word. Поясняю:
Такой девайс как радар будет? У него максимальный "взгляд" будет? Вот внутри него с точность в 65536 по каждой из осей - достаточно.
Итого:
4 Байта ID + 6 Байт Позишн + 3 байта Ориентация (360 переводим в 256 и 3 оси. Достаточно для отображения. Остальное зашлифуем кубическии сплайнами) итого 13 байт на пользователя.
Итого:
Из 512 байт (так как в 576 - 64 это IP и UDP/TCP заголовок, если кто не знал):
18 байт на околовсяческое
494 на данные, что равносильно: 38 пользователям, не считая себя самого.
добавлено спустя 1 минуту:
То есть без разбиения пакетов мы можем видеть 38 (округлим до 35) других корабликов. Очень неплохо ИМХО.
добавлено спустя 2 минуты:
Да, не забываем про выстелы, (вектор есть, есть скорость начальная. Все) и ракеты (сиречь АИ корабли)
_________________ WARNING: By reading this post you accept that this post is genius.
Последний раз редактировалось: Варсик (12:33 18-08-2009), всего редактировалось 2 раз(а) |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Тут подумал... Предлагаю систематезировать данные... У нас для каждого объекта есть 2 набора данных: В Пространстве CPU и в пространстве GPU (будем их называть как CPU и GPU).
Итак, пробуем систематизировать...
Объект: Движущееся тело в космосе
Свойства:
X, Y, Z : Float (Возможно Extended) GPU
Vx, Vy, Vz : Float GPU
Теперь что делать тут: Или сразу переходить на Силу (ИМХО неверно) или на Импульс (Тогда можно просчитывать столкновения).
Если на импульсы, то:
Ix Iy Iz : Float (Возможно Extended) GPU
И сразу:
dI : Float (Возможно Extended) GPU - Мощность двигателя. Грубо говоря "Количество импульса, генерируемое за 1 такт".
+ 3 Угла. (Как назвать-то) GPU
R : Float - Радиус сферы корабля.
Теоретически этого хватит для просчета всего, чего только надо. Ну на первых порах. Потом R может замениться на геометрию корабля для просчета столкновений/попаданий
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
Guest : |
1мбод - всё же для сервера не слишком толстый канал
|
это, напомню, для одного клиента
сервер размножает пакеты для кажного из них, следовательно надо слегка домножить на 200 чтобы оценить исходящий трафик
теоретически есть возможность разослать одну и туже датаграмму нескольким адресатам пока TTL позволяет
практически так никто не делает
VBKesha : |
может поделить на зоны
|
мысля здравая
тока надо ограничить скорость, а то всегда может найтись такая скорость когда ты вроде бы в самой дальней зоне, а в следующий миг уже рядом
Warstone : |
Размер пакета указывается только если пакет динамической длинны
|
аллокации памяти на приёме и при отправке пакета... - поубывав б
Цитата: |
По поводу положений и прочей ерундистики
|
присланный кватернион позволяет элегантно сделать slerp подобно параллельному переносу координат
Цитата: |
64 это IP и UDP/TCP заголовок, если кто не знал
|
это максимум в теории
обычно совместный заголовок IP/UDP составляет 24 байта EDIT: (ч0рд... это псевдозаголовок, ещё нуна 8 байт на порты и контрольные суммы)
но закладываться на это дело понятно не стоит
так что истина где-то посередине
Цитата: |
не забываем про выстелы
|
это вообще отдельная песня, с системой движения я бы не смешивал
если честно я вообще пока не понимаю как можно послать выстрел по UDP?
он же может лекго тю-тю или придти пару раз, но вот в кваке это как-то сделано, есть повод поинтересоваться
_________________ This is what you get ...
(c) Radiohead
Последний раз редактировалось: Sh.Tac. (00:02 19-08-2009), всего редактировалось 1 раз |
|
|
Guest
2075 EGP
              Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004
 |
|
Sh.Tac. : |
он же может лекго тю-тю или придти пару раз
|
Дык метку времени ещё никто не отменял. Тю-тю может, а два раза - найн.
_________________ Трещит земля как пустой орех
Как щепка трещит броня
Последний раз редактировалось: Guest (04:42 19-08-2009), всего редактировалось 1 раз |
|
|
VBKesha
817 EGP
      Рейтинг канала: 3(31) Репутация: 132 Сообщения: 3330 Откуда: обл.Брянская г. Трубчевск Зарегистрирован: 07.12.2005
 |
|
Sh.Tac. : |
тока надо ограничить скорость, а то всегда может найтись такая скорость когда ты вроде бы в самой дальней зоне, а в следующий миг уже рядом Улыбка
|
Можно попробовать расчитывать это на сервере, учитывая скорость и вектор движения этого шумахера.
|
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Sh.Tac. : |
аллокации памяти на приёме и при отправке пакета... - поубывав б
|
А если еще раз подумать, то будет ясно что больше 64Кб пакет быть не может. Вопрос сколько аллокировать все еще стоит?
Sh.Tac. : |
это максимум в теории
|
RFC791 (Протокол IP):
Цитата: |
IHL (длина Internet заголовка) 4 бита
Длина Internet заголовка измеряется в словах по 32 бита каждый и указывает на начало поля данных. Заметим, что корректный заголовок может иметь минимальный размер 5 слов.
|
5 * 4 = 20 байт минимум в заголовке IP (реально - 32)
RFC768 (Протокол UDP): Заголовок 8 байт.
Итого: 28 - 40 байт это заголовок.
Согласен, я спутал с TCP заголовком. Он еще 32 байта.
Sh.Tac. : |
присланный кватернион позволяет элегантно сделать slerp
|
Кстати, дайте что-нить почитать про кватернион, а то я все как-то больше в векторах и матрицах оперировал.
Но по существу, предложенный мной вариант кодирования информации о пользователи подходит?
_________________ WARNING: By reading this post you accept that this post is genius.
Последний раз редактировалось: Варсик (09:36 19-08-2009), всего редактировалось 1 раз |
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
Guest : |
Дык метку времени ещё никто не отменял.
|
чего-то напряжно как-то хранить ещё историю недавно пришедших отметок для кажного клееента
VBKesha : |
расчитывать это на сервере, учитывая скорость и вектор движения этого шумахера.
|
есть смысл вообще не передавать смещения которые, скажем, меньше текущего расстояния в const раз
Warstone : |
предложенный мной вариант кодирования информации о пользователи подходит?
|
для 2d отлично подходит
Цитата: |
дайте что-нить почитать про кватернион
|
читать можно очень долго, разные источники
например
http://www.gamedev.ru/articles/?id=30129
я читать начал давно и даже пользоваться ими, а более-менее осознал только вот-вот
вкратце кватернион хранит ось и угол поворота вокруг этой оси
произвольный разворот текущей оси достигается тупо умножением на другой кватернион
есть возможность интерполировать вращения и получать матрицу 3х3
Цитата: |
А если еще раз подумать, то будет ясно что больше 64Кб пакет быть не может. Вопрос сколько аллокировать все еще стоит?
|
э-м-м-м... всегда работать со структурой в 64К на один пакет?
_________________ This is what you get ...
(c) Radiohead |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Sh.Tac. : |
э-м-м-м... всегда работать со структурой в 64К на один пакет?
|
Для одного пакета (имеется в виду игрового) всегда достаточно 64Кб. То, что мы задаем размер пакета 2-мя байтами гарантирует нам тот факт, что пакет больше 65536 байт быть не может. Если пакет фиксированной длинны, практика показывает, что фиксированных пакетов больше 1Кб размером не бывает. Если-же мы говорим о приеме, то тут есть некоторый прикол: Смотря как принимать. Если доверять системному буферу, то всегда читаем столько, сколько нам осталось до 64Кб. Это гарантирует то, что мы никогда не нарвемся на ситуацию что буфер загружен полностью, но пакет принят не до конца. Если-же не доверять системному буферу (ну не совсем доверять), то размер буфера должен быть 64Кб + размер системного буфера. Тогда мы в любом случае или получим пакет после чтения или не превысим размер буфера.
Да, вся вышеназванная логика относится скорее к TCP протоколу, который является поточным. UDP протокол проще и сложнее. В нем нельзя делать пакет больше 512 (давайте на этот размер заложимся) байт и тогда в пакете совершенно не надо держать его размер так как это уже лежит в заголовке. Тогда все гораздо проще: Мы или приняли пакет или нет. И тут размер всегда будет 576 (с заголовками) байт.
А нельзя, потому что иначе пакет будет биться и возможен неприход одной из частей пакета и, как результат, отвергание всего пакета еще ОС, в этом случае мы просто теряем часть удачно пришедшего пакета. Для минимизации такой вещи - UDP пакеты должны быть не разбиваемыми, как следствие 576 байт.
добавлено спустя 7 минут:
Sh.Tac. : |
для 2d отлично подходит
|
А для 3д? Может я и не прав насчет углов, но расстояние точно надо пересчитывать от наблюдателя (читать как от корабля). Тогда в любом случае будут минимальны погрешности. Хотя если брать 64К кликов по радару, то эти погрешности невидно. Если очень хочется, давайте возьмем 3 байта. Зернистость околорадарного пространства тогда будет 16М. Можно взять не 16Бит, а 18Бит (+1 байт), тогда зернистость будет 256К, а размер пакета увеличится ненамного.
добавлено спустя 3 минуты:
Sh.Tac. : |
читать можно очень долго, разные источники
|
Гм... Достаточно было сказать что это вектор и вращение по его оси... Только не понятно как 0 угол отмеряется.
_________________ WARNING: By reading this post you accept that this post is genius.
Последний раз редактировалось: Варсик (00:29 20-08-2009), всего редактировалось 4 раз(а) |
|
|
Sh.Tac.
151 EGP
  Рейтинг канала: 5(108) Репутация: 14 Сообщения: 1426
Зарегистрирован: 27.07.2005
 |
|
Warstone : |
расстояние точно надо пересчитывать от наблюдателя (читать как от корабля). Тогда в любом случае будут минимальны погрешности.
|
т.е. кажный игрок находится в (0,0,0) собственной системы координат?
без глобальной системы координат?
это как-то очень смело в духе ОТО
Цитата: |
если брать 64К кликов по радару
|
вот радар меня и смутил, это 2d радар?
а что будет, если смотреть невооружённым глазом из кокпита?
вообщё всё как-то очень тухло
впору задуматься о том, что бы тактическая информация, передавалась по UDP peer-to-peer...
валидация должна производиться подсчётом голосов, если много клиентов сказали, - "не верю, ты читер", такой читер отключается от "кластера", и соответствующая жалоба шлётся на сервер, чтобы он больше его не авторизовывал
_________________ This is what you get ...
(c) Radiohead |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Sh.Tac. : |
т.е. кажный игрок находится в (0,0,0) собственной системы координат?
|
Нет, все находятся в своих координатах...
Задача: Минимизировать данные, передаваемые по сети.
Дано: Надо передать координаты и направление всех кораблей в области видимости корабля (области видимости радара)
Допустим: Будем передавать не абсолютные координаты, а относительные. Центром координат в этом случае будет КА игрока. Тогда максимальное расстояние от КА до цели будет фиксировано (Расстоянием видимости радара), тогда разумно разбить это расстояние на n одинаковых отрезков по каждой из осей. Тогда разрешающей способностью передачи данных будет шаг, или видимость радара / n.
Заключение из вышесказанного: Фактически мы 1 вектор разложили на 2, зная что из 2-х последних векторов 1 - вектор положения КА игрока относительно начала координат, а 2-й вектор - вектор положения объекта наблюдения относительно КА игрока. Таким образом число n (2-й вектор) будет сравнительно небольшим (сравнительно с 1-м) и этим мы и воспользуемся. Для этого это n и введено. Я считаю, что будет достаточно точно передаваться местоположение объекта наблюдения, если n=65536 (2 байта).
Sh.Tac. : |
вот радар меня и смутил, это 2d радар?
|
Это 3д радар. А вообще все вышесказанное можно отскалить как на 2д так и на 3д.
Sh.Tac. : |
впору задуматься о том, что бы тактическая информация, передавалась по UDP peer-to-peer...
|
Вы даже не представляете геморой. Почему 30% пользователей имеют LowID в еМулах? Да потому что они сидят за фаерволлами. Фактически вы этих 30% пользователей отсекаете. вот этой фразой. Забудте как страшный сон. Раз и на всегда.
_________________ WARNING: By reading this post you accept that this post is genius. |
|
|
Guest
2075 EGP
              Рейтинг канала: 5(167) Репутация: 376 Сообщения: 27975 Откуда: Моск. Зарегистрирован: 12.10.2004
 |
|
Warstone : |
Гм... Достаточно было сказать что это вектор и вращение по его оси... Только не понятно как 0 угол отмеряется.
|
А что именно непонятно? Там не угол, а направление вектора.
[0,0,0,1] - нулевой q.
[0.5,0,0,0.5] - поворот вокруг оси х относительно предыдущего состояния.
Как именно повёрнут нод изначально - зависит от способа импортирования в приложение.
А дальше - трансформация может быть любой...
добавлено спустя 1 минуту:
Warstone : |
Допустим: Будем передавать не абсолютные координаты, а относительные.
|
Минус такого решения - при пропущенном пакете произойдёт рассинхронизация положения на сервере и клиенте - через один пакет сдвиг будет уже не торт.
_________________ Трещит земля как пустой орех
Как щепка трещит броня
Последний раз редактировалось: Guest (11:51 20-08-2009), всего редактировалось 1 раз |
|
|
Варсик
545 EGP
    Рейтинг канала: 4(81) Репутация: 117 Сообщения: 4041 Откуда: Москва Зарегистрирован: 22.12.2002
 |
|
Guest : |
Минус такого решения - при пропущенном пакете произойдёт рассинхронизация положения на сервере и клиенте - через один пакет сдвиг будет уже не торт.
|
Торт, если на клиенте делать обратную процедуру и в пакете посылать положения объекта наблюдения и положение КА. Тогда рывка не будет, а если и будет, то сплайны "замажут" )
_________________ WARNING: By reading this post you accept that this post is genius.
Последний раз редактировалось: Варсик (13:40 20-08-2009), всего редактировалось 1 раз |
|
|
|
|
|
Канал Игры Мечты: «MMO Space c 30K пользователей.» |
|