2013-02-20 2 views
0

Когда я пишу Processing.js в JavaScript-вкусе, я получаю предупреждение о производительности, которое не получал, когда я использовал Processing.js для синтаксического анализа кода обработки. Я создал довольно простой эскиз с поддержкой 3D, чтобы войти в него, и консоль залита этим предупреждением:Предупреждение о производительности Processing.js

ПРЕДОСТЕРЕЖЕНИЕ ПРЕДУПРЕЖДЕНИЕ: Атрибут 0 отключен. Это имеет знаковое наказание за исполнение.

Что это значит? И что еще более важно: как это исправить?

Это эскиз. (watch/edit on codepen.io)

var can = document.createElement("canvas"); 
var sketch = function(p){ 

    p.setup = function(){ 
    p.size(800, 600, p.OPENGL); 
    p.fill(170); 
    }; 

    p.draw = function(){ 
    p.pushMatrix(); 
    p.translate(p.width/2, p.height/2); 
    p.box(50); 
    p.popMatrix(); 
    }; 
}; 

document.body.appendChild(can); 
new Processing(can, sketch); 
+0

предоставленная ссылка не работает в firefox, по-видимому, из-за политики безопасности. он запускается в Chrome без каких-либо предупреждений. –

+0

Возможно, вы захотите сообщить об этом в обработчике проблем обработки. Js, https://processing-js.lighthouseapp.com/projects/41284-processingjs/overview –

ответ

3

Это вопрос в Processing.js

Для детального объяснения: OpenGL и OpenGL ES имеют атрибуты. Все атрибуты могут извлекать значения из буферов или предоставлять постоянное значение. Кроме того, в атрибуте OpenGL 0 является специальным. Он не может обеспечить постоянное значение. Он ДОЛЖЕН получать значения из буфера. WebGL, хотя и основан на OpenGL ES 2.0, который не имеет этого ограничения.

Итак, когда WebGL работает поверх OpenGL, и пользователь не использует атрибут 0 (он настроен на использование постоянного значения), WebGL должен создать временный буфер, заполнить его постоянным значением и дать ему к OpenGL. Это медленно. Отсюда предупреждение.

Проблема в обработке - это один шейдер, который обрабатывает несколько вариантов использования. Он имеет атрибуты для нормалей, положений, цветов и координат текстуры. В зависимости от того, что вы запрашиваете, обработка для рисования может не использовать все эти атрибуты. Например, обычно он может не использовать нормали. Нормали нужны только в обработке для поддержки огней, поэтому, если у вас нет огней, нет нормалей (я предполагаю). В этом случае они выключают нормали. К сожалению, если нормали находятся в атрибуте 0, для того, чтобы WebGL визуализировал его, он должен создать временный буфер, заполнить его постоянным значением и затем визуализировать.

Путь вокруг этого - всегда использовать атрибут 0. В случае обработки они всегда будут использовать данные позиции. Поэтому, прежде чем увязывая их шейдеры они должны назвать bindAttribLocation

// "aVertex" is the name of the attribute used for position data in 
// Processing.js 
gl.bindAttribLocation(program, 0, "aVertex"); 

Это сделает атрибут «aVertex» всегда используют ATTRIB 0 и так как для каждого случая использования они всегда используют «aVertex» они никогда не получите это предупреждение.

В идеале вы всегда должны связывать свои местоположения. Таким образом, вам не нужно запрашивать их после ссылки.

+1

Pull Request Представлено https://github.com/jeresig/processing- js/pull/13 – gman

+0

gl в undefined, как вы его определяете? – prismspecs

+1

'gl' - общее имя переменной, используемой для хранения' WebGLRenderingContext'. Почти каждый пример использования stackoverflow для WebGL использует его. Код обычно выглядит примерно так: var gl = someCanvasElement.getContext ("webgl") '. Однако его не нужно называть «gl». В коде Processing.js используется 'curContext'. Three.js использует '_gl' – gman

Смежные вопросы