Проекты
GameDev.ru / Проекты / Форум / Создание Браузерной MMORPG (2 стр)

Создание Браузерной MMORPG (2 стр)

Страницы: 1 2 3 4 Следующая »
ТатаринПостоялецwww19 дек. 201713:49#15
Apkko
JSON избыточен, но можешь использовать и его, даже в начале я бы советовал только его и использовать.
Бинарный формат нужен чтобы рассылать кадры, например у тебя есть 10 игроков ты будешь хранить в массиве их всех а перед рассылкой проходит по каждому собирать в новый массив их координаты и статусы потом этот массив ты прогонишь через JSON.stringify - получишь строку и отправишь ее через сокет, в бинарном же формате все по другому, есть бинарный массив ArrayBuffer, каждый новый игрок получает в нем 32 байта например, и когда нужно обновить его координаты ты записываешь в нужное положение в массиве данные float 32 битный, и когда нужно отправить данные клиенту ты просто отправляешь этот массив, это экономит много не нужных операций, бинарные данные меньше занимают места и обрабатываются быстрее, в коде это сделано так:
//------------------------------------------------------------------------------------
//                                   ФРЕЙМЫ
//  0 1     2 3    4 5    6 7      8 9       10 11    12 13       14 15     16 17       18 19      20 21      -    byte offset
// id(2),  x(1),  y(1),  angle(2), status(2), hp(2), shield(2), angle1(2), angle2(2), angle3(2), angle4(2)    - 22 байта одна строка

const FRAME_data_id        = 0;   // 2  unit_id
const FRAME_data_x         = 2;   // 2  - координаты объекта внутри блока
const FRAME_data_y         = 4;   // 2  -
const FRAME_data_angle     = 6;   // 2  угол 
const FRAME_data_status    = 8;   // 2  статус
const FRAME_data_hp        = 10;  // 2  очки жизни
const FRAME_data_shield    = 12;  // 2  щит
const FRAME_data_angle1    = 14;  // 2  угол пушки 1  
const FRAME_data_angle2    = 16;  // 2  угол пушки 2
const FRAME_data_angle3    = 18;  // 2  угол пушки 3 
const FRAME_data_angle4    = 20;  // 2  угол пушки 4

одна запись игрока это 22 байта, там его id координаты угол поворота, статус, hp щит, и 4 угла для пушек
когда игрок присылает новый данные то они сразу записываются в массив
// обновляем положение юнита
function set_position(frame_pos,x,y,angle,angle1,angle2,angle3,angle4){
    FRAMES.setUint16(frame_pos + FRAME_data_x       ,x      );
    FRAMES.setUint16(frame_pos + FRAME_data_y       ,y      );
    FRAMES.setUint16(frame_pos + FRAME_data_angle   ,angle  );
    FRAMES.setUint16(frame_pos + FRAME_data_angle1  ,angle1 );
    FRAMES.setUint16(frame_pos + FRAME_data_angle2  ,angle2 );
    FRAMES.setUint16(frame_pos + FRAME_data_angle3  ,angle3 );
    FRAMES.setUint16(frame_pos + FRAME_data_angle4  ,angle4 );
}
frame_pos это смещение в большом массиве где данные игрока храняться, объект может находиться только в одном кадре, так как кадр это клетка по сути на карте.
а затем когда приходит время всем рассылаются данные
 
_send_bin(user, Buffer.from(_FRAMES, frame.start, (4+frame.count*_frameline_size)) );
с бинарными данными совсем другая логика, другая архитектура, сделать ее сразу не получится, тебе лучше начать с JSON формата.
ApkkoПользовательwww19 дек. 201714:13#16
Татарин
не скажу что все понял =)) покачто буду иметь в виду что это работает быстрее, и возможно когда нибудь к этому вернусь) пока что пожалуй остановлюсь на json
сервер принимает сообщения от игроков, некоторые он обрабатывает но большинство ставиться в список, если например игрок 1000 раз пришлет команду на стрельбу то обработаеться она только один раз за 100 мс, тоесть стрелять чаще у него не получиться
интерестно. Кстати я так понял на клиенте не все в канвасе рисуется, менюшки , хп бар и т.п. это все divами ведь если я правильно понял, почему не канвасом?
ApkkoПользовательwww19 дек. 201714:18#17
Татарин
отложенные команды игроков обрабатываются не все а только 100 за раз, и если сервер не успевает то они откладываются на потом

