Как вы разрешаете писать сетевой код на более поздних этапах разработки?

12

В настоящее время я нахожусь на раннем этапе написания игры, которую я в конечном итоге захочу улучшить в большинстве аспектов.
Как я могу отказаться от написания сетевого кода, оставляя его довольно легко реализуемым, то есть не нужно переписывать всю игру, просто чтобы добавить ее.
Что я должен иметь в виду?

У меня есть шаблон компонентов, в котором я отделяю физику / обнаружение столкновений, игровую логику, типы данных и анимацию / рендеринг друг от друга.
Как написать клиент и сервер, на которых еще не реализован сетевой код, и которые можно протестировать локально?
Что я должен делать на клиенте и что я должен делать на сервере? Должен ли я просто притвориться, что у меня закончен сетевой код, и отправлять сообщения между сервером и клиентом и учетной записью для задержек и т. Д., Даже если их не будет?

Изменить: планируется быть сверху вниз RPG. Я думаю о простом мультиплеере, где вы размещаете сервер для своих друзей, поэтому обман не так уж и важен (кто хотел бы поиграть с обманщиками?). Тем не менее, я хотел бы пойти с подходом «сервер всегда прав».

Редактировать 2: Я думаю, что я ищу некоторые указатели на то, каким должно быть мое мышление. Как я должен обрабатывать ввод с клавиатуры, анимацию и т. Д. Вместо того, чтобы просто применять каждый эффект / изменение мгновенно. Хммм, мне, возможно, придется внимательно прочитать информацию о сети, прежде чем идти куда-либо, от чего я надеялся избежать создания сетевого скелета, который мог бы работать локально.

Ghork
источник
Это очень сильно зависит от того, как вы планируете реализовать свой сетевой код, как только доберетесь туда. Например, Quake (или какое-то более позднее название id, моя память немного нечеткая) использовал подход всегда быть клиент / сервер. Даже опция одиночной игры на самом деле подключается к серверу на 127.0.0.1 и не приглашает других игроков - это означает, что даже одиночная игра полностью выполняется через сетевой код.
LLL79
Это то, что я имел в виду. Может быть, какое-то межпроцессное взаимодействие, чтобы вам не нужно было подключаться, когда вы хотите играть в одиночку, или, возможно, класс, который имеет те же функции, что и клиент, но обрабатывает его как сервер прямо сейчас.
Хорк
3
Лучшая практика была "не" в течение достаточно долгого времени. Если вы не пишете пошаговую игру, вы просто должны по-другому проектировать вещи, чтобы справляться с сетью. Если вы заботитесь о задержке, правильности и мошенничестве, то просто не можете обойти это. Если вы этого не сделаете, вам на самом деле не нужно слишком много думать об этом - если у вас нет опыта, вы все равно не будете достаточно хорошо предсказывать правильный дизайн. Лучший способ - начать работу с парой сетевых прототипов, чтобы получить опыт работы в сети.
Луаан
Если вы думаете об этом, у Minecraft есть локальный сервер даже в одиночных играх. Сервер - это движок, клиент - просто презентатор.
SparK

Ответы:

12

Не зная больше о конкретной игре, которую вы пишете, и о том, как вы ее пишете, очень сложно найти общие решения вашей проблемы.

Тем не менее, вы можете подумать о том, что вы решите оставить сетевой код до конца, в зависимости от того, насколько важным является сетевое взаимодействие для вашей игры.

Я имею в виду, что если вы пишете тяжелую сетевую игру, такую ​​как MMORPG, возможно, не стоит оставлять сеть до конца.

С учетом этого, если ожидаемое влияние на сетевой код является низким (например, отсутствие сетевого кода вообще не является нарушителем игры), то может быть целесообразным оставить его на более позднем (но не слишком позднем) этапе.

Помните, что сетевой код написания - это не то же самое, что думать об этом. Когда вы принимаете решения о том, как создается ваша игра, вы должны учитывать, как это повлияет на сетевые решения, и, если ожидаемое влияние велико, возможно, реализуйте его как заглушку, дающую некоторую общую информацию, а затем, когда придет время писать сетевые код, это просто вопрос подключения туда, где вы оставили заглушку.

