OffscreenCanvas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд╛рд░реНрдЯ рдХреЛ рдЧрддрд┐ рджреЗрдирд╛

рдЪрд╛рд░реНрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЬрдм рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЖрд░реЗрдЦреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рднреАрдбрд╝ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрддрд╛ рд╣реИред рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ OffscreenCanvas, рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рд╕рдорд░реНрдерди рдХрд╛ рд╕реНрддрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдмрдврд╝ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдПрдХ рд╡реЗрдм-рд╡рд░реНрдХрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рджреГрд╢реНрдп рддрддреНрд╡ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП <canvas>ред рд▓реЗрдЦ, рдЬрд┐рд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдЖрдЬ рд╣рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд╣реИ ред рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рд╕реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЙрдореНрдореАрдж рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреНрдпрд╛ рдХрдард┐рдирд╛рдЗрдпрд╛рдВ рдкреИрджрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред



OffscreenCanvas

рдСрдлрд╕реНрдХреНрд░реАрди рдХреИрдиреНрд╡рд╛рд╕ рдкрд░ рдзреНрдпрд╛рди рдХреНрдпреЛрдВ рджреЗрдВ?


рдЖрд░реЗрдЦ рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХреЛрдб рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдЙрдЪреНрдЪ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬрдЯрд┐рд▓рддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред рдореЗрдВ рдХрдИ рд╕реНрдерд╛рдиреЛрдВ рдкрд░, рдЖрдк рд╡рд┐рд╕реНрддреГрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдПрдиреАрдореЗрд╢рди рдЪрд┐рдХрдиреА рдФрд░ рдкреЗрдЬ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдВрдкрд░реНрдХ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛рдирд┐рдпреЛрдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ 10 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдордПрд╕ рдХреЗ рднреАрддрд░ рдПрдХ рдлреНрд░реЗрдо рдлрд┐рдЯ рдХрд╛ рдкреНрд░рддрд┐рдкрд╛рджрди рд╣реИ, рдЬреЛ рдЖрдк рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 60 рдлреНрд░реЗрдо рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдПрдХ рдлреНрд░реЗрдо рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧрдгрдирд╛рдУрдВ рдореЗрдВ 10 ms рд╕реЗ рдЕрдзрд┐рдХ рд▓рдЧрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдкреГрд╖реНрда рдХреЗ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп "рдордВрджреА" рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЛрдЧрд╛ред

рдЪрд┐рддреНрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕реНрдерд┐рддрд┐ рдирд┐рдореНрди рд╕реЗ рдмрдврд╝ рдЬрд╛рддреА рд╣реИ:

  • тАФ - (SVG, canvas, WebGL) , , .
  • , , , , 10 . ( тАФ ) .

рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рдПрдХ рдХреНрд▓рд╛рд╕рд┐рдХ рдЕрдиреБрдХреВрд▓рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдФрд░ рдЬреАрддрдирд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рд▓реЛрдб рдХреЗ рд╡рд┐рддрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдкрд╣рд▓реЗ, OffscreenCanvasрд╕рднреА рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЛрдб рдХреЛ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕ рдХреЛрдб рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдПрдкреАрдЖрдИ рдХреА рдЬрд░реВрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рддрдХрдиреАрдХреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, "рднрд╛рд░реА" рдЧрдгрдирд╛ рдкрд╣рд▓реЗ рдПрдХ рд╡реЗрдм рд╡рд░реНрдХрд░ рдереНрд░реЗрдб рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рд╣реЛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди, рдЪреВрдВрдХрд┐ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдХреЙрд▓реНрд╕ рдХреЛ рдореЗрди рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрд░ рд╕реНрдЯреНрд░реАрдо рдФрд░ рдЪрд╛рд░реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдХреЛрдб рдореЗрдВ рдореЗрди рд╕реНрдЯреНрд░реАрдо рдХреЗ рдмреАрдЪ рдХреЙрдореНрдкреНрд▓реЗрдХреНрд╕ рдореИрд╕реЗрдЬ рдПрдХреНрд╕рдЪреЗрдВрдЬ рд╕реНрдХреАрдо рдХреЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЬрд░реВрд░рдд рдереАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдиреЗ рдЕрдХреНрд╕рд░ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рдореВрд▓реА рдкреНрд░рджрд░реНрд╢рди рд▓рд╛рдн рджрд┐рдпрд╛ред

рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛OffscreenCanvas<canvas>рдПрдХ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдВ рддрддреНрд╡ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рддрд╣ рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рддрдВрддреНрд░ рджреЗрддрд╛ рд╣реИ ред рдпрд╣ рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреНрд░реЛрдо рдФрд░ рдПрдЬ рдмреНрд░рд╛рдЙрдЬрд╝рд░ (рдПрдЬ рдХреЗ рдмрд╛рдж рдХреНрд░реЛрдорд┐рдпрдо рдореЗрдВ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдлрд╝рд╛рдпрд░рдлрд╝реЙрдХреНрд╕ рд╕рдорд░реНрдерди OffscreenCanvasрдЫрд╣ рдорд╣реАрдиреЗ рдХреЗ рднреАрддрд░ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдпрджрд┐ рд╣рдо рд╕рдлрд╛рд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрднреА рднреА рдЕрдЬреНрдЮрд╛рдд рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдпреЛрдЬрдирд╛ рд╣реИред

OffscreenCanvas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЪрд╛рд░реНрдЯ рдЖрдЙрдЯрдкреБрдЯ



рдПрдХ рдЪрд╛рд░реНрдЯ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЬреЛ 100,000 рдмрд╣реБ-рд░рдВрдЧреАрди рдбреЙрдЯреНрд╕ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛

рд╣реИ рд╕рдВрднрд╛рд╡рд┐рдд рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХрд╛ рдмреЗрд╣рддрд░ рдЖрдХрд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПOffscreenCanvas, рдЖрдЗрдП рдкрд┐рдЫрд▓реЗ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП "рднрд╛рд░реА" рдЖрд░реЗрдЦ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

const offscreenCanvas = canvasContainer
  .querySelector('canvas')
  .transferControlToOffscreen();
const worker = new Worker('worker.js');
worker.postMessage({ offscreenCanvas }, [offscreenCanvas]);

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдирдИ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ OffscreenCanvasрддрддреНрд╡ рдХреЛ рдХреНрд╡реЗрд░реА рдХрд░рддреЗ рд╣реИрдВ ред рдлрд┐рд░ рд╣рдо рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ , рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ ред рдпрд╣ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ, рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдпрд╣ рдЖрдкрдХреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХрд╛ рдорд╛рд▓рд┐рдХ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдЙрд╕реЗ рдЕрдХреЗрд▓реЗ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ редcanvastransferControlToOffscreen()worker.postMessage({ canvas: offscreenCanvas }, [offscreenCanvas])offscreenCanvas[offscreenCanvas]OffscreenCanvas

canvasContainer.addEventListener('measure', ({ detail }) => {
  const { width, height } = detail;
  worker.postMessage({ width, height });
});
canvasContainer.requestRedraw();

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдЖрдХрд╛рд░ OffscreenCanvasрдореВрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ widthрдФрд░ heightрддрддреНрд╡ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ canvas, рдпрд╣ рд╣рдорд╛рд░реА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИ рдХрд┐ рдЬрдм рддрддреНрд╡ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рд╛ рдЬрд╛рдП рддреЛ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдВ canvasред рдпрд╣рд╛рдБ рд╣рдо рдШрдЯрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ measureрд╕реЗ d3fc-canvasрд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдЕрд╡рд╕рд░ рджреЗрдЧрд╛ рдХреЗ рд╕рд╛рде рд╕рдордЭреМрддреЗ рдореЗрдВ, requestAnimationFrame, рддрддреНрд╡ рдХреЗ рдирдП рдЖрдпрд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕рдВрдкреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП canvasред

рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо d3fc рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ ред рдпрд╣ рд╕рд╣рд╛рдпрдХ рдШрдЯрдХреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬреЛ рдпрд╛ рддреЛ рдбреА 3 рдШрдЯрдХреЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдЙрдирдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИред рдЖрдк OffscreenCanvasрдмрд┐рдирд╛ d3fc- рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдЙрди рд╕рднреА рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдорд╛рдирдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред

рдЕрдм рдлрд╛рдЗрд▓ рд╕реЗ рдХреЛрдб рдкрд░ рдЬрд╛рдПрдВ worker.jsред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╡реГрджреНрдзрд┐ рдХреЗ рд▓рд┐рдП, рд╣рдо WebGL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

addEventListener('message', ({ data: { offscreenCanvas, width, height } }) => {
    if (offscreenCanvas != null) {
        const gl = offscreenCanvas.getContext('webgl');
        series.context(gl);
        series(data);
    }

    if (width != null && height != null) {
        const gl = series.context();
        gl.canvas.width = width;
        gl.canvas.height = height;
        gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
    }
});

рдЬрдм рд╣рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╡рд╛рд▓рд╛ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ canvas, рддреЛ рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рд╕реЗ рдЖрдпрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рддрддреНрд╡ рд╕реЗ canvasрд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ webglрдФрд░ рдЗрд╕реЗ рдШрдЯрдХ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ seriesред рддрдм рд╣рдо рдШрдЯрдХ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ series, рдЗрд╕реЗ рдбреЗрдЯрд╛ ( data) рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдВрдбрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдЪрд░ рдХрд╣рд╛рдВ рд╕реЗ рдЖрдП рдереЗ )ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЧреБрдг widthрдФрд░ height, рдЬреЛ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЖрдП рдереЗ, рдФрд░ рд╡реЗрдмрд▓реЙрдЧ рдХреЗ рдЖрдпрд╛рдо offscreenCanvasрдФрд░ рджреЗрдЦрдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред offscreenCanvasрд╕реАрдзреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рдПрдХ рд╕рдВрдкрддреНрддрд┐ offscreenCanvasрдпрд╛ рдЧреБрдг рд╢рд╛рдорд┐рд▓ рд╣реИрдВ widthрдФрд░ heightред

