Chrome中EXT_disjoint_timer_query_webgl2查询ID无效问题咨询
关于Chrome中EXT_disjoint_timer_query_webgl2扩展的查询失效问题
我在桌面版Chrome中尝试使用EXT_disjoint_timer_query_webgl2扩展(该扩展近期已恢复默认启用),调用getExtension成功,且ext.TIMESTAMP_EXT和ext.QUERY_COUNTER_BITS_EXT均返回非零值,代码完全按照官方文档实现。
正常运行的代码逻辑
每帧执行以下代码时,程序运行无异常:
globalData.startQuery = gl.createQuery(); ext.queryCounterEXT(globalData.startQuery, ext.TIMESTAMP_EXT); let available = gl.getQueryParameter(globalData.startQuery, gl.QUERY_RESULT_AVAILABLE); gl.deleteQuery(globalData.startQuery); // <rest of the frame code here>
触发警告的代码逻辑
但如果调整为以下逻辑(启动查询后,在下一帧检查结果再创建新查询),控制台会持续输出GL错误警告:
// globalData.startQuery 初始为 null if (globalData.startQuery) { let available = gl.getQueryParameter(globalData.startQuery, gl.QUERY_RESULT_AVAILABLE); gl.deleteQuery(globalData.startQuery); } globalData.startQuery = gl.createQuery(); ext.queryCounterEXT(globalData.startQuery, ext.TIMESTAMP_EXT); // <rest of the frame code here>
警告内容:
GL_INVALID_OPERATION : glGetQueryObjectuivEXT: unknown query id
我排查后确认这是代码中唯一使用查询的地方,怀疑是否存在其他GL代码或requestAnimationFrame机制导致查询对象失效的情况?
编辑:最小复现示例
已编写最小代码片段复现该问题:
let canvas = document.getElementById("mycanvas"); let gl = canvas.getContext("webgl2"); let ext = gl.getExtension('EXT_disjoint_timer_query_webgl2'); let startQuery = null function onFrame() { if (startQuery) { let available = gl.getQueryParameter(startQuery, gl.QUERY_RESULT_AVAILABLE); //console.log(available) gl.deleteQuery(startQuery); } startQuery = gl.createQuery(); ext.queryCounterEXT(startQuery, ext.TIMESTAMP_EXT); window.requestAnimationFrame(onFrame) } window.requestAnimationFrame(onFrame)
测试发现:若改用for循环直接调用onFrame而非通过requestAnimationFrame调度,则无警告;另外,使用beginQuery/endQuery的类似逻辑也不会触发警告。这是否属于Chrome的实现bug?
编辑2:问题结论
基于上述测试结果,我判断这是Chrome的实现问题,已提交官方bug反馈。
内容的提问来源于stack exchange,提问作者Wojciech Danilo
相关产品推荐
相关产品推荐

