Как вы думаете, это на самом деле ускорит симуляцию?
Это зависит от того, если код симуляции очень дорог, вероятно, да.
Как бы вы запустили их параллельно?
Используйте асинхронную функцию с бесконечным циклом. Например:
function setup() {
// ...
simulationLoop();
}
function draw() {
// ...
}
async function simulationLoop() {
while (true) {
// calculate simulation
await sleep(1);
}
}
function sleep(ms) {
return new Promise(resolve => {setTimeout(() => { resolve(true); }, 1); });
}
См. Как «приостановить» сортировку слиянием для визуализации JS p5js , где этот метод используется для визуализации алгоритма сортировки слиянием.
Возможно даже создать цикл с фиксированной частотой, используя setTimeout
. например:
var count = 0;
function setup() {
createCanvas(500, 200);
simulationLoop();
}
function draw() {
background(0);
stroke(0);
fill(255);
textSize(50);
text(str(count), 10, 60);
}
async function simulationLoop() {
while (true) {
await new Promise(resolve => {
setTimeout(() => {
resolve(true);
simulation();
}, 1000);
});
}
}
function simulation() {
count ++;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>
Другим простым вариантом является использование requestAnimationFrame()
:
var count = 0;
function setup() {
createCanvas(500, 250);
requestAnimationFrame(simulation);
}
function draw() {
background(0);
stroke(0);
fill(255);
textSize(50);
text(str(count), 10, 60);
}
function simulation(deltaTime) {
count = Math.trunc(deltaTime / 1000);
requestAnimationFrame(simulation);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.9.0/p5.js"></script>