Запуск нескольких физических миров на Node.js, не используя возможности сервера - PullRequest
1 голос
/ 27 марта 2019

Я размещаю свои собственные многопользовательские игровые миры на 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;

1 Ответ

0 голосов
/ 02 апреля 2019

Чтобы получить больше от p2.js, вы должны просмотреть документы и отключить ненужные вещи.Например:

world.defaultContactMaterial.friction=0; // if you don’t need contact friction on a ContactMaterial
world.narrowphase.enableFriction=false; // if you never need friction for anything in your World
world.applySpringForces=false; //if you don’t use springs
world.applyGravity=false; // if you don’t need gravity along x or y axis 
world.applyDamping=false; // not sure if you need this?
world.islandSplit=false; // since you have a top-down type of game with few contacts, this might save you a run of the UnionFind algorithm
world.emitImpactEvent=false; // unless you use it
world.broadphase.sortAxis=0; // 0 means x and 1 means y. Choose the axis on which your bodies are more spread out along.
world.solver.iterations=3; // this is default 10, you might want to decrease it. Just check if your collisions work OK after you change it.

Если вы хотите получить максимальную отдачу от своих серверов, вам также следует рассмотреть использование технического стека, который вы используете.Node.js, использующий физический движок JavaScript, будет использовать много оперативной памяти и тратить циклы ЦП на сборку мусора.Если вы, например, переключитесь на Box2d в C / C ++ и, возможно, будете использовать libuv напрямую, а не Node.js, вы можете увеличить производительность на хороший коэффициент.

...