前言我会根据滑动的流畅度来判断本文涉及的性能问题,包括掉帧和一些实际体验。编译环境:MacOS10.13.3、Xcode9.2参与测试机型:iPhone610.3.3、iPhone711.2.1、iPhoneX11.2.5,默认iPhone6TableView/TableNode包含TableViewCell/CellNode:默认复杂度为平均,包括1~2张图片和2~4个文字显示,图片有圆角时列表滑动卡住的原因优化专家已经解释的很清楚了。结果是16ms不足以渲染一帧,导致掉帧和卡顿。以下是尝试过的一些优化:圆角覆盖圆角图片,经典文章CornerRounding(http://texturegroup.org/docs/corner-rounding.html),HYBImageCliped(http://texturegroup.org/docs/corner-rounding.html)也做图片的异步裁剪:通过UIGraphics裁剪可能会导致内存爆炸。数据预处理具体就是把json转Model后text转富文本,处理一些弱逻辑等,赋值后直接显示咳咳,感觉没什么影响。图形预处理,例如处理图像遮罩或固定图标,通常直接使用多层视图来实现。我曾尝试在大图像上绘制三个小图像,然后显示它们。所以,除了异步复用的问题,内存炸了,最后还是老实说。实用多视图为什么要使用ASDK图形异步渲染通常我们认为UIKit不能在非主线程上渲染。一旦这样做,可能会导致崩溃和无法正常显示。为什么可以ASDK,因为ASDisplayNode是线程安全的。Node在创建的时候并不会立即在里面新建UIView和CALayer,直到主线程第一次访问才会生成相应的对象。此外,它还使用层预合成和基于Runloop的异步并发,使其具有更好的性能ASAsyncTransactionGroup(https://github.com/TextureGroup/Texture/blob/b7cd0b16567a9eb10e58f4cc0886a145dc5273b8/Source/Details/Transactions/_ASAsyncTransactionGroup.m)这个特性带来的相关实践经验是:安心的异步绘制,比如圆角裁剪,添加遮罩等,这在UIKit中足以摧残生机,内存爆炸,异步多路复用,性能极差,但在低性能设备下还是会出现明显的空白预加载数据和对象。与UIKit原生控件相比,IllusionASDK中的ASRangeController、ASTableView、ASCollectionView可以用来监控视图的可见区域,维护工作区域,适时触发网络请求绘制,cell的异步布局与原生控件不同。使用单一机制的cell,意味着某个List显示的样式只有一种,TableView只需要注册一个Cell。这种情况下,如果做一些常规的优化,滚动的流畅度还是可以接受的(和ASDK的差距很小,但是肉眼还是可以看到的)此时的差距主要体现在第一次显示上列表中的某个数据,以及TableView加载页面时的长时间等待。当然这两点也可以不断优化解决。只是来回滑动已经显示的数据,两者差距很小,大概59.7-59.9和59.9的差距(我胡说的)综上所述,在适当优化的情况下,UIKit和ASDK的差距在单个Cell的情况下区别不明显。多种多样的Cell是指某个List中有多种不同的样式。TableView必须注册N个Cells才能实现这一点。在这种情况下,假设有5种Cell,屏幕可以同时显示6个Cell。此时,如果***屏幕只是显示了所有5种Cell,那么后续的滑动情况将与单个Cell的表现一致。如果***画面显示的内容只包含一种类型,其他4种都没有出现在画面中,那么当某一种***出现在画面中时,就会有明显的滞后;我尝试过解决这个问题,提前创建所有Cell实例对象,缓存复用同一个subview,异步预绘为A图并缓存(坑),都有效不用说,渐微ASDK,还是59.9复用的区别。我对TableView的多路复用机制又爱又恨。方便之处在于直接与数据绑定后,可以很方便的进行更新修改。只要确保setModel是简洁的。好吧,就是业务绑定多的时候比较麻烦。让我们关注TableNode。TableNode的多路复用机制是没有多路复用,只有缓存。每个CellNode都是全新的,所以会有一些特殊的地方:CellNode和数据源没有绑定关系:即使创建后删除了数据源,TableNode仍然可以正常显示数据。直接决定创建什么样的CellNode:这个很重要。TableViewCell的显示大致如下:添加空假数据子视图->数据填充->刷新,涉及布局或图形时会比较复杂。CellNode只有一步:添加真实数据的子视图;因此,控件和布局可以直接按照业务逻辑处理,而不用刷新Demo一次或多次:这里要求每组一张大图+N张小图,每组3、5个方案:TableView的方式是创建5,根据编号显示和隐藏以下两类或两类Cell,将3和5的case分开对应,另外,最重要的是:祈祷数据正常,而每组数据的个数只有3、5个,这时候使用TableNode就灵活多了,可以根据自己的需要(数据个数)添加需要的子视图,我的思路是固定大图片在顶部,并将其余两个添加为一行。即使总数是偶数,也没有额外的消耗。详见ASDKDemo(https://github.com/didez/ASDK-Demo/tree/master/ASDKDemo)FlexLayoutASDK使用Flex布局,面向对象偷个图。总之,缺点只有一个,就是学习曲线比FrameAutoLayout陡峭,优点是性能和Frame不相上下。比自动布局更容易。