рд╢реЗрд╖ рд╡рд░реНрдХрд░ рдХреЛрдб, рд╣рдо рдЬреЛ рдЖрдЙрдЯрдкреБрдЯ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдпрд╣ рд╕рдм рдЖрдкрд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИ, рддреЛ рдЖрдк рддреБрд░рдВрдд рдЕрдЧрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╣реИрдВред

const randomNormal = d3.randomNormal(0, 1);
const randomLogNormal = d3.randomLogNormal();

const data = Array.from({ length: 1e5 }, () => ({
    x: randomNormal(),
    y: randomNormal(),
    size: randomLogNormal() * 10
}));

const xScale = d3.scaleLinear().domain([-5, 5]);

const yScale = d3.scaleLinear().domain([-5, 5]);

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рдбреЗрдЯрд╛рд╕реЗрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ x / y рдХреЗ рдЖрд╕рдкрд╛рд╕ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ x рдФрд░ y рдорд╛рдиреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ range, рдХреНрдпреЛрдВрдХрд┐ WebGL рд╢реНрд░реГрдВрдЦрд▓рд╛ canvas (-1 -> +1рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рддрддреНрд╡ рдХреЗ рдкреВрд░реНрдг рдЖрдХрд╛рд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреА рд╣реИ)ред

const series = fc
    .seriesWebglPoint()
    .xScale(xScale)
    .yScale(yScale)
    .crossValue(d => d.x)
    .mainValue(d => d.y)
    .size(d => d.size)
    .equals((previousData, data) => previousData.length > 0);

