Як ви дозволяєте записати мережевий код на пізніших етапах розробки?


12

Наразі я перебуваю на ранніх стадіях написання гри, яку, врешті-решт, захочу вдосконалити в більшості аспектів.
Як я можу пропустити написання мережевого коду, але залишаючи його досить легко реалізованим, тобто не потрібно переписувати всю гру лише для того, щоб додати її.
Що я маю пам’ятати?

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

Редагувати: планується бути RPG зверху вниз. Про те, що я думаю, простий мультиплеєр, де ви розміщуєте сервер для своїх друзів, тож обман - це не велика проблема (хто хотів би пограти з друзями, які обдурили?). І все-таки я хотів би перейти з "Сервер завжди правий" - підхід.

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


Це дуже сильно залежить від того, як ви плануєте реалізувати ваш мережевий код, як тільки ви потрапите туди. Наприклад, Quake (або якийсь пізніше назва заголовка id, моя пам'ять трохи нечітка), наприклад, використовував підхід завжди бути клієнтом / сервером. Навіть опція одного гравця насправді підключається до сервера на 127.0.0.1 і не запрошує інших гравців - це означає, що навіть гра для одного гравця повністю працює за допомогою мережевого коду.
LLL79

Це щось таке, що я мав на увазі. Можливо, деякі міжпроцесорні комунікації, так що вам не потрібно підключатися, коли ви хочете грати в самоті, або, можливо, клас, який має ті ж функції, що і клієнт, але обробляє його як сервер відразу.
Ghork

3
Найкраща практика була "не" протягом досить тривалого часу. Якщо ви не пишете покрокову гру, вам просто доведеться проектувати речі по-іншому, щоб керувати мережами. Якщо ви дбаєте про затримку, правильність та обман, просто не існує способу цього. Якщо ви цього не зробите, вам не потрібно дуже багато про це думати - якщо у вас немає досвіду, ви все одно не будете достатньо добре передбачати належний дизайн. Найкращий спосіб - розпочати роботу над парою мережевих прототипів, щоб отримати досвід роботи в мережі.
Луань

Якщо ви подумаєте, у Minecraft є локальний сервер навіть в одиночних іграх. Сервер - це двигун, клієнт - лише презентатор.
SparK

Відповіді:


12

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

Однак ви можете розглянути це рішення, яке ви приймаєте, залишити код мережі до кінця, залежно від того, наскільки важливою є мережа для вашої гри.

Я маю на увазі те, що якщо ви пишете важку мережеву гру, таку як MMORPG, можливо, не розумно залишати мережу до кінця.

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

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

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

Таким чином, створюючи свою гру, ви дізнаєтесь, на які частини впливає мережевий код, і коли настав час фактично написати мережевий код, ви на кілька кроків вперед.

Якщо ви вперше пишете мережеву гру, подумайте не надто замислюючись про антиобман і подібні речі. Зробити мережеву гру досить складно, щоб вимагати, щоб ціла команда досвідчених людей зробила це для гри AAA, тому сприймайте це повільно і спочатку зробіть гру, яка працює, перш ніж зосередитись на більш складних темах.

Нарешті, якщо ви вперше робите гру, не робіть її мережевою, будь ласка. Зробити гру настільки складно, що кожна вимога, яку ви додасте до своєї гри, зробить її експоненціально складнішою.


Ну, це не MMO, тому це не буде ТОГО важким у мережі. Однак це не затхла настільна гра, де також непогано зайняти секунди, перш ніж зробити крок. Мені здається, що в мережу слід задуматися над тим, як, на мій досвід, додавання мультиплеєра на останніх етапах не вийде. Однак я не хочу писати мережевий код і налагоджувати це, перш ніж я можу змусити свого персонажа рухатися і стикатися з об'єктами.
Ghork

2
@Ghork: Ах, ви хочете, щоб ваш продукт якнайшвидше робив гарні речі! Ну так, ми все робимо. Але піддатися цій спокусі не призведе до добре розробленої і продуманої програми.
Гонки легкості по орбіті

Я прийму цю відповідь, хоча мені подобаються й інші відповіді. Зокрема коментар @Luaan
Ghork

2

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

Мій підхід узгоджується з вашим коментарем щодо IPC (міжпроцесорний зв’язок).

По-перше, як тло я вивчаю книгу "Мережева графіка" Стіда та Олівейри. Це забезпечує хороший фон для різних мережевих архітектур для ігор залежно від різних критеріїв та типів гри. Він надає інструмент, який допоможе вам вирішити вашу ігрову архітектуру та те, що саме ви хочете розмістити в мережі, а також те, що ви хочете мати місцеве місце.

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

Це повинно допомогти тримати свою логіку розділеною, а також дозволить моделювати фактори затримки мережі в процесі, щоб ви могли також побачити вплив затримок.


Вгадайте, тоді мені доведеться перевірити цю книгу! Звучить багатообіцяючою можливість зробити те, що ви сказали.
Ghork

@Ghork: ключ полягає у визначенні вашої архітектури, що ви хочете локально і що ви хочете на сервері; або як ви хочете, щоб однолітки спілкувалися та спілкувалися. Ця книга повинна допомогти. Потім покладіть все, що ви хочете віддалено, з іншого боку виклику повідомлення IPC через набір коду клієнт-сервер, який (поки що) залишається локальним, але зберігає "віддалені" речі на відокремлених потоках. У компонент передачі повідомлення IPC штучно додайте будь-які затримки, які ви хочете імітувати. Удачі!
Джо Ван Стін

1

Якщо ви дізнаєтесь про всі ці речі, чому б не написати просту програвач для версії 1 для однокористувача, і коли це буде працювати, з вашими глибшими знаннями, переосмислити все це за версією 2, яка буде багатокористувацькою?


0

Реалізуйте клас "фальшива мережа", який передає повідомлення між потоками, який має той самий інтерфейс, який матиме мережевий клас. Пізніше ви можете розробити підроблену мережу, щоб мати випадкові затримки та втрати пакетів. Завжди буде простіше налагоджувати код мережі з фальшивим класом, ніж з реальною мережею.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.