【补档】唤境游戏如何显示帧率?详解性能相关内容

因群里有成员对这方面存在疑问,所以写一篇文章详细解释下游戏内性能相关。
需要注意的是,本人对于唤境中这些内容的最具体理解未必到位,因此可能出现一些技术细节上的错误,希望大佬能指出错误,感激不尽!
为了保证一般开发者也能看得懂,文章会尽量避免非常专业和硬核的描述,相应地就会降低严谨性。如果有兴趣深究,请查找更专业的资料。
此外,本文并非是针对唤境游戏的性能优化而写的,如果您的引擎或者制作的游戏出现卡顿,请前往b站查看小嗦大佬的教程。
传送门:https://www.bilibili.com/video/BV1wg411E7oF


一、性能相关概念(基础内容)

通常情况下,我们会通过几个方面来评估一个游戏运行的性能表现,分别是帧率、帧生成时间、CPU占用、GPU占用、内存占用、显存占用等。

1. 帧率 / FPS

游戏之所以能呈现动态的画面,是因为它会以一个很快的速度生成画面,每秒几十张甚至上百张,其中每个画面就被称为一 “帧” 。因此,帧是游戏画面在时间上的最小单位。
于是,我们有了帧率的概念。帧率,就是每秒钟游戏生成的帧数量。很明显的,帧率越高,我们肉眼感觉到的画面就越流畅,反之则越卡顿。当帧率为0时,游戏就停止在一张静态的图片上。
一般而言,当帧率达到60时,人眼观察到的画面就可以称为“比较流畅”了。

2.帧生成时间(或帧间隔)/ FRAMETIME

有了帧率的概念,我们就可以引入帧生成时间的概念了。
游戏引擎每生成一帧画面,都需要消耗一定的时间,这个时间就称为帧生成时间。
帧生成时间波动是造成瞬间卡顿的原因之一。设想一个极端情况,在运行的某一秒里,游戏花了0.9秒来渲染第一帧,然后在剩下0.1秒里渲染了剩下的59帧。这时候的平均帧率还是60,但是你在玩的时候就会明显感觉到游戏发生了一次剧烈的卡顿,因为这0.9秒的时间内游戏处于静止状态。
帧生成时间和间隔的定义,严格来说并不是完全一致的,但本文并不是进行画面技术研究,所以暂且认为它们是同一个概念。

3.CPU占用 / CPU

在计算机中,CPU负责通用计算,也就是任何计算理论上都可以由CPU完成。在游戏中,控制游戏系统运行、通过公式计算数据、运行函数等都是由CPU完成的。最开始的时候,游戏画面的渲染也是由CPU完成的,但后来人们发现CPU难以胜任这一要求,于是将这个工作交由GPU完成。有关这一段历史的发展,详见https://www.bilibili.com/video/BV1Hb41177JB
对于现代电脑和手机来说,它们的CPU性能都相当强大,可以完成非常密集的运算需求。但它们的性能也不是无限的,而且在手机、笔记本电脑上,CPU是耗电量非常大的元件。所以,CPU会直接影响游戏的性能表现,降低CPU的占用率也可以有效提高游戏运行的效率,以及在低端设备上成功运行的可能性。

4.GPU占用 / GPU

前面提到了,GPU是用来替代CPU来完成画面渲染工作的硬件。所以,GPU是离游戏实际画面最近的硬件,因为游戏画面就是由它生成的。
GPU负责的内容就是渲染画面,例如显示图片、文字等。
对于唤境来说,由于唤境只是2D游戏引擎,因此对于现代GPU来说压力比较低,但还是存在运行效率过低的情况。
有关GPU运行解析的内容请见官方教程https://evkworld.cn/wiki/58

5.显存占用 / (VRAM、VIDEO MEMORY、IMAGE MEMORY等)

显存,又称显示内存、显卡内存、图形内存、视频内存等,是显卡用来储存图像信息的临时空间。
对于集成显卡(例如手机)而言,显存就是从内存中分出来的部分;对于独立显卡(例如高性能电脑)而言,显存是单独集成在显卡中的一个存储器。所以,当游戏在手机上运行的时候,游戏会同时消耗两份内存空间,一部分用于程序运行,另一部分充当显存。因此,如果您的游戏在电脑上运行很正常,而在低端手机上就无法运行或者特别卡顿,则有可能是因为游戏消耗了较多的显存和内存。


二、唤境中跟性能有关的表达式

唤境引擎并没有提供性能监控相关的组件和能力,但可以通过表达式获取到性能数据。
所有相关表达式都在系统部分中。

1.帧率

表达式:fps
刷新频率:每秒1次
返回值类型:整数
建议使用方法:直接通过表达式获取帧率即可。
ba2e311e9e59cfd649509ccc2fa99a0b.png

2.帧生成时间(帧间隔)

