LOL工程师详解:如何控制皮肤的内存占用
对于竞技游戏而言,尤其是MOBA游戏,最主要的收入来源就是皮肤销售。作为全球收入最高的PC游戏,有数据称《英雄联盟》2016年的收入或超过17亿美元。从2009年公测到2017年,该游戏经过多年的发展之后,已经拥有了130个英雄和数百个皮肤。对于开发商Riot而言,每增加一个皮肤就会导致游戏内存占用的增加,继而对玩家的设备带来更高的要求。那么,Riot的工程师们到底是如何在保证体验的情况下控制皮肤的空间占用呢?前不久,该公司的Eric Friedman和Scott DeFreitas在官博中以终极皮肤‘元素使者拉克丝’为例详细解释了皮肤优化的过程,以下是gamelook编译的内容:
【Gamelook专稿,转载请注明出处】
Gamelook报道/对于竞技游戏而言,尤其是MOBA游戏,最主要的收入来源就是皮肤销售。作为全球收入最高的PC游戏,有数据称《英雄联盟》2016年的收入或超过17亿美元。从2009年公测到2017年,该游戏经过多年的发展之后,已经拥有了130个英雄和数百个皮肤。对于开发商Riot而言,每增加一个皮肤就会导致游戏内存占用的增加,继而对玩家的设备带来更高的要求。
那么,Riot的工程师们到底是如何在保证体验的情况下控制皮肤的空间占用呢?前不久,该公司的Eric Friedman和Scott DeFreitas在官博中以终极皮肤‘元素使者拉克丝’为例详细解释了皮肤优化的过程,以下是gamelook编译的内容:
随着《英雄联盟》发展的越来越大,可能很一开始的艰难,一小组开发者们忙于把游戏发布出来,并且还要处理系统优化、和研发过程方面的问题。虽然游戏发生了很大的变化,但我们优先考虑的事情依然不变:我们始终把玩家体验置于技术和研发过程之前。有时候,这就会攒下‘技术债’,随着游戏的增长,在提高工作质量的同时提高工作方式就显得非常重要。并不是每前进一步都要做出革命性的变化,在本文里,我主要介绍为了推出终极皮肤元素使者拉克丝而在系统方面做的一些迭代更新。
当皮肤制作团队提出元素使者拉克丝的想法被制作人认可并且得到工程师们支持的时候,和上一个终极皮肤DJ Sona制作的情况已经发生了很多的改变。我们的皮肤研发流程已经成熟了,最终为每个英雄都预留了合适的内存预算,而且每推出一个新皮肤都会学到新东西。我们用了很长时间,但皮肤制作流程仍然没有达到我们想要的那种地步。所以,当我们把元素使者拉克丝的想法细分到具体技术要求的时候,很明显有些事情是必须解决的。
内存问题
为了让顶配游戏设备、超级本或者网吧里的旧机器等不同水准的电脑都能运行《英雄联盟》,我们投入了大量的努力,这同时意味着必须有资源限制。一个英雄的纹理、多边形、视觉效果、音效、动画数据和所有东西都会占用宝贵的资源,所以我们经常做出改变并且思考节约空间的新方法。
最初,元素使者拉克丝皮肤的想法是这样的:拉克丝有10种形态,每种形态都是完整的皮肤,一个完整皮肤占用20MB左右的游戏内存,所以这个终极皮肤需要200MB的空间。但我们给每个皮肤的内存上限是30MB,所以这肯定是行不通的。
我们立即开始头脑风暴,寻找解决方案。一开始我们想把内容缩减并且在需要的时候才加载完整角色数据。比如,游戏一开始只加载拉克丝的光形态,如果玩家选择进化到火形态,游戏会在这个时候加载火形态的所有数据,一旦加载完成就在游戏内进行转换。最终游戏会卸载光形态的信息。这么做的话,我们就可以随时加载英雄的两个形态,而且也可以吧内存使用降低到40MB,而不是原先预计的200MB,这和我们的30MB要求就比较接近了。
但最后我们发现,这样做会带来太多的问题。首先,由于I/O文件需要大量操作,这就对于低端硬件的玩家们带来了体验上的不便;其次,我们目前在《英雄联盟》里没有这种功能,所以为了这么做,就必须短期内做出一个全新的系统,我们的顾虑是,如果做出来没有用而且需要大量时间、严重超出预算该怎么办?
我们不得不重新审视内容创作流程,为什么我们大多数的皮肤都要占用20MB左右的游戏内存?这些内存到底都怎么用掉了呢?
自由带来的问题
我们给美术师们大量的自由创造内容,这在过去是很好的方式,因为那时候工程师们没有特别好的工具和方法做到比较好的效果。我们有动画压缩,但不这么做也没不会收到什么提醒或者警告,所以美术师们可以给几个像素宽且完全不透明的效果使用1024×1024的纹理做支持。
如果游戏数据服务器能够广泛使用,我们可以做到自动控制数据大小,但我们还没有到那一步。对于拉克丝的终极皮肤,这个过程还必须更多地使用手动制作。所以我们与美术师们紧密协作,确保动画尽可能地压缩,纹理做到合适的尺寸和格式,模型有效地创造而不使用过多的多边形。
我们取得了很大进展,然而离预算的空间仍然差很远,而且还有一个很明显的障碍就是视觉效果。
视觉效果(VFX)
视觉效果对于我们的英雄和皮肤而言,是最占用空间的资源类型,它们需要使用纹理、模型、动画、音效,而且这些通常都要使用很多。元素使者拉克丝则把资源占用推向了新的层次,我们需要用到10倍于普通皮肤的视觉效果资源。
在VFX的众多组件当中,所有效果的纹理是内存占用最大的,所以我们首先解决的就是纹理。我们做了一个可以让美术师们打包纹理资源的技术,既让他们恰当地表达想法,同时还能把大小减掉三分之二。
和使用一个完整纹理文件展示效果不同的是,一个纹理资源包可以让美术师们使用纹理的所有颜色通道创作一个灰度图像。
如果全部使用灰色,那么元素使者拉克丝就不会那么受欢迎,所以美术师们需要为她增加色彩,这时候我们开始使用调色板,调色板的纹理通常是可以让很多效果共享使用的,因此降低了特定色彩的使用空间。
VFX美术师们使用这种技术的优势而大大降低了元素使者拉克丝效果的内存占用。
在纹理经过了优化之后,我们离30MB的内存使用就非常接近了。更好的是,这种技术还可以给未来的皮肤解决不少空间。
仍不算目标完成
我们的确为此感到高兴,但当看到内存使用报告的时候,元素使者拉克丝的占用空间仍然超出了20%,这时候离登录公测服还有一周时间,所以我们必须尽早找到并解决问题。
在快速浏览内存报告工具的时候我们发现,有超过10MB的内存被分配到了未经计算的纹理上,这是导致我们VFX系统内存问题的一个重要原因。
我们的效果系统可以被描述为‘一个每小时200英里的固定功能牵引器’,换句话说,每个发射器(emitter)都可以所所有的效果,也就是说所有发射器都使用了全部效果才用得到的内存占用。此前,我们打造了一个粒子系统满足当时的需求,当时并不用计算内存成本,因为普通皮肤占用空间并不大,根本不会超出预算空间。可是元素使者拉克丝要加载3000多个发射器,因此内存占用很快就超标了。
我们发现我们使用的发射器为了具备使用多个动画而增加了存储能力,所以占用了大量内存,以下表格是《英雄联盟》普通数据类型和动画数据所占用的空间对比:
每个发射器都占用50字节左右的动画类型,而其中超过95%都是经常使用但根本不需要用到动画的,考虑到这个皮肤使用3000多个发射器,可以想象资源浪费到底有多严重。为此我们做了简单的调整,对不同的结构只在需要的时候调用动画数据,所以很快就把内存占用降到了预算以内,而且还在环境、其他英雄、物品等方面节约了10-15MB的空间。
未来的皮肤制作
通过深入了解效果系统,我们了解了更多有关粒子方面的东西,虽然还有很多工作需要完善,但这已经是非常不错的第一步,不仅让元素使者拉克丝的游戏内存占用控制到了预算以下。除了效果系统之外,我们还找到了其他英雄和皮肤节约空间的解决方案。
如以上所说,我们做的这些变化都不是具有革命性的,我们只是在推出新内容的过程中,朝着更好的技术和研发过程优化,每个项目都可以增强我们的工具和制作过程,让未来的同事们做起来更简单,给玩家带来更好的体验。
如若转载,请注明出处:http://www.gamelook.com.cn/2017/02/282868