# rendering-loop - 渲染循环

提示

Cornerstone 视口变动 (比如: 开窗、平移、缩放等等),Enabled Element - 激活元素 是依靠基于 requestAnimationFrame (opens new window)渲染循环 去做更新的。

# 原理说明

在大多数现代浏览器中,渲染循环 使用 requestAnimationFrame (opens new window) (RAF)方法。如果RAF不可用,它将用一个16毫秒的定时器 -- setTimeoutclearTimeout 进行微调。

在 Cornerstone 中渲染循环功能基于元素启用的。在 Cornerstone 中用 enable(element)disable(element) 来启用和禁用元素。

# 工作流程

工作流成如下:

  • 在 RAF 注册 draw() 回调;
  • 在屏幕上显示帧之后,浏览器调用 draw();
  • 一旦调用
    • 如果元素计划重新呈现,则它将被呈现并重新向RAF注册 draw();
    • 如果元素计划重新呈现,则不执行任何工作,回调将重新注册到 RAF;
    • 如果元素已经被禁用,回调返回是not重新注册结束渲染循环。

这意味着:

  • cornerstone.draw() 和 cornerstone.invalidate() 不再触发立即渲染视图,而是将图像标记为需要重新呈现;
  • 每个cornerstone 元素注册自己的RAF循环;
  • 如果在一个60赫兹的系统中渲染时间超过16毫秒,则跳过渲染帧;
  • 即使渲染时间远低于16ms,每个帧只能有一个渲染;
  • 所有的交互(平移、缩放等)都被合并并呈现在下一帧中。