表达式:dt
刷新频率:每帧1次
返回值类型:单精度浮点数,即6位小数
(当测量单帧间隔时会返回10位小数)
其它:引擎内描述为“时间间隔”
建议使用方法:先将数据乘以1000,然后使用roundto()将其化简到1-3位小数,最后加上单位“ms”(毫秒),即可得到友好的数字展示。
fb34db0b029a4d27e4ad593e8cc363ac.png

3.CPU占用(CPU时间)

表达式:cpuutilisation
刷新频率:每秒1次
其它:引擎内描述为“CPU在游戏中消耗的时间”
返回值类型:双精度浮点数,即18位小数。
建议使用方法:先将数据乘以100,然后使用roundto()将其简化到1-2位小数,最后加上百分比符号“%”,即可得到友好的数字展示。
68f1e9a186fe3b6660d1936f792cefe6.png

4.GPU占用(渲染消耗时间)

表达式:gpuutilisation
刷新频率:每秒1次
其它:引擎内描述为“GPU在游戏中消耗的时间”
返回值类型:9位小数。
建议使用方法:与CPU占用相同。
596e4d2898ce7eb638dca60f52193e12.png

5.显存占用

表达式:imagememoryusage
刷新频率:每帧1次
返回值类型:9位小数。
建议使用方法:直接通过表达式获取即可。
4b1452908420640a6ac75af4bb2b156e.png


三、制作性能监控窗口

光了解了上面所有的信息,但如果不会用,那就都是白搭。接下来,我会一步步解释如何制作游戏内的性能监控悬浮窗。

1.打开游戏项目,新建对象:一个文本、一个精灵和一个按钮,精灵的贴图替换成一张长方形图片即可
799e625f09a212d9e980f8cff86b3a2e.png

c6d47b1f64216db3965c811b0afdb06e.png

2.新建几个全局变量,“启用测量”、“悬浮窗x”、“悬浮窗y”。其中,第一个是布尔类型变量,是必需的;后两个是数值类型变量,不是必需的。
后两个的初始值不建议设为0,应该根据你选择的默认位置来设置。
a974999ff46bbac77137dbfc7e819c24.png

3.新建一个图层组“悬浮窗”,设置为全局图层组,然后将精灵、文本和按钮拖入该图层组中,调整文本和精灵的大小及属性,文本选择左对齐、上下居中对齐,大小跟精灵差不多一样大就行
7cf2b2e120c5da549d4cc1c5b5008a36.png
2b26784c58f0c77a067d4447edbd42b4.png

4.为文本添加拖拽和定时器能力,为精灵添加绑定能力
f2cc5d66755ee2eb24d199e7c453ae46.png
1751f48b11198c44c52e8e9cf67c033d.png

5.新建一条全局事件表,名称为“性能监控窗口”,或者任何你喜欢的名字。
3f181abb7a3ad49aaf2f1b81b178906a.png

6.开始写事件。可以参考我下面的这种设计方案。
核心思路:
(1)当“启用测量”变量为“真”时,显示文本和精灵,否则隐藏;注意,不要重复触发,可以加入一个触发器(例如“仅触发一次”)来解决;
(2)制作好看的文本排版;
(3)避免每帧检测和每帧改变文本;
(4)(可选)实现悬浮窗的拖动,以及位置记忆。
7b2602a886c2529d6189504f42ae5ff3.png
文本内容供参考:
“帧率:” & fps & newline & “CPU:” & roundto(cpuutilisation*100,1) & “%” & newline & “显存:” & imagememoryusage & “mb”

7.在每个你希望有监控悬浮窗的场景下都新建一个叫做“悬浮窗”的图层组,不需要放入任何内容,因为你之前已经选中了全局事件表。
然后将刚才写的全局事件表应用于每个你希望有悬浮窗的场景。
9de754a5f74cef3b19451317d1597aa9.png
c383bbc3f3d2d8ddb921774cdc2be8c1.png

8.检查效果
50611b15f85e9e7e7164bff667699f0d.png

9.可额外优化的内容

拖拽能力没有进行区域限制,可以直接把悬浮窗拖到屏幕外,如何解决?
· 提示:只需要使用一个能力即可解决。

事件表里还有可以进一步优化的内容?
· 提示:绑定能力。

四、总结

通过这一篇文章的解析和教学,你应该对唤境游戏的性能及其监控方法有了一定的了解。
在多数情况下,唤境游戏其实并不需要这么多高级的技术细节,但这类功能可以给你的游戏添砖加瓦,起到锦上添花的作用。
文章撰写仓促,部分内容做不到非常细致和详尽,也可能有错误,欢迎大佬前来指正!

额外优化内容:
(1)给文本和精灵分别添加“边界限制”能力即可;
(2)在启用测量为假的时候,给精灵添加一条动作:“取消绑定”


【补档】唤境游戏如何显示帧率?详解性能相关内容
https://zjxdiu.github.io/blog/补档1/
作者
zjxdiu
发布于
2022年12月5日
许可协议