在画布上二维渲染

在尝试优化在画布中创建的2D动画时,找到了一个有趣的选项。


英雄形象


初步可视化-预渲染。


“而且,如果您预先记录所有帧并在动画结束后显示它们怎么办?” -我们和一个朋友想了,第二天就是这样。


现场演示


amedomary.ru/prerender-canvas


代码v1.0


该页面本身位于Github上


逻辑非常简单,分两个步骤实现:


第1步-将动画的每一帧保存到图像数组中


第1步-JavaScript代码
  function renderLoop() {
    draw();

    // create prerender images
    canvasPrerender.toBlob(blob => {
      const reader = new FileReader();
      reader.readAsDataURL(blob);

      reader.onload = function() {
        const image = document.createElement("img");
        image.src = reader.result;
        prerenderArr.push(image);
      };
    });

    if (prerenderIsCompleted) {
      requestAnimationFrame(renderLoop);
    } else {
      requestAnimationFrame(drawPreImg);
    }
  }

2 — —


2 - javascript
  function drawPreImg() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.drawImage(prerenderArr[i], 0, 0);

    requestAnimationFrame(drawPreImg);
  }


Analytic


. macbook 13 2019 .


.


FPS


Fps "" .


Fps "" (prerender): 14-22
Fps "" ( ): 58-60


fps计数器

, live demo.



Prerender — 9
— 3
— 12 ( live demo)


CPU / Performance


从下面的屏幕截图可以看出-我们的处理器仅在预渲染阶段受苦。绘制现成的图像并不困难。


性能-屏幕截图

性能


记忆


对于像我们这样的小型动画,整个过程需要:
〜432/2 = 200帧〜25
mb


性能


结论


如果您有机会在向用户展示动画之前等待,并且它不会耗尽千兆字节的内存,请尝试执行类似的操作。


聚苯乙烯


如果您对改善这种方法的性能有想法-请写:)


All Articles