Чи передаються величезні статичні об'єкти, такі як оточення, від сервера до клієнта в сучасних багатокористувацьких іграх?


18

У мене є авторитетна система, де коли гравець приєднується до матчу, він отримує всі вже породжені об'єкти - породив на собі (клієнта).

Це виглядає приблизно так:

  1. Client надсилає маркер доступу до Server
  2. Client отримує акцепт від Server
  3. Client перемикає сцену на ігрову сцену
  4. Serverнадсилає гравців, ящиків, об'єктів, з якими ви можете взаємодіяти, щоб вони clientмогли нерестувати і показувати їх.

А як щодо наземного об’єкта? Наразі у мене на сервері та клієнті є однакова сцена - одна статична площина виступає як підлога. Наразі я додаю нові речі, дерева, сходи та будую речі разом.

Я подумав - ми добре. Але чи не слід також синхронізувати середовище? Бути якось мережевим? Належить сервер?

Візьмемо League of Legends:

введіть тут опис зображення

Це статичне середовище, ймовірно, одна комбінована сітка (сходи, трава, стіни, магазин). Але чи справді він зберігається на клієнті чи він надсилається сервером під час завантаження екрана?


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

Відповіді:


41

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

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

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


21
Зауважте, що ця відповідь стосується лише статичних активів. Необхідно буде передавати динамічні / генеровані активи (наприклад, світові шматки Minecraft або логотипи гільдії MMORPG, які гравці можуть завантажувати). Але навіть тоді зазвичай намагається мінімізувати необхідну кількість даних (для продовження прикладу Minecraft: надсилання оновлень блоків замість цілих фрагментів, лише вказівка ​​типу / стану блоку та координати, що змінилися) та / або кешування даних на стороні клієнта .
hoffmale

@hoffmale Так, хороший момент; питання, про яке було сказано, краєвид був статичним наприкінці, тому я не думав піднімати цю точку, але це добре.

3
Якщо актив є спойлером, зазвичай актив знаходиться у клієнта, шифрується, а ключ дешифрування передається з сервера до клієнта, коли потрібен актив.
Грант Девіс

4
Наприклад, якщо вам потрібно довільно розмістити дерева на карті, замість того, щоб відправляти координати дерев клієнту, він надсилає насіння (генератора випадкових чисел) клієнту.
Грант Девіс

5

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

Дійсно, сітка зазвичай не надсилається, як це вже було б у клієнта у більшості випадків RTS. Незалежно від того, чи надсилається карта зіткнення чи ні , що насправді має вирішальне значення для синхронізації обох , це ще одне питання. Але в більшості RTS це знову буде попередньо збережено на клієнті.

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

Після цього є кілька типових способів синхронізуватись:

  • Дельти надсилаються клієнту - найпоширеніший та ефективний спосіб інформувати локальний / клієнтський світ із сервером;
  • Контрольні суми періодично надсилаються або від сервера до клієнта, або від клієнта до сервера, щоб гарантувати, що світова держава дійсно відповідає;
  • Іноді повний стан обурюється для повторної синхронізації клієнта - часто внаслідок технічних проблем, таких як дрейф з плаваючою точкою.

4

Що стосується Вашого точного запитання, я не знаю, як League of Legends конкретно справляється з ним. Я ніколи не грав у цю гру, тому не можу підказати, чи потрібно це.

Але взагалі відповідь на ваше запитання досить проста і зрозуміла:

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

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

Це стосується всіх мережевих комунікацій, а не лише даних про місцевість. Все .


2

Ні.

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

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

То як це вирішується тоді? Кожен гравець просто надсилає ТОЛЬКІ дані, які мають значення для інших гравців у грі, на сервер. Нікому не потрібно знати, чи залишилось у вас 5 секунд після виходу з ладу Q, чи те, що Deep Terror Thresh Skin створює для вас бульбашки. Те, що передається в грі, - це такі речі, як Vel'Koz лишив Q, Віктор перемістився ліворуч тощо.

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

ПРИМІТКА:

Якщо ви хочете оглянути те, що має клієнт, і, отже, сервер вас не передає, знайдіть папку C: \ Riot Games \ RADS \ lol_Game_Client \ Projects (це, можливо, трохи не вибачте, вибачте мене ' м зараз працюю з пам'яттю) і знайдіть в Інтернеті файл .RAF. Тоді ви можете побачити всі речі, які розміщені локально, як завантаження бризок екрану та текстур шкіри, навіть скелети чемпіона.


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

1
@JeremyFriesner Чому це було б очевидним способом? Це звучить гірше, ніж поточна реалізація, викладена в цій публікації, яка дозволяє встановити всі активи достроково, щоб ви мали їх одразу доступні, коли вони вам потрібні. Це може спрацювати з однією грою, хоча я думаю, що багато людей віддають перевагу більш тривалий час встановлення (і більше використання дискового простору), ніж постійно чекати, коли під час гри буде завантажено нові активи.
Ентоні Гріст

2
Для багатокористувацької гри? Абсолютна катастрофа. Ви не хочете, щоб кожен інший гравець чекав початку гри, тому що одна людина повинна завантажити ті активи, які вони досі не потребували.
Ентоні Гріст

1
@AnthonyGrist Ось чому багато ігор, як ліга легенд, вимагають від гравця завантажувати всі ігрові активи, перш ніж приєднатися до черги, щоб знайти матч. Це виходить набагато краще, ніж те, що відставання в грі, поки ви чекаєте великого активу, спрацює. Майте на увазі, що в цьому поколінні гри гравці хвилюються за зменшення пінг на 10 мс і часто грають з <50 мс пінг, і вони можуть визначити, чи переходить це на діапазон від 100 до 150. Очікування отримання активу під час гри буде катастрофою в MOBA або FPS, і якщо це станеться в невідповідний час, це навіть може змінити результат гри.
JustWannaFly

@AnthonyGrist (продовження) Я думаю, ви могли б подумати про це так. У деяких мультиплеєрних / змагальних іграх гравці торгують довшим часом завантаження / виправлення / встановлення, щоб отримати більш ігровий досвід у режимі реального часу, за допомогою клієнта подбати про все оновлення та введення черги. Це робить так, що тільки конкретному гравцеві, який потребує активів, доводиться чекати, якщо (і) він не хоче приєднатися до попередньої партії, тоді всі гравці в партії повинні будуть чекати, щоб увійти до черги, щоб знайти опонентів
JustWannaFly

1

Прикладом того, коли цього не було зроблено, був Elder Scrolls Online, де він довіряв клієнту про висоту рівня землі .

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

Подібні редагування дозволяють їм згладжувати скелі, щоб вони могли ходити по них, видаляти або рухатися під статичними стінами, бачити всі статичні об'єкти тощо.

По суті, сервер довіряв клієнтові про місцезнаходження плеєра, обчислення зіткнення на стороні сервера для кожного гравця проти всіх статик було б досить важким.

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


1
TL; DR: Завжди припускайте , що клієнт є брехня, шахрайство, дрохва . Але перевірка сервера всього знижує вашу потужність.
Draco18s
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.