是否通过原型和数据绑定来提高TVML的性能……

自tvOS推出以来,TVMLKit的低性能一直是其最大的瓶颈之一。 不仅在执行繁重的计算任务(这可能最终归结为Swift)时,而且在处理许多UI元素时也是如此。

您只需要加载包含多个项目和图层的屏幕,就可以在加载视图时注意到延迟和故障。

幸运的是,去年6月在WWDC 2017上,随着tvOS 11的介绍,Apple推出了一种解决方案,该方案针对TVML在加载非常大的文档时提供的低性能。 这就是他们所谓的原型和数据绑定。

原型与数据绑定

这个想法很简单,当使用“收藏夹列表”(网格,架子或轮播)时,在我们的TVML文档中最终会出现很多重复的文本是很常见的,因为大多数条目将包含与收藏夹重复的几乎相同的信息。

   



电影0



电影1
  [...] 
   

电影999


使用tvOS 11中新的原型概念,可以将所有重复的代码行合并到单个项目定义中。

   








一旦加载了文档,由于其较小的尺寸,它的速度要快得多,可以使用数据绑定来填充集合

  //创建数据项 
 让dataItems = []; 
for(让i = 0; i <999; ++ i){
让movie = listOfMovies [i];
 让dataItem = new DataItem(“ Movie”,movie.id); 
dataItem.image = movie.image;
dataItem.title = movie.title;
dataItems.push(dataItem);
}
  //将数据项追加到“网格”部分 
  const section = document.getElementsByTagName('section')。item(0); 
让sectionDataItem = new DataItem();
sectionDataItem.movi​​es = [];
section.dataItem = sectionDataItem;
  Array.prototype.push.apply(section.dataItem.movi​​es,dataItems); 
section.dataItem.touchPropertyPath(“电影”);

这是我们在文档中提高TVMLKit性能所需要的全部。

仔细了解加载时间

当Apple在WWDC上展示此新功能时,他们出现了这张图来描述在tvOS 10中加载TVML文档时的问题。

此图显示了在添加越来越多的项目时花费在加载文档上的时间的明显指数趋势。 但是事实是,图表根本没有任何数字,这使得很难说这件事有多可怕,对吗? 因此,让我们输入一些数字…

我坚决认为,没有比使用猫更好的方法来进行性能测试,因此让一些猫放在屏幕上以检查它们需要加载多少时间…几只猫? 很多,最多45k,主要是因为互联网上没有足够的猫🙀

我准备了这个简单的项目,使用三种不同的方法展示了猫的网格。 带有和不带有原型和数据绑定,并且只是为了娱乐而直接使用UIKit。 结果如下:

我们注意到的第一件事是,与直接使用UIKit相比,无论选择哪种方法,TVML都具有令人难以置信的低性能。 相信我,UIKit在那里,但是与TVML相比,它的速度如此之快,其值总和不足以在图形中绘制单个像素。

将重点放在TVML结果上,我们可以清楚地看到,使用原型和数据绑定时,尤其是处理非常大的文档时,加载时间的好处是巨大的。 在分析更糟的情况下,有45,000只猫超过35秒。

但是,如果我们减少一点,以便在物品较少的情况下仔细查看装货时间,则会发现装货时间没有太大的不同……

因此,原型和数据绑定在唤醒大型文档时绝对是一个很大的改进,但在大多数情况下可能根本没有引起注意。 幸运的是,电视应用程序通常不必处理数千个项目,基本上是因为使用Siri Remote很难管理和导航它们。

Caviats…

在性能方面,除了加载时间外,我们的视图在运行时的行为也非常重要。 因此,让我们为运行时性能添加一些数字,使用三种不同方法中的每一种滚动我们的庞大的45k猫列表时,测量每秒的帧数。

再一次,我们可以看到直接使用UIKit可以提供更好的fps性能。

在TVML的结果中,我们还可以看到,使用原型和数据绑定在加载时间上的好处并不是免费的。 滚动动画从43 fps降至27 fps时,运行时性能成本很高。

看起来只有一个原型项目的集合定义,除了提供更好的加载时间外,还需要额外的计算工作来构建每个项目。 这最终对我们的视图的fps产生了重要影响。

结论

原型和数据绑定真的很棒。 它们确实改善了很多加载时间,尤其是在处理大型文档时。

但是,正如我们从数量上看到的那样,加载时间的好处对于带有“仅几个”项目的集合来说并不是很明显,并且在运行时性能方面具有相当高的成本。

结果,原型和数据绑定不应被视为对传统TVML集合加载技术的替代,而应被视为一种新的替代方法。 应考虑每种情况的特点,分析它们的使用方便性。