性能优化

该部分将介绍一些基本的、与性能优化相关的知识;这些知识将帮助您调整自己的项目,让它们运行得更加流畅。

移动设备性能

关于性能最大的挑战,就是让您的游戏在移动设备(如手机或平板)上流畅运行。与台式机或笔记本相比,移动设备的硬件往往更差:CPU更慢,显卡更差,内存更少。但大部分开发者都是使用台式机开发的,所以往往会忽略移动设备上的游戏表现。如果您准备开发在移动设备上运行的游戏,请牢记:务必在移动设备上进行测试。经常在移动设备上测试,可以保证游戏能够正常运行。

经常在目标设备上进行测试,还能够让您迅速定位那些会对性能造成重大影响的变更。如果长时间不对游戏进行测试,当您发现运行缓慢的问题时,很可能无法找到究竟是哪个功能造成了问题。请记住:定位到哪些变更引起了问题,是解决问题的第一步。

填充率

有很多游戏运行性能差与GPU填充率有关。GPU会随着游戏的进行,在屏幕上绘制像素点(也被称为填充像素点);要绘制的图像越多越大,所要占用的GPU显存也就越多。所谓填充率就是指:绘制的像素数据与GPU显存之间的比值。一旦填充率超过了GPU的显存带宽(数据可以被写入的最大速度),游戏就会开始卡顿,因为GPU已经无法跟上游戏的运行。请注意,这并非唤境Evkworld的限制,而是硬件上的限制。

要想完全理解填充率,您还需要知道唤境Evkworld是从后向前渲染游戏的:这意味着,背景是被最先渲染出来的,然后在逐步在它的上面渲染出其他内容。当对象重叠时,系统就会重新渲染重叠部分的像素,这就是所谓的过度绘制;这种过度绘制仍然会影响填充率。也就是说,尽管已经被遮挡住了,下层的对象仍然会消耗显存带宽。所以说,最糟糕的情况就是有大量互相重叠的图片。另外,图片的透明区域,仍然会占用填充率;也就是说,透明像素仍然需要渲染,它们只是不可见罢了。

要避免浪费填充率,您可以使用如下方法:

  • 避免使用带有大量透明区域的对象。使用图片编辑工具,来裁减掉图片中不需要的多余透明区域。如必须使用,则可以将带有大面积透明区域的对象,分割成小图片使用。例如,给某个对话框加边框时,不应使用与对话框同样大小的完整透明图;而是应该将其按边分为4个不同的图片,这样渲染起来更有效率。

  • 避免大面积的图片重叠。重叠区域的所有像素都需要重复渲染,这会浪费大量的填充率。

您可以查看调试界面中的GPU使用,来大致了解GPU的工作状态。该方法是基于时间的估计,所以并不是严格准确的填充率;不过,总的来说,GPU占用越高,它要做的事情就越多。

性能优化中的常见错误

下面我们为您列举了在游戏制作中,常见的、可能导致运行效率不佳的错误,请尽量避免。当然,这份列表仅是列举,并不完整;还有很多其他可能,会导致您的游戏效率不佳,需要具体问题具体分析。

  • 使用了过多拥有物理能力的对象:物理能力是非常消耗CPU资源的。使用过多这类对象,会明显拖慢游戏运行。您的游戏应该使用一些大的物理对象,而不是大量、小的物理对象。

  • 创建过多的对象:尽管现代处理器很强大,但还是有性能上的瓶颈的。创建几千个对象,就会明显拖慢您的游戏。在设计游戏时,就应注意这个问题。

  • 每帧更新大文字:每帧更新文字对象的内容,可能会导致游戏表现不佳;如果文字对象的尺寸很大,则会进一步拖慢运行效率。静态的文字渲染起来很快;但每帧变动的文字,就要消耗大量的资源进行重绘和替换。请尝试使用小尺寸的文字,且只在需要时,进行内容更新。如果您必须每帧更新文字,请使用美术字组件;该组件每帧更新也可以高效率运行。

  • 事件数过多:如果您的项目中有几千条事件,而且它们都需要执行的话,必然会对游戏运行效率造成影响。通常来说,游戏中的大部分事件,并不需要同时进行检测。您可以将事件划分到事件组中,然后在不需要某些组运行时,完全禁用它;这样就可以跳过很多事件的检测。

  • 使用过多的循环:过多的循环可能会使游戏运行变慢,特别是多层嵌套的循环。如果您想检测是否是循环导致了运行变慢,可以尝试暂时禁用循环事件来进行检测。

通常的误解

以下是一些通常被认为会对游戏性能表现产生影响,但实际上没有什么影响的因素:

  • 在场景外的对象,不会被渲染。唤境Evkworld不会对场景外的对象调用渲染,GPU也不会渲染场景外的内容。即使某个对象有部分在场景内,GPU也只会渲染在场景内的部分,忽视在场景外的部分。

  • 图片格式(如jpg或png)只会影响游戏下载体积的大小,而不会影响运行表现或内存占用。在启动时,所有图片都会被压缩成32位位图。

  • 音频格式也只会影响下载体积,不会影响运行表现。

  • 图层组数量不会影响运行表现。在默认设置的情况下,使用多少图层都不会影响性能。

  • 场景数量也只会影响下载体积,不会影响运行速度。场景尺寸也没有直接的影响:如果使用的对象数量相同,大场景与小场景所占用的内存,并没有显著区别。

  • 使用浮点数也不会有明显的影响,现代处理器在计算方面性能非常强大。