程序设计实现中,我们往往有很多的方案,最终的方案的取舍我们都会问如下两个问题:
  这样做是不是满足目标客户的基本需求?
  这样做是不是值得?
  这就是我们经济学常说的资源利用效益最大化的问题。
  现在我们就从我们qqpet world客户端程序实现中一些列方案选择和特殊优化来记录一下我们是如何思考的。
  我们首先从最近项目组都熟悉的内存优化说起。
  客户端从实现之初的风雨广场场景中内存360M~500M(30人同屏稳定时420M)优化到现在的115M~200M(30人同屏稳定时160M)。


 


  这期间我们作出了一些列的优化选择,也就是发现不应该用,没有价值的内存,我们就把这段内存砍掉,让内存付出物有所值。
  1)第一个砍掉的就是为了标志用鼠标导航区域的图片,该图片在内存中占用60M,其实从计算精确度上来说,不需要像素级别的精度,这不值得,我们就把标志导航的区域放缩到1/10,面积就是以前的1/100,内存占用在K级别。就精确度而言,这就够了。其实本身还有优化的空间,我们只是需要标志区域,如果用矢量甚至可以在10K内完成,为什么不这么做呢?
  我们思考了第二个问题“这样做是不是值得?”,这样做是不值得的,减少内存数百k,却需要大量的程序去实现,而且制作时美术不能够直接生产,并且使用时还得消耗cpu计算。这是不经济也值得的。
  2)场景的优化。最开始设计的场景程序时,策划告诉我们场景不大,程序设计时就没有做分块加载机制。后来风雨广场这个巨大的场景出来了,占用的内存就飙升,现在当然需要分块加载,需要使用的在显示区域内的才加载,slicol为此付出了巨大的努力,特别是加载场景元素过程中,场景在滚屏,这正是cpu消耗的大头,这个时候加载文件,进行io操作具有峰值累积效应,slicol花了大量时间进行优化,既不出现缺图现象,又要保证内存节省,还要保证玩家体验平滑,在峰值累积的情况下,slicol做到了这一点,这里赞一个。
  3)在优化过程中我们发现,图片如果用嵌入的方式,new出这个图片的实例时事实上就有两个实例在内存中,占用两份内存。我们就把所有的大图片在外面加载。同时遵循这个原则,图片使用时候,我们都在不影响体验的前提下,使用时加载,不使用时候卸载。利用该方式,6个宠物形象,升级升阶段动画,加载进度动画,场景大地图,优化内存近30M。
  4)也是基于经济学考虑,以前宠物大小是140*140,一只宠物占用内存3.6M,经过讨论,项目组决定改宠物为120*120,这不影响avatar体验,可以降低内存和cpu消耗,这样每只宠物占用内存2.6M.
  5)在优化过程中,和同事一起思考,讨论,受popple触发,我就想大多数宠物形象为站满120*120的区域,有很多的空白区域,这些空白区域其实是不必要的,如果要用也应该用得有价值。空白区域不仅用了内存,合成时还用了cpu计算。某一天晚上,咱灵光一闪,想到了一个方案,起床实现之,第二天一早打的到公司合入调试,完美,每只宠物内存占用从2.6M减少为平均1M,降低了1.6M. 该方案其实很简单,就是在合成avatar的时候,把合成的结果空白区域切割丢掉,记录下非空白区域左上角的坐标点,显示的时候作出相应的偏移(也许可以申请专利什么的~)。
  结论只有一个:
  客户端虽然相对服务器有较充裕的计算资源,但是资源的利用上也必须慎重,以有限的资源发挥最大的价值,让玩家付出相应的计算资源就得到物有所值的体验。
  我们自己的资源也是如此,我们付出这些服务器,付出这些带宽,付出这些人力,付出了平台,就要物有所值,我们客户端使用这些资源的时必须慎重,后文我将聊聊我们企鹅的轻客户端体验是如何慎重利用这些资源的。