【问题标题】:How do I get a context restored?如何恢复上下文?
【发布时间】:2016-11-15 01:35:39
【问题描述】:

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

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

Exceeded 16 live WebGL contexts for this principal

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

如何要求恢复当前显示在窗口中的那些?

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

【问题讨论】:

标签: webgl


【解决方案1】:

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

此网页:http://developer.telerik.com/featured/lazy-loading-images-on-the-web/ 描述了如何对图像进行“延迟加载”,即仅在它们即将显示时才加载它们。相同的方法适用于 WebGL 场景的延迟加载,但有以下区别:

  • 由于上下文可能随时丢失,因此您不想在加载一次后删除侦听器。

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

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

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

    李>

编辑添加:上述方法在 Firefox 上是不够的。在那个浏览器上,一旦你获得了一个画布的 WebGL 上下文,它似乎会永远留在那里。如果它的上下文丢失了,因为你分配了太多其他的,它永远不会回来。我发现允许再次使用该画布的唯一方法是删除它并重新创建它,然后在其中分配一个新的上下文。我没有在 Chrome 中做过太多的实验,但它似乎受到了同样的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多