Как определяется что сервер не успевает? вот тут не очень понятно
ТатаринПостоялецwww19 дек. 201714:32#18
Apkko
> Кстати я так понял на клиенте не все в канвасе рисуется, менюшки , хп бар и
> т.п. это все divами ведь если я правильно понял, почему не канвасом?
ну div легко в chrome настроить сделать красивым, а в канвас один раз сделаешь а потом переделывать запаришься, я несколько раз интерфейс переделывал, добавил функцию переделай, новый параметр у корабля - переделай, да и хороших библиотек рисовать gui на canvas я не нашел, если есть возможность упростить работу - упрощай, браузер сам умеет быстро рисовать все div и эффекты с ним и настраивать их легко, не надо писать свои велосипеды, НО я когда нибудь постараюсь осилить и gui на canvas конечно, все таки есть в нем и свои плюсы.
> Как определяется что сервер не успевает? вот тут не очень понятно
очень легко, есть главный цикл, в нем идет отсчет времени, если после всех операций ты собрался раздавать новый кадр игрокам и дельта времени больше 100мс значит сервер не успевает:
let last_time  = Date.now();  // текущее время
const FRAME_DELTA     = 100;  // время между раздачами фреймов клиентам
const FRAME_DELTA_BAD = FRAME_DELTA + 20; // если раздача кадров задержалась на это время то надо сообщить или принять меры
function main_loop(){
    let curr_time = Date.now();      //текущее время
    let delta  = curr_time - last_time;

    // раздаем кадры игрокам
    if (delta>=FRAME_DELTA){
        if (delta>=FRAME_DELTA_BAD){ console.log(' delta',delta); }
        last_time = curr_time;
  ...
    }
    setImmediate(main_loop);
}

setImmediate(main_loop);

ApkkoПользовательwww19 дек. 201714:42#19
Татарин
понял, звучит логично
ApkkoПользовательwww14 фев. 201822:46#20
Добавили ссылку на группу в вк в шапке темы
envZionПостоялецwww15 фев. 201812:35#21
Я конечно могу ошибаться, но..
Ребят на дворе 21й век. 90% пользователей пк большую часть времени проводят с мобильным устройством в руках а отнюдь не за пк. 90% браузерок потеряли своих пользователей а оставшиеся начали спешно клепать клиенты для моб устройств. Ибо браущерки все же не удобны на смартфонах/планшетах. Да же БК и тот начал делать клиент для андроида( в котором несмотря на то что это демка и не удобная )-сейчас большинство игроков.
Главное вы не подумайте что я вас отговариваю  и тд - просто платформу вы выбрали по моему не удачно)
А в остальном- удачного развития проекта)
ApkkoПользовательwww15 фев. 201813:24#22
Да, возможно вы правы и время брузерок прошло) но все же их можно запустить на чем угодно, так что возможно что то еще изменится...
reclonerПостоялецwww15 фев. 201821:07#23
тоже пишу ммо-шечку на примерно том же (на половину), с примерно теми же мотивами. Можно наладить обмен опытом)
RikkПостоялецwww15 фев. 201821:46#24
тоже
RenЗабаненwww15 фев. 201821:55#25
Apkko
recloner
Rikk
Каждый пишет свою ммошечку? Вы такие индивидуалисты? Фу, такими быть.

Правка: 15 фев. 2018 21:56

RikkПостоялецwww15 фев. 201821:57#26
Ren
> Каждый
потому имеет некие проблемы
RikkПостоялецwww15 фев. 201821:59#27
envZion
> 90% браузерок потеряли своих пользователей
1 почему
2 предпосылки
3 причины
4 факторы

5 какие из этого идут следствия
6 ваши предложения для практичного исправления ситуации
?

reclonerПостоялецwww15 фев. 201822:16#28
Ren
> Каждый пишет свою ммошечку? Вы такие индивидуалисты?
Наладить эффективное взаимодействие в разы труднее чем сделать самому. При этом дефицитный ресурс в любительской разработке игр - графоний, а всяких программистов с геймдизанерами итак в разы больше чем надо.
RenЗабаненwww15 фев. 201822:26#29
recloner
> Наладить эффективное взаимодействие в разы труднее чем сделать самому.
Ну хз. Я еще не видел людей которые сами могут сделать все. И все это будет хорошо.

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

Страницы: 1 2 3 4 Следующая »

/ Форум / Проекты / Собираю команду

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