Я размещаю свои собственные многопользовательские игровые миры на AWS, используя Node.Игра основана на физике (с использованием p2.js), поэтому у меня довольно высокая физическая скорость - 200 шагов в секунду.
Каждая игра имеет свой собственный мир, и каждый мир должен шагать каждые 5 мс.В каждой игре всего 6-8 игроков, поэтому я могу одновременно разместить на сервере только около 60 игроков.Я хотел бы улучшить это, но я не уверен, как это сделать.
Сейчас я использую нанотимер setInterval
и последовательно прохожу каждый физический мир.
const stepsPerSecond = 200;
// Number of games the server can manage.
const numSlots = 10;
// Evaluates to 500 microseconds (.5ms)
const timePerStep = parseInt(1000 * (1000 / stepsPerSecond) / numSlots);
const timeLabel = `${timePerStep}u`;
this.timer.setInterval(() => {
const slotIndex = this.currIndex++;
// Go back to beginning of slots if end.
if (this.currIndex == this.numSlots) {
this.currIndex = 0;
}
const game = this.slots[slotIndex];
game.physics.update();
}, '', timePerStep);
Это на самом деле хорошо работает, поскольку физика, как правило, очень плавная, но проблема в том, что когда она приближается к емкости, возникает много заиканий от того, что я считаю слишком большим вычислением в потоке.
Каждый мировой этап занимает в среднем около 0,2 мс, и с 200 шагами в секунду или 5 мс между каждым шагом теоретически есть место для 25 игр.
Есть ли лучший способ сделать это?Я чувствую, что не использую весь потенциал своих серверов.Возможно, раскручивание дочерних процессов?Я пытался запустить второй сервер рядом с этим на той же машине, но в итоге они забивали друг друга и делали все миры чрезвычайно запаздывающими.
Редактировать: Добавление еще нескольких подробностей о мире физики: Каждый миримеет около 60 тел, большинство из которых являются статическими стенами.Всего существует 7 движущихся тел с парой датчиков для определения «целей».
Параметры физического мира:
world.setGlobalStiffness(1e8);
// Default is 4, but the puck sometimes warps through the sticks
// with this any lower, even with CCD enabled.
world.setGlobalRelaxation(10);
maxSubSteps = 4;