一种检测游戏卡顿帧的方法及装置与流程

文档序号:17817364发布日期:2019-06-05 21:54
一种检测游戏卡顿帧的方法及装置与流程

本发明涉及一种检测游戏卡顿帧的方法及装置,属于计算机游戏测试领域。



背景技术:

目前虚幻4引擎(UE4)逐渐流行,许多游戏都已基于该引擎开发发布,例如腾讯研发的《绝地求生刺激战场》、《小米枪战》等等。分析UE4引擎游戏的卡顿状况,研发人员定位卡帧并优化,进而可提升游戏品质。

UE4目前卡帧分析定位主要使用UE4自带的基础工具,例如debug版本可以连UE4Editor,或使用UE4的控制台输入相关命令来进行统计(信息展示在手机屏幕上)。

然而构建UE4Editor较麻烦,且依赖debug版本,对线上已发布的游戏不是很适用。



技术实现要素:

本发明提供一种检测游戏卡顿帧的方法及装置,实现简单,无需依赖UE4Editor,不依赖debug版本,对线上已发布的游戏亦适用。

本发明的技术方案第一方面为一种检测游戏卡顿帧的方法,适用于基于虚幻4引擎的游戏,该方法包括如下步骤:使用hook函数监控FEngineLoop::Tick函数的调用,计算每帧调用FEngineLoop::Tick函数的时长得到对应的帧耗时,并记录所有帧的帧耗时;查找帧耗时超过游戏设定帧速率对应的单帧时长的帧。

作为本技术方案的进一步改进,所述使用hook函数监控FEngineLoop::Tick函数的调用之前还包括:通过测试工具启动运行游戏并从游戏服务器获取游戏线程;测试工具在游戏线程中安装自定义的hook函数。

作为本技术方案的进一步改进,所述hook函数用于执行:FEngineLoop::Tick函数被调用前,记录当前系统时间为帧开始时间;调用FEngineLoop::Tick函数刷新帧;FEngineLoop::Tick函数调用返回时再次记录当前系统时间为帧结束时间;计算帧结束时间与帧开始时间的差值,得到该帧的帧耗时。

作为本技术方案的进一步改进,所述hook函数还用于执行:将FEngineLoop::Tick函数调用时间及对应的帧耗时输出至指定路径的文本文件。

作为本技术方案的进一步改进,所述查找帧耗时超过游戏设定帧速率对应的单帧时长的帧,包括:读取游戏配置获取当前设定的帧速率;根据设定的帧速率计算对应的单帧时长;将记录的所有帧的帧耗时依次与所述单帧时长对比,记录帧耗时超过所述单帧时长的帧信息。

本发明的技术方案第二方面为一种检测游戏卡顿帧的装置,包括:监控模块,用于使用hook函数监控FEngineLoop::Tick函数的调用,计算每帧调用FEngineLoop::Tick函数的时长得到对应的帧耗时,并记录所有帧的帧耗时;对比定位模块,用于查找帧耗时超过游戏设定帧速率对应的单帧时长的帧。

作为本技术方案的进一步改进,该装置还包括:游戏读取模块,通过测试工具启动运行游戏并从游戏服务器获取游戏线程;钩子模块,通过测试工具在游戏线程中安装自定义hook函数。

作为本技术方案的进一步改进,所述钩子模块包括:第一计时模块,用于在FEngineLoop::Tick函数被调用前,记录当前系统时间为帧开始时间;调用模块,用于调用FEngineLoop::Tick函数刷新帧;第二计时模块,用于在FEngineLoop::Tick函数调用返回时再次记录当前系统时间为帧结束时间;帧耗时计算模块,用于计算帧结束时间与帧开始时间的差值,得到该帧的帧耗时。

作为本技术方案的进一步改进,所述钩子模块还包括:记录模块,用于将FEngineLoop::Tick函数调用时间及对应的帧耗时输出至指定路径的文本文件。

作为本技术方案的进一步改进,所述对比定位模块包括:帧速率获取模块,用于读取游戏配置获取当前设定的帧速率;单帧时长计算模块,用于根据设定的帧速率计算对应的单帧时长;卡帧查找模块,将记录的所有帧的帧耗时依次与所述单帧时长对比,记录帧耗时超过所述单帧时长的帧信息。