Так, например, если вы делаете онлайн-игру в шахматы, у вас может быть функция с именем, ExecuteMove()которая вызывается каким-либо образом, когда ход вводится мышью, и другим способом, когда ход вводится с клавиатуры. На этом этапе вы можете подумать о создании сетевой заглушки, которая после получения необходимых данных от другого хоста (это то, что вы пишете в более поздней части), вызывает ExecuteMove().

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

Если вы впервые пишете сетевую игру, не думайте слишком много об анти-мошенничестве и тому подобном. Создание сетевой игры достаточно сложно, для этого требуется целая команда высококвалифицированных людей сделать это для игры AAA, поэтому не торопитесь, и сначала сделайте игру, которая работает, прежде чем сосредоточиться на более сложных темах.

Наконец, если вы впервые создаете игру, не включайте ее в сеть, пожалуйста. Создание игры настолько сложно, что каждое требование, которое вы добавляете в свою игру, значительно усложняет ее.

Панда Пижама
источник
Ну, это не MMO, поэтому он не будет таким тяжелым в сети. Однако это не устаревшая настольная игра, в которой можно потратить несколько секунд, прежде чем сделать ход. Я чувствую, что об организации сети следует подумать с самого начала, потому что, по моему опыту, добавление мультиплеера на последних этапах не сработает. Однако я не хочу писать сетевой код и отлаживать его, прежде чем я смогу заставить своего персонажа двигаться и сталкиваться с объектами.
Хорк
2
@Ghork: Ах, вы хотите, чтобы ваш продукт делал красивые вещи как можно скорее! Ну, да, мы все делаем. Но уступить этому искушению не приведет к хорошо продуманной и продуманной программе.
Гонки легкости на орбите
Я приму этот ответ, хотя мне нравятся и другие ответы. Конкретно комментарий @Luaan
Ghork
2

Я нахожусь в подобной ситуации, но я пытаюсь сделать сетевое моделирование больше, чем игру; но я думаю, что мой подход может помочь вашему процессу проектирования.

Мой подход совпадает с вашим комментарием к IPC (межпроцессное взаимодействие).

Сначала я изучаю книгу Стида и Оливейры «Сетевая графика». Это обеспечивает хорошее представление о различных сетевых архитектурах для игр в зависимости от различных критериев и типов игр. Он предоставляет инструмент, который поможет вам определить архитектуру вашей игры и то, что именно вы хотите разместить в сети, и что вы хотите, чтобы происходило локально.

Во-вторых, разделите сетевые компоненты в отдельный фоновый поток, чтобы в вашей первоначальной разработке игры компонент был закодирован локально, но вы вынуждены иметь дело с разделением потоков. Не объединяйте их с какими-либо другими функциями, которые впоследствии станут «локальным фоном», но форсируйте их в «потенциально удаленные» фоновые потоки.

Это должно помочь отделить вашу логику, а также позволит вам симулировать сетевые факторы задержки в процессе, чтобы вы также могли видеть влияние задержки.

Джо Ван Стин
источник
Думаю, тогда мне придется проверить эту книгу! Звучит многообещающе, быть способным делать то, что ты сказал.
Горк
@Ghork: ключ в выяснении вашей архитектуры, что вы хотите локально и что вы хотите на сервере; или как вы хотите, чтобы сверстники общались и взаимодействовали. Эта книга должна помочь. Затем поместите все, что вы хотите удаленно, на другую сторону вызова сообщения IPC через набор кода клиент-сервер, который (на данный момент) остается локальным, но сохраняет «удаленные» вещи в отдельных потоках. В компоненте передачи сообщений IPC искусственно добавьте любую задержку, которую вы хотите смоделировать. Удачи!
Джо Ван Стин
1

Если вы узнаете обо всем этом, почему бы не написать простую однопользовательскую версию 1, и, как только она заработает, со своими более глубокими знаниями переосмыслите все это для версии 2, которая будет многопользовательской?

Этьен Чарланд
источник
0

Реализуйте класс «поддельной сети», который передает сообщения между потоками, который имеет тот же интерфейс, что и сетевой класс. Позже вы можете разработать поддельную сеть для случайных задержек и потери пакетов. Отладка сетевого кода с помощью фальшивого класса всегда будет проще, чем в реальной сети.

ddyer
источник