Javascript WebGLSync总是未标记的

Javascript WebGLSync总是未标记的,javascript,webgl2,Javascript,Webgl2,我正试着玩游戏,我很难得到一个WebGLSync的信号 以下内容在所有支持WebGL2(Chrome、Opera、Firefox)的浏览器上均未签名: 我希望这能起作用,因为gl.finish()应该等到所有的GPU命令都被处理完毕——但看起来同步围栏没有 我非常感谢您提供一个实际收到信号的最简单、有效的WebGLSync示例。我在GitHub上找过这样的东西,但什么也没找到 编辑 基于,我编写了这个代码示例,它在我的环境(Windows+Chrome)中运行良好 您必须等待一个滴答声才能看到

我正试着玩游戏,我很难得到一个WebGLSync的信号

以下内容在所有支持WebGL2(Chrome、Opera、Firefox)的浏览器上均未签名:

我希望这能起作用,因为gl.finish()应该等到所有的GPU命令都被处理完毕——但看起来同步围栏没有

我非常感谢您提供一个实际收到信号的最简单、有效的
WebGLSync
示例。我在GitHub上找过这样的东西,但什么也没找到


编辑

基于,我编写了这个代码示例,它在我的环境(Windows+Chrome)中运行良好


您必须等待一个滴答声才能看到同步信号。在JS执行帧期间,同步状态永远不会更改

为了确保跨平台的行为一致,同步对象只能在用户代理的事件循环未执行任务时转换为信号状态。换言之:

在控制返回到用户代理的主循环之前,同步对象不得发出信号。 在循环中重复获取同步对象的sync_STATUS参数,而不将控制返回给用户代理,必须始终返回相同的值


您必须等待一个滴答声才能看到同步信号。在JS执行帧期间,同步状态永远不会更改

为了确保跨平台的行为一致,同步对象只能在用户代理的事件循环未执行任务时转换为信号状态。换言之:

在控制返回到用户代理的主循环之前,同步对象不得发出信号。 在循环中重复获取同步对象的sync_STATUS参数,而不将控制返回给用户代理,必须始终返回相同的值

5.39同步对象的结果不得在当前帧中可用 在OpenGL ES 3.0中,如果调用了适当的原语(例如glFinish()或另一个同步API),则同步对象可能会在发出的同一帧中发出信号。在WebGL中,为了提高应用程序的可移植性,同步对象决不能在发出同步的同一帧中转换为信号状态。有关讨论和基本原理,请参见和的规范

async函数测试(){
让canvas=document.createElement('canvas');
让gl=canvas.getContext('webgl2');
让sync=gl.fenceSync(gl.sync\u GPU\u命令完成,0);
gl.flush();
gl.finish();
等待waitFrame();
let status=gl.getSyncParameter(同步,gl.sync\u status);
日志(同步,glEnumToString(gl,状态));
总账删除同步(同步);
}
函数waitFrame(){
返回新承诺((解决)=>{
requestAnimationFrame(解析);
});
}
函数glEnumToString(gl,v){
用于(总帐中的常数k){
如果(gl[k]==v){
返回k;
}
}
返回`0x${v.toString(16)}`;
}
test()来自

5.39同步对象的结果不得在当前帧中可用 在OpenGL ES 3.0中,如果调用了适当的原语(例如glFinish()或另一个同步API),则同步对象可能会在发出的同一帧中发出信号。在WebGL中,为了提高应用程序的可移植性,同步对象决不能在发出同步的同一帧中转换为信号状态。有关讨论和基本原理,请参见和的规范

async函数测试(){
让canvas=document.createElement('canvas');
让gl=canvas.getContext('webgl2');
让sync=gl.fenceSync(gl.sync\u GPU\u命令完成,0);
gl.flush();
gl.finish();
等待waitFrame();
let status=gl.getSyncParameter(同步,gl.sync\u status);
日志(同步,glEnumToString(gl,状态));
总账删除同步(同步);
}
函数waitFrame(){
返回新承诺((解决)=>{
requestAnimationFrame(解析);
});
}
函数glEnumToString(gl,v){
用于(总帐中的常数k){
如果(gl[k]==v){
返回k;
}
}
返回`0x${v.toString(16)}`;
}

test()
出于某种原因,这会为我生成
未标记的
(复制到浏览器控制台和使用“运行代码剪切”时)是否尝试等待2帧?什么浏览器?什么gpu?什么操作系统?我用NVidia 1060在Windows 10的Chrome和FF上试用过它,在2014年的Macbook Pro上也试用过Chrome和FF。尝试一致性测试?出于某种原因,这会为我产生
未标记的
(无论是在复制到浏览器控制台时还是在使用“运行代码剪切”时),是否尝试等待2帧?什么浏览器?什么gpu?什么操作系统?我用NVidia 1060在Windows 10的Chrome和FF上试用过它,在2014年的Macbook Pro上也试用过Chrome和FF。尝试一致性测试?
function test() {
    let canvas = document.createElement('canvas');
    let gl = canvas.getContext('webgl2');
    let sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
    gl.flush();
    gl.finish();

    let status = gl.getSyncParameter(sync, gl.SYNC_STATUS);
    console.log(sync, status, status === gl.UNSIGNALED);  // logs "true"
    gl.deleteSync(sync);
}
function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function test() {
    let canvas = document.createElement('canvas');
    let gl = canvas.getContext('webgl2');
    let sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0);
    gl.flush();

    while (gl.getSyncParameter(sync, gl.SYNC_STATUS) === gl.UNSIGNALED) {
        await sleep(100);
    }

    let status = gl.getSyncParameter(sync, gl.SYNC_STATUS);
    console.log(sync, status, status === gl.SIGNALED);
    gl.deleteSync(sync);
}

test()