2015-03-13 117 views
1

我已经有了一个WebGL场景,并且我可以使用一组参数来平衡渲染质量和速度。只要帧速率没有降低到某个阈值以下,我就会尽可能提高质量,从而向用户展示场景。为了实现这一点,我必须以某种方式测量“当前”帧速率以响应质量变化。测量渲染时间

但是,只要用户不与其交互(如使用鼠标旋转相机),场景就是静态的。即使没有任何变化,我也不想让循环重新渲染同一场景。如果场景停止移动,我想停止渲染。这意味着我不能简单地平均连续帧之间的时间,因为我无法区分呈现器缓慢和用户只是更慢地移动鼠标。

我想过在启动时多次渲染场景,并从中判断帧速率。但是由于场景的一部分可以从当前相机位置看到,或者由于用户在画布外进行交互,场景的复杂性可能会随时间而改变。所以当场景改变时,我必须调整质量。在每次鼠标释放之后运行校准循环可能是一种选择。

我也想过使用finish而不是flush调用来准确测量渲染时间。但是当我等待GL完成渲染时,我的应用程序基本上无响应,特别是无法排队鼠标事件。由于我设想渲染理想地在两帧之间以目标阈值帧速率占据所有时间,所以这可能是相当糟糕的。我只能在某些场合使用finish而不是flush,就像在鼠标释放之后一样。

什么是在WebGL应用程序中实现所需帧速率或定期测量渲染时间的最佳方法?

+1

仅供参考:[完成只是在chrome中刷新](http://stackoverflow.com/a/20810521/128511)。 – gman 2015-03-14 08:12:23

+0

@gman:有一个想法...非常感谢那篇文章! – MvG 2015-03-14 14:34:02

回答

1

为什么你不能使用平均渲染时间?

仅仅因为您渲染次数较少,并不意味着您无法平均渲染时间。得到一个准确的平均值需要更长的时间。

一旦用户开始移动鼠标,您将获得大量数据,并且无论如何应该很快为您提供平均渲染速率。

+0

无论何时我开始渲染,我都可以获取时间戳,但是我无法访问完成时的时间。所以比较一个开始时间和下一个开始时间并不告诉我任何事情,如果渲染时间不是限制因素,但鼠标速度是。 – MvG 2015-03-14 14:31:23

+0

你是什么意思,你没有访问? – 2015-03-14 23:20:24

+0

有一个afaik没有回调或类似的通知我的JavaScript代码,渲染已完成。当我调用'flush'(或根据gman的评论,甚至'finish')时* *不是*渲染完成的时间,而只是所有渲染指令已传递的时间。之后,渲染通常还需要更多时间。 – MvG 2015-03-15 09:42:38