1

我正在编写一个小工具,允许开发人员使用 WebGL 在画布上渲染某些 3D 内容。

它将通过指定视图和相机来使用,就像这个简化的例子:

displayView( '#myCanvas1', [0, 5, 2] );

可能会被多次调用以在多个画布中显示:

displayView( '#myFrontCanvas', [0, 5, 2] );
displayView( '#mySideCanvas', [5, 0, 2] );

或者可能在同一个画布上多次调用以更改视图:

displayView( '#myCanvas', [0, 5, 2] );
// later
displayView( '#myCanvas', [5, 0, 2] );
// later
displayView( '.thisCanvasIsActuallyTheSameOneAgain', [5, 0, 0] );

每次在新画布上调用它时,都需要设置缓冲区、着色器等。但是当在以前使用的画布上调用时,它应该重新使用旧的缓冲区和着色器。我认为不可能在上下文之间共享资源,所以我需要自己复制和跟踪它们。

我的想法是每次在画布上调用它时将所有缓冲区、着色器等存储在一个数组中,然后在以后的调用中搜索这个数组。我不能将画布对象存储在数组中,因为它会弄乱垃圾收集,所以我的 XY 问题是:我可以检查特定的着色器、程序或缓冲区是否属于特定的上下文?我是否也相信当画布被移除时,着色器和缓冲区将被移除,即使它们仍然在数组中被引用

正如标题所暗示的,我也愿意为整个问题提供更好的解决方案。

4

1 回答 1

1

与大多数其他 JavaScript 对象一样,您可以向上下文对象本身添加一个属性,只要上下文存在,它就会一直存在。只要您不碰巧使用与其他人相同的名称,这将正常工作,因此请使用一个不错的唯一名称。

就像是:

function initializeStorage(context) {
    return { ... };
}

function getStorage(context) {
    if (!('_DavesLibraryPrivateStorage' in context)) {
        context._DavesLibraryPrivateStorage = initializeStorage(context);
    }
    return context._DavesLibraryPrivateStorage;
}

context.useProgram(getStorage(context).program);

未来的 JavaScript 版本可能会使用Wea​​kMap(现在在 Firefox 和 Chrome 中可用!)或private symbols以一种干净的方式做到这一点,所以只考虑这是一个临时的组合。

于 2013-05-15T01:51:02.057 回答