bugfix> javascript > 投稿

すべてのWebGL定数がレンダリングコンテキストのメンバーとして定義されているのは奇妙です。これは、コンテキストが何らかのライブラリでラップされている場合、それらの定数へのアクセスが問題になることを意味します。

それらをすべて明示的に定義できない理由はありますか?または、実装が定義されている場合、おそらくコンテキストが最初に作成されたときに、すべての列挙値をグローバルオブジェクトに書き込みますか?

基本的に、 new renderer.Texture(renderer.gl.TEXTURE_2D) を書く代わりにまたは new renderer.Texture("TEXTURE_2D")new renderer.Texture(WebGL.TEXTURE_2D) のようなものを書きたい 。

回答 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
    
    

    または、プロパティゲッターを作成します

    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のクロージャーコンパイラを介して例を実行する

    コード:

    const w = {
      TEXTURE_2D: 0x0DE1,
    };
    gl.bindTexture(w.TEXTURE_2D, null);
    
    

    結果:

    gl.bindTexture(3553,null);
    
    

  • WebGLRenderingContext を使用してアクセスできます  および WebGL2RenderingContext  コンテキストのインスタンスを作成せずに。例えば:

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

あなたの答え