Как я могу отправить реальные данные в Node.js?

У меня есть игра на стороне сервера, логика обновления с 60 FPS и отправка данных с 10 FPS

var PLAYER_LIST = {};

class Player {
    constructor(socket) {
        this.id = Math.random() * 9999;
        this.pressKeyAttack = 0;
        this.socket = socket;
        PLAYER_LIST[this.id] = this;
    }
    setupSocket() {
        this.socket.on("keypress", (data) => {
            if (data.key == 1) this.pressKeyAttack = data.value;
        });
    }
    send() {
        //Simple data
        //Send to this player all data from PLAYER_LIST
        var data = {};
        for (var id in PLAYER_LIST) {
            data[id] = PLAYER_LIST[id].pressKeyAttack;
        }
        this.socket.emit("data", data);
    }
    update() {
        if (this.pressKeyAttack == 1) {
            //do something
        }
    }
}

io.sockets.on("connection", (socket) => {
    new Player(socket);
});

setInterval(() => {
    //Logic update
    for (var id in PLAYER_LIST) {
        PLAYER_LIST[id].update();
    }
}, 1000 / 60);

setInterval(() => {
    //Send data
    for (var id in PLAYER_LIST) {
        PLAYER_LIST[id].send();
    }
}, 1000 / 10);

Пример На стороне клиента, когда любой игрок нажимает [Пробел], все остальные игроки будут видеть анимацию этого игрока.

var PLAYER_LIST = {}; //all player

for (var id in PLAYER_LIST) {
    if (PLAYER_LIST[id].pressKeyAttack == 1) {
        //run animation
    }
}

socket.on("data", (data) => {
    for (var id in data) {
        PLAYER_LIST[id].pressKeyAttack = data[id];
    }
})

document.onkeydown = function(e) {
    // Player.pressKeyAttack = 1
    if (e.keyCode == 32) socket.emit("keypress", { key: 1, value: 1 });
}

document.onkeyup = function(e) {
    // Player.pressKeyAttack = 0
    if (e.keyCode == 32) socket.emit("keypress", { key: 1, value: 0 });
}

Моя проблема:

Пример: я игрок в игре (называемый Player_A) и некоторые другие игроки. Когда Player_A нажимает [Пробел] вниз и вверх так быстро, другие игроки не могут получать данные (pressKeyAttack = 1) от Player_A, потому что Loop Send Data работает со скоростью 10 кадров в секунду (отправляется каждые 100 мс), Player_A.pressKeyAttack равен 1 и возвращается к 0 через 50 мс.

Выглядит как:

at 0ms: Player_A.pressKeyAttack = 0;

at 20ms: Player_A.pressKeyAttack = 1; //Player press down

at 50ms: Player_A.pressKeyAttack = 0; //Player press up

at 100ms: Loop Data Run - Player_A.pressKeyAttack = 0.

На самом деле раньше было 1. Как я могу это исправить?

На вашем сервере вы можете emit получать данные при получении keypress события. Также вы можете настроить пакетную обработку примерно на 5-10 мс, чтобы уменьшить количество одновременных излучений. Чтобы уменьшить размер полезной нагрузки, вы можете просто передать данные изменяющихся элементов, а не отправлять позицию каждого игрока.

varun agarwal 01.04.2019 10:02

Не излучайте с интервалом. Излучать по событию. Другими словами, не генерируйте информацию с фиксированной скоростью (10 раз в секунду), которая бесполезно потребляет ресурсы, а генерируйте информацию только тогда, когда это необходимо, то есть когда игрок нажимает пробел. Что-то вроде socket.on("keypress", data => socket.broadcast("Key was pressed : " + data.keyCode ))

Jeremy Thille 01.04.2019 10:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
219
0

Другие вопросы по теме