代码之家  ›  专栏  ›  技术社区  ›  Forepick

三js:渲染第一帧需要太多时间

  •  0
  • Forepick  · 技术社区  · 6 年前

    我用三个。js(使用WegGL)渲染在空间中动画的许多图像块(数千)的交替场景。动画由Tween处理。js。我使用Chrome进行测试。

    为了优化图像加载,我在显示第一个场景之前预加载所有纹理图像。然后,所有纹理都会以相同的格式保存在内存中 THREE.Texture .现在,当我准备要显示的场景时,我会执行以下操作:

    let tile = null, tweens = [], cameraZ = 1000;
    for (let y =  0; y < rows; y++){
        for (let x =  0; x < columns; x++){
            tile = await this.createTile(x, y, [textureSize]);
            tile.position.x = x * this.tileWidth - this.picWidth / 2;
            tile.position.y = -y * this.tileHeight + this.picHeight / 2;
            tile.position.z = cameraZ * 1.1;
    
            tweens.push(new TWEEN.Tween(tile.position)
                .to({z: 0}, 4000)
                .delay(200 + x * 120 + Math.random() * 1000)
                .easing(TWEEN.Easing.Cubic.InOut));
            this.scene.add(tile);
        }
    }
    tweens.map(t => t.start());
    

    场景准备还包括摄像机和一个点光源,大约需要400毫秒才能完成。

    然后,我按如下方式渲染场景:

    function render(){
        requestAnimationFrame(render);
        TWEEN.update();
        renderer.render(this.scene, this.camera);
    }
    render();
    

    当测量一些处理持续时间时,我看到 第一 渲染调用大约需要1400毫秒!其他通话需要70到100毫秒。

    我的最终目标是有多个这样的场景,一个接一个地播放,没有任何冻结。考虑到所有必需的资产都已加载,可能会出现什么问题?我如何优化?

    谢谢

    1 回复  |  直到 6 年前
        1
  •  0
  •   manthrax    6 年前

    在渲染的第一帧期间,将编译所有资源和着色器并将其上载到GPU。如果你想避免这种情况,你就得在幕后耍些花招。。类似于在加载每个对象后强制渲染一次,可能是通过将其添加到单个场景并调用渲染器。在上面渲染。根据瓶颈是什么(着色器编译与资产上载),这可能会有帮助,也可能没有帮助。。但是解决方法是进行某种预渲染,强制一次上传一张卡,而不是一次全部上传。

    此外,正如前面的评论者所指出的,上面的渲染循环中有一个输入错误。

    它应该是requestAnimationFrame(渲染);