| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Lottie-Web Perf</title> |
| <meta charset="utf-8" /> |
| <meta http-equiv="X-UA-Compatible" content="IE=egde,chrome=1"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <script src="/res/lottie.js" type="text/javascript" charset="utf-8"></script> |
| <style type="text/css" media="screen"> |
| body { |
| margin: 0; |
| padding: 0; |
| } |
| </style> |
| </head> |
| <body> |
| <main> |
| <canvas id=canvas width=1000 height=1000 style="height: 1000px; width: 1000px;"></canvas> |
| </main> |
| <script type="text/javascript" charset="utf-8"> |
| (function () { |
| const PATH = '/res/lottie.json'; |
| const RENDERER = 'canvas'; |
| const MAX_FRAMES = 25; |
| const MAX_LOOPS = 3; |
| |
| const cvs = document.getElementById("canvas"); |
| const canvasContext = cvs.getContext('2d'); |
| |
| // Get total number of frames of the animation from the hash. |
| const hash = window.location.hash; |
| const totalFrames = hash.slice(1); |
| console.log("Lottie has " + totalFrames + "total frames"); |
| |
| // Load the animation with autoplay false. We will control which |
| // frame to seek to and then will measure performance. |
| let anim = lottie.loadAnimation({ |
| container: document.querySelector('.anim'), |
| renderer: RENDERER, |
| loop: false, |
| autoplay: false, |
| path: PATH, |
| rendererSettings: { |
| context: canvasContext, |
| scaleMode: 'noScale', |
| clearCanvas: true, |
| preserveAspectRatio:'xMidYMid meet', |
| }, |
| }); |
| |
| const t_rate = 1.0 / (MAX_FRAMES - 1); |
| let frame = 0; |
| let loop = 0; |
| const drawFrame = () => { |
| if (frame >= MAX_FRAMES) { |
| // Reached the end of one loop. |
| loop++; |
| if (loop == MAX_LOOPS) { |
| // These are global variables to talk with puppeteer. |
| window._lottieWebDone = true; |
| return; |
| } |
| // Reset frame to restart the loop. |
| frame = 0; |
| } |
| |
| let t1 = Math.max(Math.min(t_rate * frame, 1.0), 0.0); |
| let seekToFrame = totalFrames * t1; |
| if (seekToFrame >= totalFrames-1) { |
| // bodymovin player sometimes draws blank when requesting |
| // to draw the very last frame. Subtracting a small value |
| // seems to fix this and make it draw the last frame. |
| seekToFrame -= .001; |
| } |
| |
| anim.goToAndStop(seekToFrame, true /* isFrame */); |
| console.log("Used seek: " + (seekToFrame/totalFrames)); |
| frame++; |
| window.requestAnimationFrame(drawFrame); |
| }; |
| window.requestAnimationFrame(drawFrame); |
| })(); |
| </script> |
| </body> |
| </html> |