【具体实施方式】
为了更好的理解本发明的技术方案,下面结合附图对本发明实施例进行详细描述。
应当明确,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。
在本发明实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本发明。在本发明实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。
针对相关技术中用户界面性能测试的效率和准确性低下的技术问题,提出了一种新的性能测试方案,将多种性能测试整合为统一的自动化测试方式,换言之,可为多种信息类型的检测信息设置统一的获取方式。下面通过多个实施例对本申请的技术方案进行详细阐述。
实施例一
图1示出了根据本发明的一个实施例的用户界面性能测试方法的流程图。
如图1所示,根据本发明的一个实施例的用户界面性能测试方法的流程包括:
步骤102,接收针对目标应用触发的用户界面性能测试请求,所述用户界面性能测试请求用于请求对目标用户界面进行多种维度的目标性能测试。
其中,所述多种维度的目标性能测试至少包括响应耗时、内存泄露以及渲染性能中至少两项。每种维度的目标性能测试对应有自身所需的初始化处理方式,初始化处理用于将目标应用的运行环境处理至适用于检测该项的环境,以提升最终获得的该项目标检测信息的准确性。
步骤104,响应于所述用户界面性能测试请求,从预配置的初始化方法中调用与目标性能测试匹配的目标初始化方法对所述目标应用进行初始化处理。
其中,所述目标初始化方法用于对目标应用进行操作以使得所述目标应用进入检测状态。
步骤106,在所述初始化处理完成后,采集与所述目标性能测试相关的性能数据。
本发明实施例提供了一种用户界面性能测试方法,初始化处理用于对目标应用进行操作以使得目标应用进入检测状态,即将目标应用的运行环境处理至适用于检测该项的环境,以提升最终获得的该项目标检测信息的准确性。接着,在初始化处理完成后,采集与目标性能测试相关的性能数据。由此,无论需要测试哪个维度的目标性能,都可从预配置的初始化方法中调用与目标性能测试匹配的目标初始化方法对目标应用进行初始化处理,并在初始化处理完成后,采集与目标性能测试相关的性能数据,而不受所在平台和单一目标性能的测试限制。同时,以上技术方案实现了针对多种维度的目标性能测试的同步自动化测试,取代了相关技术中针对同一用户界面的不同目标性能测试的相关数据分别进行多次人工辅助检测的方案,减少了多次检测和人工辅助带来的效率和准确性低下的问题。
下面通过实施例二至实施例四分别介绍目标用户界面的响应耗时、内存泄露以及渲染性能三者对应的初始化处理方式和用户界面性能测试方式。
实施例二
图2示出了根据本发明的一个实施例的响应耗时测试的流程图。
如图2所示,若所述目标性能测试包括所述响应耗时,根据本发明的响应耗时测试方法的流程包括:
步骤202,通过第一钩子函数替换用户界面开启调用函数,和通过第二钩子函数替换用户界面回调函数。
其中,所述第一钩子函数用于执行用户界面开启功能和获取所述目标用户界面的开启时间;所述第二钩子函数用于执行回调功能和获取所述目标用户界面的渲染完成时间。
步骤204,调用所述第一钩子函数,以获取目标用户界面的开启时间。
步骤206,调用所述第二钩子函数,以获取目标用户界面的渲染完成时间。
用户界面开启调用函数可选为openUI,用户界面回调函数可选为onActive。一般地,uiManager接收到开启目标用户界面的指令后会通过openUI新建用户界面对象或激活已注册的用户界面对象,新建的用户界面对象或被激活的用户界面对象进行数据与资源加载后,目标应用的引擎对其进行渲染,渲染完成后触发onActive。
因此,从执行开启目标用户界面的指令到onActive被调用这一过程所用时长即为用户界面响应耗时。为获取该用户界面响应耗时,相关技术中给出了通过在执行开启目标用户界面的指令和onActive被调用的两处位置插桩记录时间戳的方式,但这种方式需要修改代码,且代码侵入伴随着产生bug的可能性。对此,本申请可使用hook(钩子)函数进行实现。具体地,通过第一钩子函数替换用户界面开启调用函数,和通过第二钩子函数替换用户界面回调函数。其中,第一钩子函数在执行用户界面开启功能的同时,指定获取所述目标用户界面的开启时间;第二钩子函数在执行回调功能的同时,执行获取所述目标用户界面的渲染完成时间。
所有用户界面类均继承了同一父类uiBase,因此,将父类uiBase的onActive函数从内存中替换为onActiveHook函数,即可替换所有用户界面对象的onActive函数,从而达到记录用户界面渲染完成时间的效果。
步骤208,基于目标用户界面的开启时间和渲染完成时间,采集与所述响应耗时相关的性能数据。
具体的,目标用户界面的开启时间和渲染完成时间的差值即为目标用户界面的响应耗时。
下面参照图3对本实施例进行进一步说明。如图3所示,将uiManager的openUI函数换为openUIHook函数,替换后的openUIHook函数在原有逻辑上,添加界面标识与用户界面开启时间的记录功能,这样可以在开启用户界面调用时,记录用户界面开启时间。类似地,将targetUI的onActive函数从内存中替换为onActiveHook函数,达到记录界面标识与用户界面渲染完成时间的效果。
接着,触发打开目标UI(用户界面)的指令,调用openUIHook函数新建UI对象或激活已注册的UI对象,同时记录UI开启触发时间。
然后,新建的UI对象或被激活的UI对象进行数据与资源加载后(即数据绑定初始化),目标应用的引擎对其进行渲染,渲染完成后触发onActiveHook函数。onActiveHook函数在执行onActive函数的原有功能的同时,记录UI渲染完成时间。
最终,计算UI开启触发时间和UI渲染完成时间的差作为目标UI的UI响应耗时。
通过以上技术方案,无需代码入侵即可自动且便捷地获得用户界面响应耗时,降低了出现bug的可能性,且hook方式不依赖外部环境或工具,能够跨平台使用,由此,提升了UI性能检测的效率和平台兼容性。
实施例三
图4示出了根据本发明的一个实施例的内存泄露测试的流程图。
如图4所示,若所述目标性能测试包括所述内存泄露,根据本发明的一个实施例的内存泄露测试的流程包括:
步骤402,关闭目标应用的全部当前用户界面。
目标应用可同时开启多个用户界面,多个用户界面间具有干扰,因此,可将目标应用的全部当前用户界面关闭后再对目标用户界面进行检测,以排除目标应用中目标用户界面以外的其他用户界面对目标用户界面的干扰。
步骤404,关闭所述目标用户界面,并记录关闭后的内存快照,作为第一内存快照。
将目标应用的全部当前用户界面关闭后,目标用户界面单独开启或关闭不会受到其他用户界面的影响,由此,可提升后续获取的用户界面内存变化信息的准确性。
一般地,应用可通过uiManager对象来管理用户界面的全部相关操作与用户界面对象的生命周期。将目标应用的全部当前用户界面关闭后,单独开启和关闭目标用户界面,uiManager对象的内存变化就只与目标用户界面的开启和关闭相关。换言之,此时,uiManager对象的内存变化可以准确反映目标用户界面的开启和关闭引发的内存变化。因此,可针对uiManager对象获取第一内存快照。
步骤406,再次开启所述目标用户界面,并再次关闭所述目标用户界面,以及记录关闭后的内存快照,作为第二内存快照。
一般地,若内存无泄漏,每次关闭目标用户界面后,uiManager对象不会发生内存增长,反之,若有内存泄漏,每次关闭目标用户界面后,uiManager对象的内存发生增长。因此,可重复开启和关闭目标用户界面,并分别在关闭目标用户界面后针对uiManager对象获取内存快照,以对比两次关闭目标用户界面后uiManager对象的内存变化情况。
在本申请的一种实现方式中,第一内存快照和第二内存快照的获取方式为:采用脚本语言为Lua,通过对全局表G表的遍历完整获取uiManager对象的全部引用对象的内存信息,作为内存快照。其中,可通过写文件或写入数据库的方式,对第一内存快照和第二内存快照进行保存,方便后续比对。
步骤408,基于所述第一内存快照和所述第二内存快照的差异,采集与所述内存泄露相关的性能数据。
具体来说,若内存无泄漏,每次关闭目标用户界面后,uiManager对象不会发生内存增长,反之,若有内存泄漏,每次关闭目标用户界面后,uiManager对象的内存发生增长。若所述第二内存快照相对于所述第一内存快照具有新增的用户界面对象,说明uiManager对象的内存发生增长,确定所述目标用户界面的所述目标检测信息为内存泄露信息。
另外,若所述第二内存快照相对于所述第一内存快照发生用户界面对象地址变更,说明内存的位置变动,确定所述目标用户界面的所述目标检测信息为内存转移信息。
通过以上技术方案,实现了用户界面的内存泄露检测的自动化,提升了用户界面检测的效率,节省了检测所需的成本。
实施例四
图5示出了根据本发明的一个实施例的渲染性能测试的流程图。
如图5所示,若所述目标性能测试包括所述渲染性能,根据本发明的一个实施例的渲染性能测试的流程包括:
步骤502,关闭所述目标应用的全部当前用户界面和场景相机。
目标应用可同时开启多个用户界面,多个用户界面间具有干扰,因此,可将目标应用的全部当前用户界面关闭后再对目标用户界面进行检测,以排除目标应用中目标用户界面以外的其他用户界面对目标用户界面的干扰。
同时,场景相机用于渲染目标应用内场景中的各类要素,用户界面相机与场景相机相互独立,因此,两者同时工作时,实际的渲染数据为两者共同作用得到的。然而,待获取的用户界面渲染数据为用户界面相机的渲染数据,因此,为获得准确有效的用户界面渲染数据,可关闭场景相机,从而去除场景相机产生的渲染数据,只调用用户界面相机进行渲染,得到所需的用户界面渲染数据。
步骤504,开启目标用户界面,通过目标应用的渲染数据获取接口采集与所述渲染性能相关的性能数据。
目标应用的引擎可提供drawcall等渲染数据获取接口,通过渲染数据获取接口的调用可获取当前目标应用运行时整体渲染性能数据,整体渲染性能数据包括场景相机和用户界面相机渲染的全部数据。而基于步骤502的初始化处理后,由于场景相机未开启,此时的整体渲染性能数据即仅为用户界面相机渲染的数据。由此,可排除场景相机的干扰,便捷获得准确性更高的用户界面渲染数据。
例如,在游戏应用中,参照图6所示,在进行游戏UI性能测试时,关闭所有UI,并关闭场景相机,由此,在游戏引擎渲染过程中,场景相机所涉及的场景、角色、建筑等内容均不再发生渲染,而UI相机得以保留,其工作得到UI渲染性能数据。
接着,开启目标UI,调用游戏应用中的渲染性能接口,由于场景相机所涉及的场景、角色、建筑等内容均不再发生渲染,渲染性能接口此时仅提供UI渲染性能数据,因此,即可经其获取到UI渲染性能数据。
实施例五
参照图7所示,可同时执行多种性能检测,一站式获取用户界面内存变化信息、用户界面响应耗时和用户界面渲染数据。
具体来说,在采集流程初始化过程中,执行用户界面内存变化信息、用户界面响应耗时和用户界面渲染数据所需的全部初始化内容,包括但不限于关闭场景相机、关闭所有UI、hook替换openUI、onActive函数。
在主体采集流程开始后,开启目标UI,并获取UI渲染性能数据和UI开启响应耗时。当然,还可获得内存、帧率、资源引用等其他可扩展数据项,作为目标检测信息。
此时,关闭目标UI,并进行uiManager内存快照获取,得到第一内存快照——snapshot A。接着,再次开启目标UI,并再次关闭目标UI,以及再次进行uiManager内存快照获取,得到第二内存快照——snapshot B。通过收集snapshot A和snapshot B进行对比,实现内存泄露信息的提取。
最终,将获取到的内存泄露信息、UI渲染性能数据和UI开启响应耗时,以及内存、帧率、资源引用等其他可扩展数据项,一并收集作为目标检测信息,目标检测信息可用于数据整合、数据保存、数据发送等处理。
另外,在一种可能的设计中,可同时执行两种UI性能检测,比如,一站式获取用户界面内存变化信息和用户界面响应耗时,或者,一站式获取用户界面内存变化信息和用户界面渲染数据,再或者,一站式获取用户界面响应耗时和用户界面渲染数据。
需要补充的是,以目标应用为游戏应用为例,参照图8所示,本申请的技术方案能够以工具的方式独立于游戏主体逻辑之外,并以UI性能采集工具模块的形式内嵌于游戏工程中。在输出游戏包体时,可保留工具模块,将UI性能采集工具也随之输出至IOS、Android和其他任何平台,由此,本申请的UI性能采集工具可以在不同的平台上使用
另外,还可根据实际需求,在包体输出时去除该UI性能采集工具,不将UI性能采集工具输出至平台,由于UI性能采集工具独立于游戏主体逻辑之外,这样的输出不会对游戏主体逻辑有任何影响。
图9示出了根据本发明的一个实施例的用户界面性能测试装置的框图。
如图9所示,根据本发明的一个实施例的用户界面性能测试装置包括:
接收模块10,用于接收针对目标应用触发的用户界面性能测试请求,所述用户界面性能测试请求用于请求对目标用户界面进行多种维度的目标性能测试,所述多种维度的目标性能测试至少包括响应耗时、内存泄露以及渲染性能中至少两项;
初始化模块20,用于响应于所述用户界面性能测试请求;从预配置的初始化方法中调用与目标性能测试匹配的目标初始化方法对所述目标应用进行初始化处理,所述目标初始化方法用于对目标应用进行操作以使得所述目标应用进入检测状态;
采集模块30,用于在所述初始化处理完成后,采集与所述目标性能测试相关的性能数据。
进一步的,若所述目标性能测试包括所述响应耗时,所述初始化模块20,具体用于通过第一钩子函数替换用户界面开启调用函数,和通过第二钩子函数替换用户界面回调函数,其中,
所述第一钩子函数用于执行用户界面开启功能和获取所述目标用户界面的开启时间;
所述第二钩子函数用于执行回调功能和获取所述目标用户界面的渲染完成时间。
具体的,所述采集模块30,包括:
调用单元31,用于调用所述第一钩子函数,以获取所述目标用户界面的开启时间;
所述调用单元31,还用于调用所述第二钩子函数,以获取所述目标用户界面的渲染完成时间;
采集单元32,用于基于所述目标用户界面的开启时间和渲染完成时间,采集与所述响应耗时相关的性能数据。
进一步的,若所述目标性能测试包括所述渲染性能,所述初始化模块20,具体用于关闭所述目标应用的全部当前用户界面和场景相机;
所述采集模块30,具体用于开启所述目标用户界面,通过所述目标应用的渲染数据获取接口采集与所述渲染性能相关的性能数据。
进一步的,若所述目标性能测试包括所述内存泄露,所述采集模块30,包括:
记录单元33,用于关闭所述目标用户界面,并记录关闭后的内存快照,作为第一内存快照;
所述记录单元33,用于再次开启所述目标用户界面,并再次关闭所述目标用户界面,以及记录关闭后的内存快照,作为第二内存快照;
所述采集单元32,用于基于所述第一内存快照和所述第二内存快照的差异,采集与所述内存泄露相关的性能数据。
所述采集单元32,具体用于:
若所述第二内存快照相对于所述第一内存快照具有新增的用户界面对象,确定所述内存泄露相关的性能数据为内存泄露信息;
若所述第二内存快照相对于所述第一内存快照发生用户界面对象地址变更,确定所述内存泄露相关的性能数据为内存转移信息。
具体的,所述目标应用为游戏应用,所述性能测试方法以工具模块方式嵌入在所述游戏应用的代码中。
该用户界面性能测试装置使用上述任一实施例中所述的方案,因此,具有上述所有技术效果,在此不再赘述。
图10示出了根据本发明的一个实施例的电子设备的框图。
如图10所示,本发明的一个实施例的电子设备1000,包括至少一个存储器1002;以及,与所述至少一个存储器1002通信连接的处理器1004;其中,所述存储器存储有可被所述至少一个处理器1004执行的指令,所述指令被设置为用于执行上述任一实施例中所述的方案。因此,该电子设备1000具有和上述任一实施例中相同的技术效果,在此不再赘述。
本发明实施例的电子设备以多种形式存在,包括但不限于:
(1)移动通信设备:这类设备的特点是具备移动通信功能,并且以提供话音、数据通信为主要目标。这类终端包括:智能手机(例如iPhone)、多媒体手机、功能性手机,以及低端手机等。
(2)超移动个人计算机设备:这类设备属于个人计算机的范畴,有计算和处理功能,一般也具备移动上网特性。这类终端包括:PDA、MID和UMPC设备等,例如iPad。
(3)便携式娱乐设备:这类设备可以显示和播放多媒体内容。该类设备包括:音频、视频播放器(例如iPod),掌上游戏机,电子书,以及智能玩具和便携式车载导航设备。
(4)服务器:提供计算服务的设备,服务器的构成包括处理器、硬盘、内存、系统总线等,服务器和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。
(5)其他具有数据交互功能的电子装置。
另外,本发明实施例提供了一种计算机可读存储介质,存储有计算机可执行指令,所述计算机可执行指令用于执行上述任一实施例中所述的方法流程。
以上结合附图详细说明了本发明的技术方案,通过本发明的技术方案,可实现多种目标检测信息的自动化同步获取,并在提升用户界面性能测试的效率和准确性的同时,实现跨平台应用,提升了用户界面性能测试的应用范围,节省了检测成本。
应当理解,本文中使用的术语“和/或”仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
应当理解,尽管在本发明实施例中可能采用术语第一、第二等来描述内存快照,但这些内存快照不应限于这些术语。这些术语仅用来将内存快照彼此区分开。例如,在不脱离本发明实施例范围的情况下,第一内存快照也可以被称为第二内存快照,类似地,第二内存快照也可以被称为第一内存快照。
取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”或“响应于检测”。类似地,取决于语境,短语“如果确定”或“如果检测(陈述的条件或事件)”可以被解释成为“当确定时”或“响应于确定”或“当检测(陈述的条件或事件)时”或“响应于检测(陈述的条件或事件)”。
在本发明所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能单元的形式实现。
上述以软件功能单元的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能单元存储在一个存储介质中,包括若干指令用以使得一台计算机装置(可以是个人计算机,服务器,或者网络装置等)或处理器(Processor)执行本发明各个实施例所述方法的部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明保护的范围之内。