【翻译】智能预加载(Intelligent Preloading)

虽然 node 能够异步且同时渲染和测量的能力使其相当强大,然而 Texture 另一个至关重要的层面就是智能预加载的想法。

June 15, 2017 -
ios texture 翻译

本文翻译自 TextureIntelligent Preloading 一文。

智能预加载


虽然 node 能够异步且同时渲染和测量的能力使其相当强大,然而 Texture 另一个至关重要的层面就是智能预加载的想法。

如在入门一文里指出的,使用一个 node 容器的上下文之外的 node 很少有好处。这是因为所有 node 都有其当前界面状态的概念。

这个 interfaceState 属性由 ASRangeController 不断更新,所有容器都在内部创建和维护。

一个 node 在容器之外使用时,它的状态不会被任何范围控制器更新。这有时会导致闪烁,因为 node 已经没有任何警告的出现在屏幕上之后被渲染。

界面状态范围

当 node 被添加到滚动或分页界面时,它们一般处于以下(图片所示)范围之一。这意味着当滚动视图滚动时,它们的界面状态将在它们移动时被更新。

Intelligent Preloading Ranges with Names

一个 node 将处于以下范围之一

界面状态(Interface State) 描述
预加载(Preload) 成为可见的最远范围。这是从外部来源收集内容的地方,无论是某种 API 或本地磁盘。
陈列(Display) 这里,开始如文本光栅化和图像解码等显示工作。
可见(Visible) node 至少有一个像素出现在屏幕上。


范围调整参数(ASRangeTuningParameters)

这些范围的每一个大小都是在“满屏”里测量的。虽然默认大小在许多案例中都能很好的工作,但是通过在滚动 node 上设置范围类型的调整参数,可以相当容易地进行调整。

Intelligent Preloading Ranges Screenfuls

在上面这个可视化的滚动集合中,用户正在向下滚动。如你所见,在前进方向的范围大小比用户正在离开(尾随方向)的内容要大得多。如果用户改变了方向,前进和尾随双方会动态交换以保证内存的最佳使用。这让你只需担心确定前进和尾随的大小,而无需担心你的用户改变滚动方向的反应。

智能预加载同样可以在多种尺寸下工作。

界面状态回调

当用户滚动时,node 移动通过这些范围并适当响应数据加载、渲染等等。你自己的 node 子类通过实现相应的方法,可以轻易的进入这个机制。
可见范围(Visible Range)

-didEnterVisibleState
-didExitVisibleState

陈列范围(Display Range)

-didEnterDisplayState
-didExitDisplayState

预加载范围(Preload Range)

-didEnterPreloadState
-didExitPreloadState


记得叫超级好吗? 😉