2016-01-06 3 views
0

У меня есть довольно простые 3D-объекты (в основном THREE.Sphere, который является родителем 1-30 других THREE.Sphere s, с цветом RGB и без текстуры) для отображения в несколько анимации в реальном времени.Для петель беспокоит рендеринг

Отрисовка выполняется в кратчайшие сроки, но у меня есть простой итеративный расчет (for-loops), которые нарушают мои возможности отображения. рендеринга само по себе не является проблемой, но вычисление для следующего кадра вершин, что вызывает боль

Значение, когда я просто запустить сценарий, я могу видеть, что for-loops занимает слишком много времени, чтобы вычислить , и именно тогда он переходит в секцию рендеринга, которая выполняется в кратчайшие сроки.

Я думал о решении этой проблемы в параллельной вычислительной манере - работает поток (рабочий, независимо от того, что он вызывается в JS), который будет вычислять for-loop, но я думал, что, учитывая мой недостаток опыта в компьютерных графиках, возможно, существует более «графический» способ сделать это. Это более элегантный/улучшенный/естественный способ решения такой фундаментальной проблемы проектирования компьютерной графики.

+4

Это может быть хорошей идеей, чтобы показать код цикла вы думаете медленно. – 2pha

+1

Для чего нужны шейдеры, переместите свой код на графический процессор, и он будет намного быстрее из-за параллелизма. –

+0

@BrendanAnnable - не шейдеры для рендеринга? Графический процессор не очень эффективен для простых, нематричных операций. Все, что мне нужно (@ 2pha) в цикле for - это некоторый доступ к памяти, а также некоторые сравнения, некоторая сортировка выполняется на нескольких небольших массивах (около 5 массивов до 30 целых элементов каждый) –

ответ

0

Это основная идея, которую я использую для выполнения длительных медленных вычислений, которые не попадают в таймер сторожевого таймера и не боятся браузера или скорости рендеринга. Основная идея заключается в том, что вы используете генератор javascript, который позволяет вам выполнить вычисление в середине вычисления и продолжить позже. Затем я запускаю насос генератора по тайм-ауту. Ключом к этому методу является оператор «yield», который сохраняет состояние функции и возвращается в ожидании будущего вызова функции .next(). (Кстати это демо-код, возможно, придется повторно arraged обрабатывать firefoxs опережающие ссылки)

//function Chain represents the slow code 
function *Chain() 
{ 
    for(i=0;i<1000000;i++) //this represents a long slow calculation 
    { 
     if(i%100==0)  //on occassion, yield 
      yield; 
    } 

} 
console.log("starting chain"); 
gChain=Chain(); //startup and get the next generator pointer 
timeout = setTimeout(function() { ChainStart(); }, 1); 
//function ChainStart is a pump that runs the generator using a timeout chain so other threads can run 
function ChainStart(){     
     if(gChain.next().done){ 
      clearTimeout(timeout); 
      console.log("endingchain");     
     } 
     else{      
      clearTimeout(timeout); 
      timeout = setTimeout(function() { ChainStart(); }, 1); 
     } 
} 
+0

Вы должны проверить [HTML5 WebWorkers] (http://www.html5rocks.com/en/tutorials/workers/basics/). Это может быть интересно для вас как альтернатива вашему решению 'setTimeout' ... – Wilt

+0

Да, это круто! Поток безопасности звучит так, будто он может быть волосатым, но в некоторых случаях это должно быть лучше. – fluffybunny

+0

Я использовал его раньше, и это не так сложно, как кажется. Некоторые примеры помогут. Вы должны только думать о поддержке браузера ... – Wilt

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