本发明的有益效果为:

本发明所公开的一种检测游戏卡顿帧的方法及装置,实现简单,无需依赖UE4Editor,不依赖debug版本,即可实现对卡帧信息的统计,对线上已发布的游戏亦适用;通过输出游戏卡帧信息数据,为质量人员提供数据支撑,从而推动研发对其进行优化,减少游戏卡顿点,进而提升游戏品质。

附图说明

图1所示为根据本发明技术方案的检测游戏卡顿帧的方法基本步骤流程图;

图2所示为根据本发明技术方案的hook函数执行的方法流程图;

图3所示为根据本发明技术方案的定位卡顿帧的方法流程图;

图4所示为根据本发明一种实施例的装置框图。

具体实施方式

以下将结合实施例和附图对本发明的构思、具体结构及产生的技术效果进行清楚、完整的描述,以充分地理解本发明的目的、方案和效果。

需要说明的是,在本公开中所使用的单数形式的“一种”、“所述”和“该”旨在包括多数形式,除非上下文清楚地表示其他含义。此外,除非另有定义,本文所使用的所有的技术和科学术语与本技术领域的技术人员通常理解的含义相同。本文说明书中所使用的术语只是为了描述具体的实施例,而不是为了限制本发明。本文所使用的术语“和/或”包括一个或多个相关的所列项目的任意的组合。本文所提供的任何以及所有实例或示例性语言(“例如”、“如”等)的使用仅意图更好地说明本发明的实施例,并且除非另外要求,否则不会对本发明的范围施加限制。

参考图1,本发明一种实施例公开了一种检测游戏卡顿帧的方法,适用于基于虚幻4引擎的游戏,该方法包括如下基本步骤:使用hook函数监控FEngineLoop::Tick函数的调用,计算每帧调用FEngineLoop::Tick函数的时长得到对应的帧耗时,并记录所有帧的帧耗时;查找帧耗时超过游戏设定帧速率对应的单帧时长的帧。

由于在基于UE4引擎开发的游戏中,每帧的逻辑都需要通过调用FEngineLoop::Tick函数来进行刷新,因此可以通过计算每帧调用FEngineLoop::Tick函数的时间长度作为帧耗时以判断是否卡帧,若FEngineLoop::Tick函数执行时间过长,则会造成游戏卡帧,这里对于卡帧判断的帧耗时划分以游戏设定的帧速率对应的单帧时长为基准。

这里以一台经过root的安卓手机测试剑侠情缘2手游(基于UE4开发的手游)为例进行进一步说明。

参考图2-图3,首先用该手机下载安装本发明的测试工具和待测游戏剑侠情缘2,通过测试工具启动并运行剑侠情缘2手游,此时,测试工具能获取到游戏运行的所有数据并使用监控线程监控所有游戏线程,监控线程在游戏线程中置入自定义编写的hook函数,当检测到游戏线程中调用了FEngineLoop::Tick函数时,执行hook函数,hook函数用于执行:FEngineLoop::Tick函数被调用前,记录当前系统时间为帧开始时间(精确到ms);调用FEngineLoop::Tick函数刷新帧;FEngineLoop::Tick函数调用返回时再次记录当前系统时间为帧结束时间(精确到ms);计算帧结束时间与帧开始时间的差值,得到该帧的帧耗时。为了方便后续版本的维护或测试,将FEngineLoop::Tick函数被调用时刻的时间及对应的帧耗时输出至指定路径的文本文件;如此,监控游戏所有帧,得到所有帧的帧耗时,并记录到手机存储卡空间的/sdcard/profile.txt中,为了不局限于本台手机,还可以将该profile.txt文件上传到云服务器供其他测试人员下载使用。为了找到造成游戏卡顿的帧,首先读取游戏配置获取当前设定的帧速率,假设设定的帧速率(即FPS)为30帧/秒,则理论上单帧时长为33ms(1000ms/30帧=33ms/帧);将/sdcard/profile.txt文件中记录的所有帧的帧耗时依次与该单帧时长对比,若某一帧的帧耗时超过33ms,则认为该帧为卡顿帧,且超出越多表示卡顿越明显;找出这些卡顿帧后,可以直接在profile.txt文件中进行标记,也可以将这些卡顿帧的信息保存在另外的文件中,游戏开发者可用根据这些卡顿帧信息进行针对性优化,提升游戏品质。

