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



  • 因群里有成员对这方面存在疑问,所以写一篇文章详细解释下游戏内性能相关。
    需要注意的是,本人对于唤境中这些内容的最具体理解未必到位,因此可能出现一些技术细节上的错误,希望大佬能指出错误,感激不尽!
    为了保证一般开发者也能看得懂,文章会尽量避免非常专业和硬核的描述,相应地就会降低严谨性。如果有兴趣深究,请查找更专业的资料。
    此外,本文并非是针对唤境游戏的性能优化而写的,如果您的引擎或者制作的游戏出现卡顿,请前往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次
    返回值类型:整数
    建议使用方法:直接通过表达式获取帧率即可。
    undefined


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

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

    3.CPU占用(CPU时间)

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

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

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


    5.显存占用

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

    三、制作性能监控窗口

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

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

    undefined


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


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

    undefined

    undefined


    4.为文本添加拖拽定时器能力,为精灵添加绑定能力
    undefined

    undefined


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

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

    undefined

    文本内容供参考:
    "帧率:" & fps & newline & "CPU:" & roundto(cpuutilisation*100,1) & "%" & newline & "显存:" & imagememoryusage & "mb"


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

    undefined

    undefined


    8.检查效果

    undefined

    9.可额外优化的内容

    • 拖拽能力没有进行区域限制,可以直接把悬浮窗拖到屏幕外,如何解决?

    提示:只需要使用一个能力即可解决。

    • 事件表里还有可以进一步优化的内容?

    提示:绑定能力。

    四、总结


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




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



  • @zjxdiu 感谢分享👍


Log in to reply