访问没有上下文的WebGL常量/枚举

时间:2018-05-25 15:23:25

标签: javascript webgl

我觉得很奇怪,所有WebGL常量都被定义为渲染上下文的成员。这意味着如果上下文包含在某个库中,那么访问这些常量就会出现问题。

我有什么理由不明确地定义它们吗?或者,如果它们是实现定义的,可能是第一次创建上下文时,将所有枚举值写入某个全局对象?

基本上,我不想写new renderer.Texture(renderer.gl.TEXTURE_2D)new renderer.Texture("TEXTURE_2D"),而是写new renderer.Texture(WebGL.TEXTURE_2D)之类的内容。

2 个答案:

答案 0 :(得分:2)

您可以自由地将它们定义为您自己的常量。实际上它可能会使您的代码更快

const TEXTURE_2D = 0x0DE1
...
gl.bindTexture(TEXTURE_2D, someTexture);

完全没问题。而且,如果该代码通过现代JavaScript压缩器运行,它将变为此

gl.bindTexture(0x0DE1, someTexture);

哪个可能会更快。然后更快gl.TEXTURE_2D,因为使用gl.TEXTURE_2D JavaScript引擎必须始终检查是否有人未将gl.TEXTURE_2D分配给其他内容。比TEXTURE_2D更快,因为即使是一个const变量代表正在创建的东西,而0x0DE1肯定不会。

仅仅因为我以后可能会遇到一些问题,我上面提到的关于速度的观点是JavaScript引擎每次调用时都必须检查

 gl.bindTexture(gl.TEXTURE2D, ...)

那个人某个地方没有做到

 gl.TEXTURE_2D = 123

或制作属性getter

 Object.defineProperty(gl, 'TEXTURE_2D', {
   enumerable: true,
   writable: false,
   get() {
     console.log('TEXTURE_2D was accessed at', (new Error()).stack));
     return 0xDE1;
   }
 });

JavaScript引擎无法假设TEXTURE_2D属性未更改。它必须每次检查。

对于const,可能存在或不存在一般速度差异,但例如,如果我们创建一个返回此类函数的函数

function makeFuncThatReturnsValue(value) {
  const v = value;
  return function() {
    return v;
  }
}

我们可以看到,每次调用makeFuncThatReturnsValue时,都会在闭包中创建并捕获新的v

直接使用文字不会有这个问题,什么都不会创建。当然你不想直接使用文字,魔术数字很糟糕,但是如果用现代压缩器编译JavaScript,它会在适当的时候交换任何const个文字。

通过Google's closure compiler

运行示例

代码:

const w = {
  TEXTURE_2D: 0x0DE1,
};

gl.bindTexture(w.TEXTURE_2D, null);

Result

gl.bindTexture(3553,null);

答案 1 :(得分:1)

您可以使用WebGLRenderingContextWebGL2RenderingContext访问它们,而无需创建上下文实例。例如:



console.log(WebGLRenderingContext.TEXTURE_2D); // 3553