对于循环是令人不安的渲染

时间:2016-01-06 11:09:06

标签: javascript html5 graphics three.js webgl

我有一些非常简单的3D对象(基本上是THREE.Sphere,它是1-30个其他THREE.Sphere的父级,具有RGB颜色,没有纹理),可以在某种实时动画中显示。

渲染很快就完成了,但我有一些简单的迭代计算(for-loops)会扰乱我的显示能力。 渲染本身不是问题,但下一帧顶点的计算是造成痛苦的原因

意思是,当我运行脚本时,我可以看到for-loops花费了太多时间来计算,然后它就会进入渲染部分,这很快就完成了。

我正在考虑以并行计算的方式处理这个问题 - 运行一个线程(工作者,无论在JS中调用什么)会计算for-loop,但我认为考虑到我缺乏计算机graphocs的经验,也许有一种更“模拟”的方式。这意味着处理计算机图形设计这样一个基本问题的更优雅/性能改进/自然的方式。

1 个答案:

答案 0 :(得分:0)

这是我用来进行长时间缓慢计算的基本思路,这些计算不会被看门狗定时器捕获并使浏览器或渲染率陷入困境。 基本思想是你使用一个javascript生成器,它允许你在计算过程中屈服,并在以后继续。然后,我在超时链上运行发电机泵。 这种方法的关键是" yield"保存函数状态并返回等待将来调用.next()函数的运算符。 (顺便说一下这个演示代码可能需要重新启动以处理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);
        }
}