Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Попинайте архитектуру

Попинайте архитектуру

Страницы: 1 2 Следующая »
monobogdanПостоялецwww12 янв. 201818:20#0
Хочу сделать клиент/серверную пошаговую MMORPG.
Никакого рилтаймового движения нет, игрок просто пошагово передвигается по клеткам, даже о других игроках он не узнает пока не вступит в бой.
Как протокол выбрал TCP, т.к я думаю что он вполне сойдет для пошаговой игры(HTTP не стал выбирать по понятным причинам).
Структура пакетов:
Все пакеты имеют фиксированную длину 1024 байта.

Пример сообщения:

struct msgRegister {
   unsigned char msgid;
   char username[32];
   char password[32];
   char garbage[959];
};

...

msgRegister reg;
memset(&reg, 0, sizeof(msgRegister));
reg.msgid = MSG_REGISTER;
reg.username = "test";
reg.password = "1234";
send(sock, &reg, maxPackageLen);

Заморачиваться с техниками типа в самом начале пакета хранить его размер и затем получать по кускам его я не стал т.к 1024 байта по идее должно хватить на всё.
Трафик вроде бы не очень большой будет учитывая что сообщения будут отправляться не так часто как скажем в CS:GO или доте
1 байт - msgid т.е идентификатор сообщения, что хочет послать клиент.
1023 байта - аргументы.
Реализовывать собрался на обычных берклиевских сокетах, без доп. либ.
Попинайте архитектуру, подскажите может что можно улучшить, может что не так и может потом всплыть?

Подключения постоянно дергаются

Правка: 12 янв. 2018 19:37

ZabПостоялецwww12 янв. 201818:26#1
Уверен, что в твою игру не захотят поиграть через какой-нибудь GPRS? Это для Москвы производительности сети хватит с запасом, но есть и другие регионы, связь везде разная.
monobogdanПостоялецwww12 янв. 201818:32#2
Zab
Ну TCP же гарантирует доставку пакетов в заданном порядке.
Пакеты не так уж часто буду отправляться, например пошел с одной клетки на другую, ждёшь 30 секунд, ещё ходишь и.т.п.
Разве 1024 байта для жопореза это много? Или вопрос именно в стабильности?
Я тут что то подумал что про пакеты в 1024 байта это немного притянуто за уши.
Только вопрос в том что recv отбросит оставшиеся байты и по идее их получить нельзя будет.
Можно получать только id пакета, на основе id пакета искать ассоциированную с этим пакетом структуру и получать оставшиеся байты.
Типа
unsigned char msgid;
int msglen;
void* data;
recv(sock, &msgid, sizeof(unsigned char), MSG_WAITALL);
msglen = msgHandler->getMessageLength(msgid);
data = malloc(msglen);
recv(sock, &data, msglen, MSG_WAITALL);
msgHandler->handleMsg(msgid, data);

Правка: 12 янв. 2018 18:38

ZabПостоялецwww12 янв. 201818:45#3
monobogdan
> Ну TCP же гарантирует доставку пакетов в заданном порядке.
TCP гарантирует постепенно нарастающие тормоза, вплоть до лага секунд в 30, после которого идет разрыв соединения, если производительности сети хоть чуть-чуть не хватает.

А "пакетов" в TCP вообще нет, есть поток байт, который по дороге перенарезается как ему хочется.

monobogdanПостоялецwww12 янв. 201818:47#4
Zab
Всмысле? С UDP путаешь же. Можешь пример привести когда TCP начинает себя вести неадекватно?
ZabПостоялецwww12 янв. 201818:52#5
С UDP как раз все просто. Не хватает чего-нибудь - пакет теряется, имеет право. TCP же упорно пытается доставить все в целости, зашиваясь все больше и больше, пока не нарвется на ограничение таймаутов.

Пример неадекватного поведения получить легко, берешь любую игрушку, юзающую tcp, wow например, устанавливаешь в настройках более мощную сеть, чем реально есть у тебя - получаешь полную неадекватность.

monobogdanПостоялецwww12 янв. 201818:56#6
Zab
WOW точно юзает TCP а не UDP, именно для игры или просто получения информации о сервере? Просто вроде есть надстройка над UDP, RUDP которая может гарантировать порядок пакетов и у нее есть приоритеты(типа пакет то что ты выстрелил важно доставить, а допустим пакет о том что игрок переместился неважно(т.к всё равно мир постоянно обновляется)) но работает быстрее TCP.

Правка: 12 янв. 2018 18:58

ZabПостоялецwww12 янв. 201819:01#7
monobogdan
WOW юзает tcp. И не только WOW, недавно с удивлением узнал, что линейка тоже целиком на tcp.
monobogdanПостоялецwww12 янв. 201819:05#8
Zab
И почему? Когда есть RUDP?
ZabПостоялецwww12 янв. 201819:15#9
monobogdan
> И почему? Когда есть RUDP?
Не знаю. Выбор разработчиков таков.
Чаще выбирают UDP, в аналогичных ситуациях. Наиболее массовые рассылки делаются вообще независимыми от порядка доставки и гарантированности. Незачем перепосылать координаты, если любое следующее обновление исправит ситуацию. Для части пакетов организуют переучет и перепосылку.
Если надо работать p2p, то и выбора нет, tcp не будет работать в таких условиях.

Но бывают и извраты, SIP-протокол, к примеру, который был бы очень простым и понятным, будь он сделан поверх tcp, но там наворотили "независимость" от средств доставки. И это при крайне низких требованиях к производительности сети, трафик там минимальный.

monobogdanПостоялецwww12 янв. 201819:37#10
А вообще как думаете, нормальная архитектура пакетов для игры?
ZabПостоялецwww12 янв. 201819:44#11
monobogdan
> А вообще как думаете, нормальная архитектура пакетов для игры?
Неэффективная. Много лишнего будет по сети гулять. Зато протокол прост до невозможности. Если есть ресурсы, которые можно растранжирить - почему бы и нет...
ZabПостоялецwww12 янв. 201819:48#12
Зачем имя и пароль в каждом сообщении? После установки соединения по tcp, вклиниться туда уже никто не может, достаточно один раз авторизоваться.
monobogdanПостоялецwww12 янв. 201819:59#13
Zab
Это пример пакета который заставит сервер зарегистрировать новый аккаунт.
Само собой сервер вернет сессию которая и будет посылаться в остальных пакетах.
Систему сессий я тоже продумал. Будет примерно как в пыхе.
Типа:
typedef struct {
  char username[32];
  char password[32];
} Session;

...

CSession* CSessionFactory::StartSession(Session* session) {
    return new CSession(session->username, session->password);
}

Правка: 12 янв. 2018 20:05

ZabПостоялецwww12 янв. 201820:58#14
Пароль в открытую по сети не пересылают. Перехватят. Вместо пароля посылают его хеш.
Страницы: 1 2 Следующая »

/ Форум / Программирование игр / Сеть

2001—2018 © GameDev.ru — Разработка игр