我想在我的WebGL应用程序中优化重绘.只有当用户修改相机位置或旋转时,才需要重新绘制.其他一切都是静态的.我可以继续用classic 的js游戏循环拨打requestAnimationFrame()
,判断相机是否有变化,只有在需要时才会重新绘制.
function animate() {
requestAnimationFrame(animate);
if (compare_camera_with_previous_frame()) {
render();
}
}
这是有效的,只有当真正需要重新绘制时,GPU才会进行绘制.然而,这仍然将我的Web应用程序标记为动画,每秒调用请求动画帧()60次,除了判断游戏状态的变化外,基本上什么也不做.
另一种 Select 是从animate()
循环中移除requestAnimationFrame(animate);
,并从touch 事件中调用requestAnimationFrame(animate);
.然而,这会导致绘制发生在数百个FPS,因 for each touch 事件都会调用animate()
.
在使用DesktopGL和SDL2或使用GLFW的C中,我习惯于调用WaitEvents()
而不是PollEvents()
.在启用垂直同步的情况下,这可以完美地解决所有问题.仅当执行输入时才处理逻辑,同时不超过刷新率.我想把这样的行为翻译成Java+WebGL.
我怎么才能解决这个问题?如何在事件发生时只请求绘制帧,而不超过在循环中调用的刷新率设置为requestAnimationFrame();
?