【游戏客户端】界面异步加载

                                               【游戏客户端】界面异步加载

      大家好,我是Lampard~~

      上周和大家预告过在完成一个装备与系统的过程中,是应该使用异步加载的方法。不然一打开界面,几百个装备被同时创建那酸爽是不敢相信。【浅谈装备系统】 那么今天就和大家分享一下主要的实现方法。

 

 (一)先加载界面显示的,后加载剩余的

      当我们和美术确认好界面后,我们可以提前知道一个界面是需要显示多少行,多少个具体的item。那么对于界面要立刻展示的内容我们就老老实实先创建,然后处在界面外的内容,则在下一帧或者下一秒后再进行加载。这种方式把加载的方式分成了两步,适用于数据量并不是很大的界面(比如说图鉴)

     

 (二)使用计时器逐帧加载

     然后上述的做法并不适合背包,合成或者分解界面。因为你分了两次,对于数据量大的页面来说只不过是从卡死,变成卡个半死。所以我们可以使用另外一种加载方式:逐帧加载。具体实现方式是把生成一行道具的方法抽象出来,然后在相应的界面创建一个计时器,每一帧执行一次加载方法,当已经加载完毕的时候则关闭计时器,这样子我们就可以完美的解决卡顿问题,哪怕是有几百个资源,打开界面也是十分丝滑。

 

 (三)重写listView方法

     然而没有一种方法是完美解决任何情况的,正当我以为已经解决问题的时候,策划大大突然又冒出了一个想法:我想在外面点击某一个道具,那么打开界面的时候,给我滑动到相应的位置。也就是说我们的加载不能从一开始就进行加载,不然当我们打开界面的时候,想要的那个道具可能并未创建出来(或许是后面几帧才创建),那么我们就无法定位到该道具的位置,也无法显示。提刀和策划大战800回合后败下阵来,只能老老实实的寻求解决方法。

    最后就只能重写一下listView了,我们通过阅读listview的源码可以知道,假如说这个列表很长,那么我们屏幕中看到的知识这个列表的一部分,它真正的大小是innerContainer(整张屏幕)的大小,也就是说我们所实现的滑动效果,只不过是屏幕坐标不动的情况下,在移动innerContainer的位置。那么我们知道这个原理之后,其实我们就可以这样做:

    首先,先手动算出我们想要实现的item的具体位置,比如说有10个,屏幕能显示5个,我要从第4个开始,要把第四个item置顶。那么我们就可以把4-9的数据传入并生成,并监听滑动列表的滑动事件,每当滑动的时候,判断头尾是否有数据,有则创建新的item插入进去

   这样子虽然可以实现功能,但是如果在上下滑动的时候新建item插入的话,要么只能整体移动所有item的位置(比如我现在加载数据3,那么4-9则需要往后移动),要么则移除列表中所有的item,把3-8的数据重新生成。前面的方法还好但不是最优,而后面的方法其实是十分耗的。所以我们可以通过数据迭代来解决这个问题。比如说我们现在屏幕上的是数据4-9,我向上滑动要生成数据3的item。此时我们的listview中需要有7个item,屏幕不是5个吗为什么要7个?这是上下各缓存一个位置,数据迭代的时候不会有闪烁感。我们在向上滑动显示item3的同时,把整个innerContainer向上移动一个item的宽度,同时把item3的数据复制给item4,item4的数据复制给item5...那么屏幕上5个item的数据陆续向后复制,展示的是3-8的数据,并且此时上下还是留有了一个缓存位。因为数据迭代比生成一个item要快的多,所以这是一个十分好的处理方法,对于想排行榜,装备道具这些界面很有用。

 

说在最后:

       以上是道具,装备,排行榜这种item异步加载的几种方式。当然如果要提升性能的话,我们还可以有很多办法:比如说打开一个系统的时候只生成显示的界面,等点击到需要的界面按钮时才生成其他界面,分步生成。还比如说界面如果有很多特效,大的纹理,那么我们可以提前加载近缓存区,耗费一点内存换取更快的响应速度。

 

   好了,今天的分享就到这里,谢谢大家~