рдЕрдЧрд▓рд╛, рд╣рдо рдмрд┐рдВрджреБрдУрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ xScaleрдФрд░ yScaleред рдлрд┐рд░ рд╣рдо рдкрд╣реБрдВрдЪ рдХреЗ рдЙрдкрдпреБрдХреНрдд рд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдорд╛рдирддрд╛ рдЬрд╛рдБрдЪ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХ dataрдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЗрдВ рдЬреАрдкреАрдпреВ рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ред рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рднрд▓реЗ рд╣реА рд╣рдореЗрдВ рдкрддрд╛ рд╣реЛ рдХрд┐ рд╣рдо рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдШрдЯрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди "рдЧрдВрджреЗ" рдЬрд╛рдВрдЪ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИред

const colorScale = d3.scaleOrdinal(d3.schemeAccent);

const webglColor = color => {
    const { r, g, b, opacity } = d3.color(color).rgb();
    return [r / 255, g / 255, b / 255, opacity];
};

const fillColor = fc
    .webglFillColor()
    .value((d, i) => webglColor(colorScale(i)))
    .data(data);

series.decorate(program => {
    fillColor(program);
});

рдпрд╣ рдХреЛрдб рдЖрдкрдХреЛ рдЪрд╛рд░реНрдЯ рдХреЛ рд░рдВрдЧреАрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЙрдкрдпреБрдХреНрдд рд░рдВрдЧ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдореЗрдВ рдмрд┐рдВрджреБ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ colorScale, рдлрд┐рд░ рдЗрд╕реЗ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдЙрдЯрдкреБрдЯ рдмрд┐рдВрджреБ рдХреЛ рд╕рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред

function render() {
    const ease = 5 * (0.51 + 0.49 * Math.sin(Date.now() / 1e3));
    xScale.domain([-ease, ease]);
    yScale.domain([-ease, ease]);
    series(data);
    requestAnimationFrame(render);
}

рдЕрдм рдЬрдм рдЕрдВрдХ рд░рдВрдЧреАрди рд╣реЛ рдЧрдП рд╣реИрдВ, рддреЛ рдЬреЛ рдХреБрдЫ рд╢реЗрд╖ рд╣реИ рд╡рд╣ рдЪрд╛рд░реНрдЯ рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рд╣рдореЗрдВ рдирд┐рд░рдВрддрд░ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА render()ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХреБрдЫ рднрд╛рд░ рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред рд╣рдо requestAnimationFrameрдЧреБрдгреЛрдВ xScale.domainрдФрд░ yScale.domainрд╣рд░ рдлреНрд░реЗрдо рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рд░реНрдЯ рд╕реНрдХреЗрд▓ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдФрд░ рдХрдореА рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ ред рдпрд╣рд╛рдВ, рд╕рдордп-рдирд┐рд░реНрднрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ рддрд╛рдХрд┐ рдЪрд╛рд░реНрдЯ рдХрд╛ рдкреИрдорд╛рдирд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрджрд▓ рдЬрд╛рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рд╕рдВрджреЗрд╢ рд╣реЗрдбрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЪрдХреНрд░ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХрд╣рд╛ render()рдЬрд╛рдП, рдФрд░ рддрд╛рдХрд┐ рд╣рдореЗрдВ рд╕реАрдзреЗ рдХреЙрд▓ рди рдХрд░рдирд╛ рдкрдбрд╝реЗ series(data)ред

importScripts(
    './node_modules/d3-array/dist/d3-array.js',
    './node_modules/d3-collection/dist/d3-collection.js',
    './node_modules/d3-color/dist/d3-color.js',
    './node_modules/d3-interpolate/dist/d3-interpolate.js',
    './node_modules/d3-scale-chromatic/dist/d3-scale-chromatic.js',
    './node_modules/d3-random/dist/d3-random.js',
    './node_modules/d3-scale/dist/d3-scale.js',
    './node_modules/d3-shape/dist/d3-shape.js',
    './node_modules/d3fc-extent/build/d3fc-extent.js',
    './node_modules/d3fc-random-data/build/d3fc-random-data.js',
    './node_modules/d3fc-rebind/build/d3fc-rebind.js',
    './node_modules/d3fc-series/build/d3fc-series.js',
    './node_modules/d3fc-webgl/build/d3fc-webgl.js'
);

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ importScripts, рдФрд░ рдЗрд╕рд▓рд┐рдП, рддрд╛рдХрд┐ рдирд┐рд░реНрдорд╛рдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ, рд╣рдо рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдВрдХрд▓рд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рдХреЗрд╡рд▓ рдкреВрд░реНрдг d3 / d3fc рдмрд┐рд▓реНрдб рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ DOM рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рд╡рд╣ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред

тЖТ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб GitHub рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

рдСрдлрд╕реНрдХреНрд░реАрдирдХреИрдирд╡рд╛рд╕ рдФрд░ рдкреНрд░рджрд░реНрд╢рди


рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдПрдиреАрдореЗрд╢рди requestAnimationFrameрдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред рдпрд╣ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рддрдм рднреА рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрдм рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкрд┐рдЫрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреГрд╖реНрда рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ Stop main thread, рддреЛ рдЖрдк рдЗрд╕ рддрдереНрдп рдкрд░ рдзреНрдпрд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╕рдВрджреЗрд╢ рдмреЙрдХреНрд╕ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрджреНрдпрддрди рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдЕрд╡рд░реБрджреНрдз рд╣реИ, рд▓реЗрдХрд┐рди рдЪрд╛рд░реНрдЯ рдПрдиреАрдореЗрд╢рди рдмрдВрдж рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред


рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╡рд┐рдВрдбреЛ

рд╣рдо рдореБрдЦреНрдп рдзрд╛рд░рд╛ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдХреЗ рдЖрд░рдВрдн рдХрд┐рдП рдЧрдП рдПрдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рддрдм рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рдЪрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рддрд╛рдЬрд╝рд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдпрджрд┐ рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдХреБрдЫ рдХреЗ рд╕рд╛рде рд╡реНрдпрд╕реНрдд рд╣реИ рдФрд░ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдВ рдХреЛрдИ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреАред

рдЪрд╛рд░реНрдЯ рдореЗрдВ рд▓рдЧрд╛рддрд╛рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдЬрдм рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдкреНрд░рд╢рдВрд╕рдХ рдФрд░ рдХрдо рдмреИрдЯрд░реА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд╛рд░рд╛рдЬ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рддрд░реАрдХрд╛ рд╣реИред рдирддреАрдЬрддрди, рдпрд╣ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдФрд░ рд╢реНрд░рдорд┐рдХ рдзрд╛рдЧреЗ рдХреЗ рдмреАрдЪ рдЬрд┐рдореНрдореЗрджрд╛рд░рд┐рдпреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП, рдЗрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рд╡рд╣ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рд╕реЗ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣рд╛рдВ рд╣рдордиреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рд╣рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдмреАрдЪ рдмрд╣реБрдд рдХрдо рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрдкрдиреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХрддрд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╣реВрдВрдЧрд╛, рдЖрд▓рд╕реНрдп рдХреЛ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдмреАрдЪ рд╕рдВрджреЗрд╢ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдпреЛрдЬрдирд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рдПрдЧреА рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЖрд░реЗрдЦ рдФрд░ рд╡рд┐рдЬрд╝реБрдЕрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдЙрди рдкрд░ рдирд┐рд░реНрднрд░ рд╣реЛрдЧреАред

рдЖрдк рдореБрдЦреНрдп рдереНрд░реЗрдб рдФрд░ рд╡рд░реНрдХрд░ рдереНрд░реЗрдб рдХреЗ рдмреАрдЪ рдЕрд▓рдЧ рд╕рдВрджреЗрд╢ рдЪреИрдирд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ MessageChannel рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ редред рдЗрди рдЪреИрдирд▓реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдирдХ рддрдВрддреНрд░ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдХреЛрдорд▓рд┐рдВрдХ рдЬреИрд╕реА рддреГрддреАрдп-рдкрдХреНрд╖ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛рд░реНрдп рдХрд░ рд╕рдХрддреА рд╣реИ ред рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдкреНрд░реЙрдХреНрд╕реА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдЙрдЪреНрдЪ-рд╕реНрддрд░реАрдп рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╡рд┐рд╡рд░рдг рдЫрд┐рдкрд╛рддреА рд╣реИ ред

рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛, рдЬреЛ рд░реЗрдЯреНрд░реЛрд╕реНрдкреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдпрд╣ рддрдереНрдп рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐ рдЕрдиреНрдп рд╕рдВрд╕рд╛рдзрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рддрд░рд╣ рдЬреАрдкреАрдпреВ рд╕рдВрд╕рд╛рдзрди рдЕрдирдВрдд рд╕реЗ рджреВрд░ рд╣реИрдВред рдПрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдореЗрдВ рдкреНрд░рддрд┐рдкрд╛рджрди рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдореБрдЦреНрдп рд╕реВрддреНрд░ рдХреЛ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдмреНрд░рд╛рдЙрдЬрд╝рд░, рд╡реИрд╕реЗ рднреА, DOM рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП GPU рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╕рд╛рдзрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ OffscreenCanvasред

рдпрджрд┐ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рд╕рднреА GPU рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрднреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдореБрдЦреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдВрдбреЛ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЕрдиреБрднрд╡ рдХрд░реЗрдЧреА, рднрд▓реЗ рд╣реА рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреА рдЧрдИ рд╣реЛред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЧрддрд┐ рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЕрдВрдХ рдХреА рд╕рдВрдЦреНрдпрд╛ рдмрдврд╝ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛рд░реНрдб рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкреГрд╖реНрда рдкрд░ рдкреНрд░реЗрд╖рд┐рдд рдмрд┐рдВрджреБрдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдмрдврд╝рд╛рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХрддрдо 100000 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдкреГрд╖реНрда рдкрд░ рдПрдХ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣рд╛рдВ рд╣рдордиреЗ рд╕рдВрджрд░реНрдн рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЧреБрдкреНрдд рджреБрдирд┐рдпрд╛ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛рдпрд╛ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдзреНрдпрдпрди рд╕реЗ рд╣рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдХреА рдЙрддреНрдкрд╛рджрдХрддрд╛ рдмрдврд╝рд╛рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХрддреА рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВрдиреЗ рдРрд╕рд╛ рдЗрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдирд┐рдореНрди рд╕реНрддрд░ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░рдг рдРрд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдпрджрд┐ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ OffscreenCanvas, рддреЛ рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрддреА рд╣реИ desynchronizedред рдпрд╣, рдЬрд╣рд╛рдВ рдпрд╣ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдФрд░ рдХреБрдЫ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рдЗрд╡реЗрдВрдЯ рд▓реВрдк рдФрд░ рд╡рд░реНрдХрд░ рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд░реЗрдВрдбрд░ рд▓реВрдк рдХреЗ рдмреАрдЪ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЫрд╡рд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рджреЗрд░реА рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╡рд░рдг рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рд╕рд╛рд░рд╛рдВрд╢


рдЗрдВрдЯрд░рдлрд╝реЗрд╕ OffscreenCanvasрдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЪрд╛рд░реНрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • (, , ) - .

    • , . , , , postMessage.
  • , (, SVG/HTML- <canvas>), , , .

    • , , , , , , , , .
  • , GPU, OffscreenCanvas .

    • OffscreenCanvas, GPU-, , . , , .

рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рд╣реИ, рдФрд░ рдпрд╣рд╛рдБ рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рд╕рдВрд╕реНрдХрд░рдг рд╣реИред

рдкреНрд░рд┐рдп рдкрд╛рдардХреЛрдВ! рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╡реЗрдм рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдСрдлрд╝рд╕реНрдХреНрд░реАрди рдХреИрдирд╡рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ?


All Articles