我正在尝试在桌面版 Chrome 中使用
EXT_disjoint_timer_query_webgl2
扩展(最近 默认启用)。我对 getExtension
的所有调用都成功(ext.TIMESTAMP_EXT
和 ext.QUERY_COUNTER_BITS_EXT
都返回非零数字)并且我正在尝试按照 this doc 来实现我的代码。
如果我每帧运行这段代码:
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>
...它工作正常。但是,如果我每帧都这样运行:
// globalData.startQuery is null before first run.
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
能否以某种方式使查询无效?或者也许有人知道是什么导致了这个问题——我将非常感谢任何帮助或提示。
编辑
我能够在一个小代码片段上重现这个错误(这里是 JsFiddle - 你必须打开浏览器控制台才能看到错误):
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)
如果不是使用
window.requestAnimationFrame
,而是将其称为 for (let i = 0; i < 100; i++) { onFrame() }
,它不会报告这些警告。
此外,似乎在使用 类似代码中没有发出警告(JsFiddle):
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();
gl.beginQuery(ext.TIME_ELAPSED_EXT, startQuery);
gl.endQuery(ext.TIME_ELAPSED_EXT);
window.requestAnimationFrame(onFrame)
}
window.requestAnimationFrame(onFrame)
这是 Chrome 实现中的错误吗?