Спочатку потрібно знати, як представити відповідні дані у відповідності з протоколом. Це залежить від даних, що стосуються гри. Я буду використовувати приклад гри РТС.
Для мережевих цілей перераховуються всі об'єкти гри (наприклад, пікапи, агрегати, будівлі, природні ресурси, руйнуючі матеріали).
Гравці повинні мати відповідні їм дані (наприклад, всі видимі одиниці):
- Живі чи мертві?
- Якого типу вони?
- Скільки здоров’я їм залишилось?
- Поточне положення, обертання, швидкість (швидкість + напрямок), шлях у найближчому майбутньому ...
- Діяльність: Напади, ходьба, будівництво, закріплення, загоєння тощо ...
- ефекти статусу баф / налагодження
- і, можливо, інші статистичні дані, такі як мана, щити та що ні?
Спочатку гравець повинен отримати повний стан, перш ніж вона зможе вступити в гру (або, як альтернативу, всю інформацію, що стосується цього гравця).
Кожна одиниця має цілий ідентифікатор. Атрибути перераховуються, тому вони також мають цілісні ідентифікатори. У ідентифікаторів одиниць не повинно бути 32 біта (це може бути, якщо ми не є ощадливими). Це може бути 20 біт (атрибути залишаються 10 біт). Ідентифікатор одиниць повинен бути унікальним, він може бути дуже присвоєний лічильником, коли пристрій інстанціюється та / або додається до ігрового світу (будівлі та ресурси вважаються нерухомими одиницями, а ресурсам може бути призначений ідентифікатор, коли карта завантажується).
Сервер зберігає поточний глобальний стан. Кожен останній оновлений стан гравця представлений вказівником на list
останні зміни (усі зміни після того, як покажчик ще не був надісланий цьому гравцю). Зміни додаються до тих list
випадків, коли вони відбуваються. Після того, як сервер завершить відправлення останнього оновлення, він може почати перебирати список: сервер переміщує вказівник гравця по списку до хвоста, збираючи всі зміни по дорозі і поміщаючи їх у буфер, який буде надісланий програвач (тобто формат протоколу може бути приблизно таким: unit_id; attr_id; new_value) Нові одиниці також вважаються змінами і надсилаються з усіма своїми значеннями атрибутів гравцям, що приймають.
Якщо ви не використовуєте мову зі збирачем сміття, вам потрібно буде встановити ледачий покажчик, який буде відставати, а потім наздогнати найзастаріший вказівник гравця у списку, звільняючи об'єкти по дорозі. Ви можете запам'ятати, який гравець є найбільш застарілим у купі пріоритету, або просто повторити та вільно, поки ледачий покажчик не зрівняється (тобто вказує на той самий предмет, що й один із вказівників гравців).
Деякі питання, які ви не ставили, і, я думаю, цікаві, це:
- Чи повинні клієнти отримувати знімок з усіма даними в першу чергу? А що з предметами поза їх лінією зору? Що з туманом війни в іграх RTS? Якщо ви надсилаєте всі дані, клієнт може бути зламаний для відображення даних, які не повинні бути доступні гравцю (залежно від інших заходів безпеки, які ви вживаєте). Якщо ви надсилаєте лише відповідні дані, проблема вирішується.
- Коли важливо надсилати зміни, а не надсилати всю інформацію? Враховуючи пропускну здатність, доступну на сучасних машинах, чи отримуємо ми що-небудь від надсилання «дельти» замість надсилання всієї інформації, якщо так, коли?