参考图4,本发明一种实施例还公开了与检测游戏卡顿帧的方法对应的虚拟装置,该装置包括:监控模块,用于使用hook函数监控FEngineLoop::Tick函数的调用,计算每帧调用FEngineLoop::Tick函数的时长得到对应的帧耗时,并记录所有帧的帧耗时;对比定位模块,用于查找帧耗时超过游戏设定帧速率对应的单帧时长的帧。

另外,该装置还包括:游戏读取模块,通过测试工具启动运行游戏并从游戏服务器获取游戏线程;钩子模块,通过测试工具在游戏线程中安装自定义hook函数。

其中,钩子模块包括:第一计时模块,用于在FEngineLoop::Tick函数被调用前,记录当前系统时间为帧开始时间;调用模块,用于调用FEngineLoop::Tick函数刷新帧;第二计时模块,用于在FEngineLoop::Tick函数调用返回时再次记录当前系统时间为帧结束时间;帧耗时计算模块,用于计算帧结束时间与帧开始时间的差值,得到该帧的帧耗时。钩子模块还包括:记录模块,用于将FEngineLoop::Tick函数调用时间及对应的帧耗时输出至指定路径的文本文件。

其中,对比定位模块包括:帧速率获取模块,用于读取游戏配置获取当前设定的帧速率;单帧时长计算模块,用于根据设定的帧速率计算对应的单帧时长;卡帧查找模块,将记录的所有帧的帧耗时依次与单帧时长对比,记录帧耗时超过单帧时长的帧信息。

应当认识到,本发明的实施例可以由计算机硬件、硬件和软件的组合、或者通过存储在非暂时性计算机可读存储器中的计算机指令来实现或实施。所述方法可以使用标准编程技术-包括配置有计算机程序的非暂时性计算机可读存储介质在计算机程序中实现,其中如此配置的存储介质使得计算机以特定和预定义的方式操作——根据在具体实施例中描述的方法和附图。每个程序可以以高级过程或面向对象的编程语言来实现以与计算机系统通信。然而,若需要,该程序可以以汇编或机器语言实现。在任何情况下,该语言可以是编译或解释的语言。此外,为此目的该程序能够在编程的专用集成电路上运行。

此外,可按任何合适的顺序来执行本文描述的过程的操作,除非本文另外指示或以其他方式明显地与上下文矛盾。本文描述的过程(或变型和/或其组合)可在配置有可执行指令的一个或多个计算机系统的控制下执行,并且可作为共同地在一个或多个处理器上执行的代码(例如,可执行指令、一个或多个计算机程序或一个或多个应用)、由硬件或其组合来实现。所述计算机程序包括可由一个或多个处理器执行的多个指令。

进一步,所述方法可以在可操作地连接至合适的任何类型的计算平台中实现,包括但不限于个人电脑、迷你计算机、主框架、工作站、网络或分布式计算环境、单独的或集成的计算机平台、或者与带电粒子工具或其它成像装置通信等等。本发明的各方面可以以存储在非暂时性存储介质或设备上的机器可读代码来实现,无论是可移动的还是集成至计算平台,如硬盘、光学读取和/或写入存储介质、RAM、ROM等,使得其可由可编程计算机读取,当存储介质或设备由计算机读取时可用于配置和操作计算机以执行在此所描述的过程。此外,机器可读代码,或其部分可以通过有线或无线网络传输。当此类媒体包括结合微处理器或其他数据处理器实现上文所述步骤的指令或程序时,本文所述的发明包括这些和其他不同类型的非暂时性计算机可读存储介质。当根据本发明所述的资产唯一标识码生成方法和技术编程时,本发明还包括计算机本身。

计算机程序能够应用于输入数据以执行本文所述的功能,从而转换输入数据以生成存储至非易失性存储器的输出数据。输出信息还可以应用于一个或多个输出设备如显示器。在本发明优选的实施例中,转换的数据表示物理和有形的对象,包括显示器上产生的物理和有形对象的特定视觉描绘。

以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。

再多了解一些
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1