我觉得很奇怪,所有WebGL常量都被定义为渲染上下文的成员。这意味着如果上下文包含在某个库中,那么访问这些常量就会出现问题。
我有什么理由不明确地定义它们吗?或者,如果它们是实现定义的,可能是第一次创建上下文时,将所有枚举值写入某个全局对象?
基本上,我不想写new renderer.Texture(renderer.gl.TEXTURE_2D)
或new renderer.Texture("TEXTURE_2D")
,而是写new renderer.Texture(WebGL.TEXTURE_2D)
之类的内容。
答案 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
个文字。
代码:
const w = {
TEXTURE_2D: 0x0DE1,
};
gl.bindTexture(w.TEXTURE_2D, null);
gl.bindTexture(3553,null);
答案 1 :(得分:1)
您可以使用WebGLRenderingContext
和WebGL2RenderingContext
访问它们,而无需创建上下文实例。例如:
console.log(WebGLRenderingContext.TEXTURE_2D); // 3553