发明内容
本公开实施例至少提供一种负载监控方法及装置。
第一方面,本公开实施例提供了一种负载监控方法,包括:
将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定,以使被绑定的图像绘制任务在开始执行时调用所述目标函数,以及在被绑定的图像绘制任务完成时触发所述目标函数的返回事件;
在检测到所述目标函数的返回事件时,确定所述目标函数最近一次的被调用时刻与所述返回事件的发生时刻之间的目标时间间隔;
基于所述目标时间间隔,确定所述图形处理器的负载信息。
一种可选的实施方式中,所述基于所述目标时间间隔,确定所述图形处理器的负载信息,包括:
确定在预设时间段内,调用所述目标函数的总次数;
基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定所述图形处理器在所述预设时间段内的负载信息。
一种可选的实施方式中,所述基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定所述图形处理器在所述预设时间段内的负载信息,包括:
基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定每次调用所述目标函数对应的目标时间间隔的平均值;
基于确定的所述平均值,确定所述图形处理器在所述预设时间段内的负载信息。
一种可选的实施方式中,所述将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定,包括:
利用钩子函数hook将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定。
一种可选的实施方式中,所述图像绘制任务包括以下至少一种:
调用交换缓冲区函数产生的图像绘制任务、调用缓存推送函数产生的图像绘制任务。
一种可选的实施方式中,所述目标函数为glFinish函数。
第二方面,本公开实施例还提供一种负载监控装置,包括:
绑定模块,用于将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定,以使被绑定的图像绘制任务在开始执行时调用所述目标函数,以及在被绑定的图像绘制任务完成时触发所述目标函数的返回事件;
第一确定模块,用于在检测到所述目标函数的返回事件时,确定所述目标函数最近一次的被调用时刻与所述返回事件的发生时刻之间的目标时间间隔;
第二确定模块,用于基于所述目标时间间隔,确定所述图形处理器的负载信息。
一种可选的实施方式中,所述第二确定模块具体用于:
确定在预设时间段内,调用所述目标函数的总次数;
基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定所述图形处理器在所述预设时间段内的负载信息。
一种可选的实施方式中,所述第二确定模块在基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定所述图形处理器在所述预设时间段内的负载信息时,用于:
基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定每次调用所述目标函数对应的目标时间间隔的平均值;
基于确定的所述平均值,确定所述图形处理器在所述预设时间段内的负载信息。
一种可选的实施方式中,所述绑定模块具体用于:
利用钩子函数hook将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定。
一种可选的实施方式中,所述图像绘制任务包括以下至少一种:
调用交换缓冲区函数产生的图像绘制任务、调用缓存推送函数产生的图像绘制任务。
一种可选的实施方式中,所述目标函数为glFinish函数。
第三方面,本公开实施例还提供一种电子设备,包括:处理器、存储器和总线,所述存储器存储有所述处理器可执行的机器可读指令,当电子设备运行时,所述处理器与所述存储器之间通过总线通信,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
第四方面,本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
本公开实施例提供的负载监控方法及装置,首先将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定,以使被绑定的图像绘制任务在开始执行时调用所述目标函数,以及在被绑定的图像绘制任务完成时触发所述目标函数的返回事件;然后,在检测到所述目标函数的返回事件时,确定所述目标函数最近一次的被调用时刻与所述返回事件的发生时刻之间的目标时间间隔;最后,基于所述目标时间间隔,确定所述图形处理器的负载信息。本公开实施例通过将目标函数与图像绘制任务绑定,使图像绘制任务完成时触发目标函数的返回事件,利用目标函数被调用的时刻及触发返回事件的时刻之间的目标时间间隔表示图像绘制任务所占用的时间,进而确定图形处理器的负载信息,不需要调用安卓系统的特定节点,适用于不同种类的安卓系统。
为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
具体实施方式
为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对在附图中提供的本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
本文中术语“和/或”,仅仅是描述一种关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合,例如,包括A、B、C中的至少一种,可以表示包括从A、B和C构成的集合中选择的任意一个或多个元素。
安卓系统的GPU负载信息通常通过抽样收集安卓系统的特定系统节点,读取GPU消耗时长来确定,然而,安卓系统容易会被不同厂商进行改造,用于确定GPU负载的系统节点通常无法访问,无法适配多种安卓系统。
基于上述研究,本公开提供了一种负载监控方法,通过将目标函数与图像绘制任务绑定,使图像绘制任务完成时触发目标函数的返回事件,利用目标函数被调用的时刻及触发返回事件的时刻之间的目标时间间隔表示图像绘制任务所占用的时间,进而确定图形处理器的负载信息,不需要调用安卓系统的特定节点,适用于不同种类的安卓系统。
为便于对本实施例进行理解,首先对本公开实施例所公开的一种负载监控方法进行详细介绍,本公开实施例所提供的负载监控方法的执行主体一般为具有一定计算能力的计算机设备。在一些可能的实现方式中,该负载监控方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
参见图1所示,为本公开实施例提供的负载监控方法的流程图,所述方法包括步骤S101~S103,其中:
S101、将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定,以使被绑定的图像绘制任务在开始执行时调用所述目标函数,以及在被绑定的图像绘制任务完成时触发所述目标函数的返回事件。
在安卓设备在进行硬件图像绘制时,首先由中央处理器先进行图像绘制的测量与布局,然后进行绘制,将绘制的内容同步并上传,确定其对应的flush命令,最后与图形处理器进行交换缓冲区,将绘制内存区域传递给图形处理器,之后,图形处理器执行交换缓冲区得到的图像绘制任务,完成图像的绘制。
由于中央处理器与图形处理器之间存在双buffer机制,通常中央处理器不会等待图形处理器完成图像绘制任务,而是在交换缓冲区完成后立刻返回并进行下一帧的绘制逻辑,因此,无法直接将交换缓冲区的耗时作为图形处理器执行图像绘制任务的耗时。
在上述基础上,可以对交换缓冲区事件产生的图像绘制任务进行特殊处理,通过确定图像绘制任务的耗时来确定图形处理器的负载。
该步骤中,可以将交换缓冲区事件产生的图像绘制任务与目标函数绑定,示例性的,目标函数可以为glFinish函数,glFinish函数是开放式图形库(Open GraphicsLibrary,OpenGL)的一个函数,用于向图形硬件提交缓冲区里的指令,并等待所有指令执行完成后再返回,通过将glFinish与图像绘制任务绑定,可以使被绑定的图像绘制任务再开始执行时调用glFinish,glFinish将当前线程绑定的图像绘制任务的指令(如GL Context对应的gl command)提交到图形处理器,并一直阻塞自身,直到提交的指令被图形处理器执行完毕后,才停止阻塞,触发返回事件。
这样,即可将目标函数从被调用的时刻到触发返回事件的时刻之间的时间间隔作为图形处理器在执行图像绘制任务所消耗的时长。
上述图像绘制任务可以包括调用交换缓冲区函数产生的图像绘制任务、调用缓存推送函数产生的图像绘制任务,交换缓冲区函数可以包括eglSwapBuffers、eglSwapBuffersWithDamageKHR函数,缓存推送函数可以包括glFlush、glFinish函数,其中,glFinish函数即为上述目标函数,在图像绘制任务为调用glFinish产生的任务的情况下,可以不再对其绑定目标函数,并且在进行目标时间间隔的统计时仍然能够统计到需要的数据。
一种可能的实施方式中,可以利用钩子函数hook将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定。
通过预先对安卓系统的交换缓冲区函数进行hook,即可在交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定。
进一步的,还可以只针对特定进程的交换缓冲区函数进行hook,这样,可以只对特定进程的图形处理器负载进行监控。
S102、在检测到所述目标函数的返回事件时,确定所述目标函数最近一次的被调用时刻与所述返回事件的发生时刻之间的目标时间间隔。
该步骤中,图像绘制任务开始执行时调用目标函数,并在任务完成后触发目标函数的返回事件,此时,可以确定目标函数最近一次的调用时刻,即该次返回事件对应的调用目标函数的时刻,与该次返回事件的发生时刻之间的目标时间间隔,该目标时间间隔能够即为上述图像绘制任务从开始到结束所消耗的时长。
通常,一次交换缓冲区事件会产生多个图像绘制任务,每个图像绘制任务都会调用一次目标函数,则每个图像绘制任务都对应有一个目标时间间隔。
S103、基于所述目标时间间隔,确定所述图形处理器的负载信息。
该步骤中,由于目标时间间隔能表示图形处理器执行图像绘制任务的时长,则可以利用目标时间间隔确定图形处理器的负载信息。
在一种可能的实施方式中,可以确定预设时间段内,执行图像绘制任务所导致的调用目标函数的总次数,然后再基于每次调用目标函数对应的目标时间间隔,以及调用目标函数的总次数,确定图形处理器在预设时间段内的负载信息。
具体的,可以将预设时间段内各次调用目标函数对应的目标时间间隔求和,再利用求和得到的总值除以预设时间段内调用目标函数的总次数,得到预设时间段内每次调用目标函数对应的目标时间间隔的平均值,然后利用得到的平均值确定图形处理器在预设时间段内的负载信息。
在预设时间段内,若上述确定的平均值越高,则说明图形处理器单次执行的图像绘制任务越复杂,说明图形处理器的负载越高;若上述平均值越低,则说明图形处理器单次执行的图像绘制任务越简单,图形处理器的负载越低。
这样,通过将目标函数与图像绘制任务绑定,使图像绘制任务完成时触发目标函数的返回事件,利用目标函数被调用的时刻及触发返回事件的时刻之间的目标时间间隔表示图像绘制任务所占用的时间,进而确定图形处理器的负载信息,不需要调用安卓系统的特定节点,即使安卓系统被改造也能够确定图形处理器的负载信息,适用于不同种类的安卓系统。
参见图2所示,为本公开实施例提供的另一种负载监控方法,该方法首先对安卓系统中的eglSwapBuffers、eglSwapBuffersWithDamageKHR、glFlush、glFinish函数进行hook,然后将eglSwapBuffers、eglSwapBuffersWithDamageKHR、glFlush函数与glFinish函数进行绑定,调用glFinish函数,使eglSwapBuffers、eglSwapBuffersWithDamageKHR、glFlush对应的图形绘制任务完成后,被绑定的glFinish函数才触发返回事件,然后统计被绑定的glFinish与未被绑定的glFinish的总耗时(即上述目标时间间隔),再根据确定的总耗时确定图形处理器的负载信息。
本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
基于同一发明构思,本公开实施例中还提供了与负载监控方法对应的负载监控装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述负载监控方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
参照图3所示,为本公开实施例提供的一种负载监控装置的示意图,所述装置包括:
绑定模块310,用于将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定,以使被绑定的图像绘制任务在开始执行时调用所述目标函数,以及在被绑定的图像绘制任务完成时触发所述目标函数的返回事件;
第一确定模块320,用于在检测到所述目标函数的返回事件时,确定所述目标函数最近一次的被调用时刻与所述返回事件的发生时刻之间的目标时间间隔;
第二确定模块330,用于基于所述目标时间间隔,确定所述图形处理器的负载信息。
一种可选的实施方式中,所述第二确定模块330具体用于:
确定在预设时间段内,调用所述目标函数的总次数;
基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定所述图形处理器在所述预设时间段内的负载信息。
一种可选的实施方式中,所述第二确定模块330在基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定所述图形处理器在所述预设时间段内的负载信息时,用于:
基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定每次调用所述目标函数对应的目标时间间隔的平均值;
基于确定的所述平均值,确定所述图形处理器在所述预设时间段内的负载信息。
一种可选的实施方式中,所述绑定模块310具体用于:
利用钩子函数hook将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定。
一种可选的实施方式中,所述图像绘制任务包括以下至少一种:
调用交换缓冲区函数产生的图像绘制任务、调用缓存推送函数产生的图像绘制任务。
一种可选的实施方式中,所述目标函数为glFinish函数。
关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
对应于图1中的负载监控方法,本公开实施例还提供了一种电子设备400,如图4所示,为本公开实施例提供的电子设备400结构示意图,包括:
处理器41、存储器42、和总线43;存储器42用于存储执行指令,包括内存421和外部存储器422;这里的内存421也称内存储器,用于暂时存放处理器41中的运算数据,以及与硬盘等外部存储器422交换的数据,处理器41通过内存421与外部存储器422进行数据交换,当所述电子设备400运行时,所述处理器41与所述存储器42之间通过总线43通信,使得所述处理器41执行以下指令:
将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定,以使被绑定的图像绘制任务在开始执行时调用所述目标函数,以及在被绑定的图像绘制任务完成时触发所述目标函数的返回事件;
在检测到所述目标函数的返回事件时,确定所述目标函数最近一次的被调用时刻与所述返回事件的发生时刻之间的目标时间间隔;
基于所述目标时间间隔,确定所述图形处理器的负载信息。
一种可选的实施方式中,所述处理器41执行的指令中,所述基于所述目标时间间隔,确定所述图形处理器的负载信息,包括:
确定在预设时间段内,调用所述目标函数的总次数;
基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定所述图形处理器在所述预设时间段内的负载信息。
一种可选的实施方式中,所述处理器41执行的指令中,所述基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定所述图形处理器在所述预设时间段内的负载信息,包括:
基于在所述预设时间段内,每次调用所述目标函数对应的目标时间间隔,以及调用所述目标函数的总次数,确定每次调用所述目标函数对应的目标时间间隔的平均值;
基于确定的所述平均值,确定所述图形处理器在所述预设时间段内的负载信息。
一种可选的实施方式中,所述处理器41执行的指令中,所述将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定,包括:
利用钩子函数hook将中央处理器与图形处理器之间进行的交换缓冲区事件产生的至少一个图像绘制任务与目标函数绑定。
一种可选的实施方式中,所述处理器41执行的指令中,所述图像绘制任务包括以下至少一种:
调用交换缓冲区函数产生的图像绘制任务、调用缓存推送函数产生的图像绘制任务。
一种可选的实施方式中,所述处理器41执行的指令中,所述目标函数为glFinish函数。
本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的负载监控方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的负载监控方法的步骤,具体可参见上述方法实施例,在此不再赘述。
其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(Software Development Kit,SDK)等等。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-OnlyMemory,ROM)、随机存取存储器(Random Access Memory,RAM)、磁碟或者光盘等各种可以存储程序代码的介质。
最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。