Что такое правильное использование синхронизации забора в webgl2?
Поиск некоторых шаблонов / примеров кода / лучших практик надлежащего использования заборов в webgl2 (gl.fenceSync) - лучше всего, если это будет не блокирование потока JS.
var fence = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
setTimeout(() => {
gl.clientWaitSync(fence, gl.SYNC_FLUSH_COMMANDS_BIT, 1000000);
gl.getBufferSubData(gl.TRANSFORM_FEEDBACK_BUFFER, 0, dataOut);
}, 0);
1 ответ
Я просто думаю, если честно, я не совсем уверен, насколько полезны синхронизации в WebGL2, но я думаю, что вы не хотите блокировать, тогда шаблон будет выглядеть так
function main() {
const gl = document.createElement('canvas').getContext('webgl2');
if (!gl) {
return alert('need webgl2');
}
callbackOnSync(gl, () => {
console.log("done");
});
function callbackOnSync(gl, callback) {
const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
gl.flush(); // make sure the sync command is read
setTimeout(checkSync);
function checkSync() {
const timeout = 0; // 0 = just check the status
const bitflags = 0;
const status = gl.clientWaitSync(sync, bitflags, timeout);
switch (status) {
case gl.TIMEOUT_EXPIRED:
// it's not done, check again next time
return setTimeout(checkSync);
case gl.WAIT_FAILED:
throw new Error('should never get here');
default:
// it's done!
gl.deleteSync(sync);
callback();
}
}
}
}
main();