我正在编写一个小工具,允许开发人员使用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] );
每次在新画布上调用它时,都需要设置缓冲区,着色器等。但是在以前使用的画布上调用时,它应该重用旧的缓冲区和着色器。我不认为在上下文之间共享资源是可能的,所以我需要复制&自己跟踪它们。
我的想法是每次在画布上调用时将所有缓冲区,着色器等存储在数组中,然后在以后的调用中搜索此数组。我不能将canvas对象存储在数组中,因为它会搞乱垃圾收集,所以我的XY问题是:我可以检查特定着色器,程序或缓冲区是否属于特定上下文吗?我还相信,当我删除画布时,着色器和缓冲区将被移除,即使它们仍然在数组中被引用?
正如标题所暗示的那样,我也愿意更好地解决问题。
答案 0 :(得分: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可能会以一种干净的方式使用 WeakMap (现在可在Firefox中使用,并在Chrome后面的旗帜!)或私有符号,所以只考虑这是一个临时的污泥。