如何恢复上下文?

时间:2016-07-12 17:11:20

标签: webgl

rgl中使用knitr,用户可以在单独的显示中编写包含多个WebGL场景的文档。其中每一个都是通过创建一个画布,获取与之关联的WebGL上下文,然后进行一堆WebGL绘图来创建的。

用户可以在单个HTML页面中请求任意数量的显示,最终它们将用完上下文,并且(在Firefox中)控制台将显示

Exceeded 16 live WebGL contexts for this principal

我将获得WebGLcontextlost事件。滚动页面时,所有早期显示都是空白的,只显示后面的显示。

如何恢复当前在窗口中显示的内容?

编辑添加:此问题的一个变体:如何将画布设置为仅在滚动到视图时尝试绘制自己?在典型情况下,一次只能看到一个或两个上下文,因此绘制它们应该没问题。但是当发生这种情况时,需要告知代码。

1 个答案:

答案 0 :(得分:0)

我不知道如何触发WebGLcontextrestored事件,但我可以在我的问题上回答该变体:

此网页:http://developer.telerik.com/featured/lazy-loading-images-on-the-web/描述了如何执行"延迟加载"图像,即仅在它们即将显示时加载它们。同样的方法适用于延迟加载WebGL场景,但有以下不同之处:

  • 由于上下文可能随时丢失,因此一旦您加载了一次,您就不想删除它。

  • 您确实希望WebGLcontextlost事件记录需要使用新上下文重新初始化画布的事实。

  • 您需要在重新初始化后绘制场景。

  • (可选):我喜欢场景始终存在的错觉,因此我的isInBrowserViewport测试检查场景的任何部分是否可见,而不是整个场景可见。

编辑补充:上述方法在Firefox上还不够。在那个浏览器上,一旦你获得了画布的WebGL上下文,它就会永远存在。如果由于你分配了太多其他内容而导致其上下文丢失,那么它永远不会回来。我发现允许再次使用该画布的唯一方法是删除它并重新创建它,然后在其中分配新的上下文。我还没有在Chrome中做过尽可能多的实验,但似乎也遇到了同样的限制。