Доступ к константам / перечислениям WebGL без контекста - PullRequest
0 голосов
/ 25 мая 2018

Мне кажется странным, что все константы WebGL определены как члены контекста рендеринга.Это означает, что если контекст обернут в какую-то библиотеку, доступ к этим константам становится проблематичным.

Есть ли причина, по которой я не могу определить их все явно?Или, если они определены реализацией, может быть, при первом создании контекста записать все значения перечисления в какой-либо глобальный объект?

По сути, вместо записи new renderer.Texture(renderer.gl.TEXTURE_2D) или new renderer.Texture("TEXTURE_2D"), я хочу написать что-токак new renderer.Texture(WebGL.TEXTURE_2D).

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы можете получить к ним доступ, используя WebGLRenderingContext и WebGL2RenderingContext, не создавая экземпляр контекста.Например:

console.log(WebGLRenderingContext.TEXTURE_2D); // 3553
0 голосов
/ 25 мая 2018

вы можете определять их как свои собственные константы.На самом деле это может сделать ваш код быстрее

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, потому что даже константная переменная представляет собой нечто, создаваемое, а 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 с современным компрессором, он заменит любые 1034 * s для литералов, где это уместно.

Запуск примерачерез компилятор закрытия Google

код:

const w = {
  TEXTURE_2D: 0x0DE1,
};

gl.bindTexture(w.TEXTURE_2D, null);

результат :

gl.bindTexture(3553,null);
...