Исходный код
#1
Отправлено 21 November 2004 - 20:53
#2
Отправлено 22 November 2004 - 09:23
#3
Отправлено 23 November 2004 - 17:12
#4
Отправлено 05 January 2005 - 02:33
#5
Отправлено 05 January 2005 - 11:31
#6
Отправлено 05 January 2005 - 18:45
#7
Отправлено 06 January 2005 - 00:27
#8
Отправлено 06 January 2005 - 10:07
А то раздел "Статьи" давно не обновлялся. :wink:
Даешь статью!
#9
Отправлено 06 January 2005 - 12:05
#10
Отправлено 06 January 2005 - 13:41
В любом случае, все будет применительно к нашему жанру, т.е. буквально по нашей игре, не расчитаной, например, на сотни юнитов на карте... Так сказать, на стратегию среднего звена.
P.S.: Сайт тут может полежать пару дней за неоплату, так что без паники...
#11
Отправлено 06 January 2005 - 14:28
1) сервер для каждого пользователя создает свой поток или все в цикле?
2) где юзается TCP, а где UDP?
3) есть ли процессы, которые инициализируются и на сервере и на клиенте, а далее развиваются одинаково без передачи данных, только в ключевых моментах происходит синхронизация?
4) на чем построена база данных с сейвами персонажей?
5) передаваемые блоки данных кодируются? сжимаются? если да, то какими алгоритмами?
6) расскажите о подводных камнях? о вещах, казавшихся очевидными, из-за чего их потом пришлось переделывать...
#12
Отправлено 06 January 2005 - 15:08
1) На одного клиента - один поток. Это особенность функционирования библиотеки Indy. При количестве клиентов в 2-3 сотни это не страшно. При большем может быть плохо . Хотя это все вопрос производительности...
2) У нас юзается только TCP. У нас практически нет данных, которые являются "необязательными", т.е. тех, которые могут не дойти, и ничего страшного не произойдет. Есть несколько исключений, но они происходят так редко, что организовывать ради них отдельный канал передачи данных нецелесообразно.
3) Нет, таких параллельных процессов нет. Есть только данные, которые расчитываются на сервере, и на клиенте (например, характеристики персонажа, значение ползунка жизни над головами персов). Такие значения, будучи изменены читерами, никак не повлияют на процесс игры и вызовут только глюки у клиента.
4) Сами аккаунты хранятся в MySQL (в непубличном варианте сервера, который пока не выкладывался). А вот предметы инвентаря/банка думаем хранить в файлах, т.к. иначе база грозит вырасти до безумных размеров... Да и на запросы уходит весьма конкретное время.
5) Во-первых, отключен Nagle-алгоритм. Во вторых, для минимизации затрат трафика на заголовки TCP-пакетов, от сервера к каждому клиенту уходит не более 10 физических TCP/IP пакетов в секунду. Исключение - пакеты с пингом. Реализовано это следующим образом. У сервера есть исходящий буфер (на каждого клиента). В секунду от сервера может уходить до нескольких сотен игровых пакетов, но они не отправляются сразу, а дописываются в конец буфера. Раз в 100ms сервер отправляет накопившееся сообщения в виде одного TCP пакета. Причем если размер пакета превышает 50 байт (или 100, не важно), пакет сжимается ZLib'ом. В будущем добавлю шифрование. По понятным причинам я не могу назвать конкретный используемый алгоритм (хотя когда то уже упоминал), но могу сказать, что юзается библиотка DCPCript (кажется так). Соответственно, клиент, принимая большой пакет, раскладывает его на множество мелких игровых и обрабатывает со скоростью 500 в секунду.
5) С этим сложнее... Таких явных подводных камней вроде не видно... Главное - отрубить сразу Nagle, а то я очень долго не понимал, почему при минимальной активности персов начинает рости пинг.
#13
Отправлено 07 January 2005 - 02:26
И еще, весьма интересна зависимость между
- скоростью соединения,
- количеством игроков,
- пингом,
- размером игрового пакета.
То есть какой должен быть размер пакета, чтобы при N игроков и известной скорости соединения пинг был не выше 200, чтобы не лагало. Для клиента этот вопрос понятное дело.
Это не простой вопрос, поэтому ответ устроит приближенный:)
#14
Отправлено 07 January 2005 - 11:42
Я расчитываю на трафик в пределах 2-3KB в секунду. Можно попробовать посчитать, что это означает на практике... Итак, самый большой поток данных идет во время движения персонажей, т.е. "труба" наступает тогда, когда мноэжество персов начинает бегать вокруг. Персы двигаются, насколько я помню, со скоростью 3-4 клетки в секунду (максимум, при нулевой загрузке). Ну, будем считать по максимуму, 4... Один пакет сведений о перемещении юнита занимает 6 байт. А мы имеем условный предел в 2.5KB. Из этих 2.5 надо сразу отнять размер 10 TCP/IP заголовков. Ну, путь они по 100 байт (с двухкратным запасом). Итого - 1KB на заголовки. Осталось 1.5KB для данных. Один пакет - 6 байт, значит в наши 1.5KB влезает 250 пакетов. Это эквивалентно примерно 50-60 игрокам в зоне 70x70 клеток вокруг игрока. Если учесть, что реальная средняя скорость передвижения будет ниже, что на заголовки можно отпускать не 1KB, а 0.5, что модем 33'600 вполне пропускает и 3KB, допустимый порог еще возрастает
Пинг будет оказывать небольшое влияние... Гораздо сильнее влияние лагов... Пинг будет, по сути, означать реакцию сервера на команды клиента. У нас пинг имеет именно это значение, т.е. время прохождения пакета от клиента к серверц и обратно.
Ну вот разве что так . Подробнее трудно...
#15
Отправлено 07 January 2005 - 15:12
#16
Отправлено 07 January 2005 - 16:30
#17
Отправлено 08 January 2005 - 04:59
#18
Отправлено 03 March 2005 - 03:10
#19
Отправлено 03 March 2005 - 06:44
С PBuffer'ом была только одна проблема - нужнсделать glShareList (кажется так), чтобы списки текстур на всех контекстах были идентичны. А то модель будет выводиться в буфер, а текстура - нет.
Указанных файлов у меня нет, ибо пишу на Delphi
#20
Отправлено 06 March 2005 - 04:07