《WENJIA》作为一款纯手绘风格的作品,虽只是2D游戏,但因为图层不少与大量的美术细节,在游戏加载过程中,难免会占用大量内存资源,出现游戏卡顿的情况。打包大量美术资源也会出现一些细节的丢失和花屏之类的问题出现。
其实,这也是不少2D游戏,对配置的要求也并不低的原因之一。加载太多内容就会容易花屏丢包。为了解决这一问题,减少每次打包载入内存的数据量,长时间的LOADING或者游戏中一个又一个的小房间就应运而生了。
鉴于制作人对游戏体验连贯性的追求,美术组又人多势众,我自然是不敢说“让他们多追求意境,不要在意细节”之类的话。
于是就有了“敌众我寡,敌不动,我动,你不改,我改”的思路。将整个关卡的内容切分成若干小部分,分步动态加载,这样既无需损失美术细节和游戏连续性,也不会对玩家们的配置提出更多要求。
将整个大关卡分成小块管理,设置一个参照,根据参照点移动位置判断当前所处的关卡位置来加载对应关卡地形,以及左右两边的关卡。判断距离最近的关卡位置,在左侧则加载左侧两个关卡场景,在右侧则加载右侧两个关卡场景。
关卡分为场景以及关卡地形。场景进行动态生成和删除,关卡地形原本就在场景中,需要时显示,不需要时隐藏就好。但如果将场景设置成预设体,在脚本中引用,然后在项目运行时实时加载的话,这些场景预设体仍然会存入内存,并不能节省内存使用量。所以需要使用AssetBundle进行动态加载。
实现过程:
AssetBundle打包:
场景中资源根据一定的距离与资源个数,把同一关卡中的资源分成若干资源,存成预设体,后整合打进成AssetBundle包。如果同一关卡中资源数量过多,则需要分成多个AssetBundle包,避免动态加载时的卡顿现象。
另外同时实例化过多资源,导致系统开销过大也会造成游戏卡顿。所以加载AssetBundle包后,生成的各个预设体也需要一定时间间隔,这也是需要控制预设体内资源个数的原因。
在《WENJIA》中,因为需要在表里世界间切换,但两个世界又是完全不同的两套美术资源,所以同样需要分开打包。
动态加载实现:
在update中间隔一定的帧数实时监测目标对象距离最近的关卡,不是每帧都要检测的。保存当前存在的关卡,需要增加关卡时就加载对应的AssetBundle,等待加载完毕后,则删除多余的关卡即可。
《WENJIA》年内就会上线了,希望每位玩家都能畅快的奔跑在WENJIA的世界中。当然也希望我们的工作能把美术们夜以继日做出的一切,能无差别完整的展现给所有玩家吧。
官方微博 : 困境游戏工作室
官方微信 : DilemmaStudio
Wenjia玩家交流群 : 496240885
0x2A 玩家交流群 : 578675692
暂无关于此日志的评论。