Я пытаюсь запрограммировать некоторые анимации в холсте html5. Мне нужно, чтобы анимация была воспроизведена на любом другом клиенте, подключенном к моему серверу. Поэтому я посылаю вызываемую функцию и аргументы в виде строки и вызываю eval() на стороне клиента. Таким образом, анимационная логика должна выполняться только на одном холсте, а вызовы функций, которые фактически делают вещи, выполняются всеми клиентами.Nodejs - предотвратить сокет.io от падения кадров
Однако, когда я это делаю, частота кадров падает резко. Я использую socket.emit() для отправки сигналов на сервер, который в свою очередь вызывает socket.broadcast.emit(), чтобы отправить строку всем клиентам. Это цикл рендеринга:
var rf = function()
{
// clear background
context.fillStyle = "#000";
context.fillRect(0, 0, width, height);
socket.emit('action', 'clearScreen', "{}");
// mouse position to head towards
var cx = (mousex - width/2) + (width/2),
cy = (mousey - height/2) + (height/2);
// update all stars
var sat = Floor(Z * 500); // Z range 0.01 -> 0.5
if (sat > 100) sat = 100;
for (var i=0; i<units; i++)
{
var n = stars[i], // the star
xx = n.x/n.z, // star position
yy = n.y/n.z,
e = (1.0/n.z + 1) * 2; // size i.e. z
if (n.px !== 0)
{
// hsl colour from a sine wave
context.strokeStyle = "hsl(" + ((cycle * i) % 360) + "," + sat + "%,80%)";
context.lineWidth = e;
context.beginPath();
socket.emit('action', 'context.beginPath', "{}");
context.moveTo(xx + cx, yy + cy);
socket.emit('action', 'context.moveTo', "{\"a\": [" + (xx + cx) + "," + (yy + cy) + "]}");
context.lineTo(n.px + cx, n.py + cy);
socket.emit('action', 'context.lineTo', "{\"a\": [" + (n.px + cx) + "," + (n.py + cy) + "]}");
context.stroke();
socket.emit('action', 'context.stroke', "{}");
}
// update star position values with new settings
n.px = xx;
n.py = yy;
n.z -= Z;
// reset when star is out of the view field
if (n.z < Z || n.px > width || n.py > height)
{
// reset star
resetstar(n);
}
}
// colour cycle sinewave rotation
cycle += 0.01;
requestAnimFrame(rf);
};
requestAnimFrame(rf);
, приведенный выше фрагмент был взят из here.
Можете ли вы предложить способы предотвращения падения частоты кадров? Я думаю, это можно сделать, если socket.emit не блокирует. Отправка строк, которые воспроизводят кадр, является самым легким способом выполнить то, что я хочу. Отправка пикселей еще более тяжелая. Отправка строк работает отлично, когда фрейм легко рисовать - например, простой круг, перемещающийся вверх и вниз, отлично отображает.
Вы пытались использовать один 'emit' сигнал отправить все данные? – Aroll605
Нет. Но это поможет? Я попробую это. Его правда, что 4 испускания будут уменьшены до 1. Но это все равно приведет к снижению fps? Есть ли способ сделать неблокирующий вызов? – lonesword
Звонки в первую очередь не блокируются. Это просто означает, что вы можете сделать другой звонок, не дожидаясь результата этого. Вы увеличиваете накладные расходы путем передачи нескольких сигналов «emit», вот и все. И добраться до места назначения занимает больше времени. Поэтому, если вы отправляете его как один из «emit», все они будут поступать в одно и то же время. – Aroll605