1.本发明实施例涉及计算机程序调试领域,尤其涉及一种渲染问题定位方法、装置、定位设备及存储介质。
背景技术:2.在三维图像渲染过程中,渲染应用程序如游戏、绘图软件、渲染引擎以及cad等在目标设备运行时,可能会出现某一画面帧绘制异常的情况,该画面帧绘制异常的原因包括但不限于:渲染应用程序的问题,或者,gpu内部软硬件功能问题。
3.因此,需要进一步定位该画面帧绘制异常的具体原因,以便调试人员基于该画面帧绘制异常的具体原因进行调试,从而解决该画面帧绘制异常的问题。
技术实现要素:4.有鉴于此,本发明实施例期望提供一种渲染问题定位方法、装置、定位设备及存储介质;能够提高渲染效果的调试效率。
5.本发明实施例的技术方案是这样实现的:第一方面,本发明实施例提供了一种渲染问题定位方法,包括:当渲染应用程序在目标设备运行过程中出现渲染效果异常的画面帧,定位设备从所述目标设备获取所述渲染效果异常的画面帧的着色命令流的实际运算结果;所述定位设备根据所述着色命令流的实际运算结果和期望运算结果,定位所述画面帧的渲染效果异常的原因。
6.第二方面,本发明实施例提供了一种渲染问题定位装置,包括:获取部分和定位部分,其中,所述获取部分经配置为当渲染应用程序在目标设备运行过程中出现渲染效果异常的画面帧,定位设备从所述目标设备获取所述渲染效果异常的画面帧的着色命令流的实际运算结果;所述定位部分,经配置为所述定位设备根据所述着色命令流的实际运算结果和期望运算结果,定位所述画面帧的渲染效果异常的原因。
7.第三方面,本发明实施例提供了一种定位设备,所述定位设备包括第二方面所述的渲染问题定位装置。
8.第四方面,本发明实施例提供了一种计算机存储介质,所述计算机存储介质存储有渲染问题定位的程序,所述渲染问题定位的程序被至少一个处理器执行时实现第一方面所述的渲染问题定位的方法的步骤。
9.本发明实施例提供了一种渲染问题定位方法、装置、定位设备及存储介质;通过定位设备和目标设备之间的连接,定位设备获取当前渲染异常的画面帧的初始渲染数据,并基于所述初始渲染数据,定位所述画面帧渲染异常的原因,能够提高渲染问题定位的效率。
附图说明
10.图1为可实施本发明实施例的定位设备的示意性框图;图2为说明图1中处理器、gpu和系统存储器的实例实施方案的框图;图3为本技术实施例提供的一种渲染问题的定位方法流程示意图;图4为本技术实施例提供的一种渲染问题定位方法示意图;图5为本发明实施例提供的又一种渲染问题定位方法示意图;图6为本发明实施例提供的一种渲染问题定位装置示意图;图7为本发明实施例提供的一种定位设备示意图。
具体实施方式
11.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
12.通常,三维图像渲染过程的复杂度通常较高,因此,渲染应用程序在目标设备运行时,可能会出现某一画面帧绘制异常的情况,该画面帧绘制异常的原因包括但不限于:渲染应用程序的问题(可以包括opengl命令流问题、opengl状态信息的问题以及shader命令流的问题),又或者,gpu的问题(可以包括gpu内部软硬件功能的问题以及gpu驱动程序的问题)。
13.需要说明的是,上述某一画面帧绘制异常的情况可以为所述渲染应用程序的调试人员在调试所述渲染应用程序时出现的,此时,所述渲染应用程序的调试人员需要确定上述某一画面帧绘制异常的情况是否属于所述渲染应用程序的问题导致的,如果是所述渲染应用程序的问题导致的,则需要对所述渲染应用程序进行调试和解决,如果不是,则可以确定上述某一画面帧绘制异常的情况是gpu的问题导致的,可以进一步联系该gpu的厂商进行处理;可选的,上述某一画面帧绘制异常的情况也可能是gpu厂商的gpu的调试人员在对gpu调试的过程中出现的,则所述gpu的调试人员需要先排除渲染应用程序的问题,在排除渲染应用程序的错误导致的某一画面帧绘制异常的情况之后,则可以确定所述某一画面帧绘制异常的情况是gpu的问题导致的,所述gpu调试人员可以进一步确定所述某一画面帧绘制异常的情况属于gpu内部软硬件功能的问题或者gpu驱动程序的问题,并进行相应的处理。
14.通常,对该画面帧绘制异常的具体原因的定位涉及到定位设备和目标设备,下面,首先对所述定位设备和所述目标设备进行详细介绍。
15.所述目标设备为能够实现渲染并显示渲染结果的设备,也就是说,所述目标设备为实际使用渲染应用程序的设备,所述定位设备为可以定位所述画面帧绘制异常的原因的设备。
16.作为示例而非限定,一般的,所述目标设备包括但不限于:无线装置、移动或蜂窝电话(包含所谓的智能电话)、个人数字助理(pda)、视频游戏控制台(包含视频显示器、移动视频游戏装置、移动视频会议单元)、膝上型计算机、桌上型计算机、电视机顶盒、平板计算装置、电子书阅读器、固定或移动媒体播放器等。所述定位设备包括但不限于:膝上型计算机以及pc机。
17.在图1的实例中,该目标设备和/或定位设备可以包括:cpu6、系统存储器10和gpu12。目标设备还可包含显示处理器14、收发器模块3、用户接口4和显示器8。收发器模块3
和显示处理器14两者可为与cpu6和/或gpu12相同的集成电路(ic)的部分,两者可在包含cpu6和/或gpu12的一或多个ic的外部,或可形成于在包含cpu6和/或gpu12的ic外部的ic中。
18.为清楚起见,该目标设备和/或定位设备可包含图2中未图示的额外模块或单元。此外,目标设备中所示的各种模块和单元可能不是在目标设备的每个实例中都是必需的。举例来说,在目标设备和/或定位设备为桌上型计算机或经装备以与外部用户接口或显示器连接的其它装置的实例中,用户接口4和显示器8可在目标设备外部。
19.用户接口4的实例包含(但不限于)轨迹球、鼠标、键盘和其它类型的输入装置。用户接口4还可为触摸屏,并且可作为显示器8的部分并入。收发器模块3可包含电路以允许目标设备与另一装置或网络之间的无线或有线通信。收发器模块3可包含调制器、解调器、放大器和用于有线或无线通信的其它此类电路。
20.cpu6,其经配置以处理供执行的计算机程序的指令。cpu6可包括控制目标设备的运算的通用模块。用户可将输入提供到目标设备,以致使cpu6执行一或多个渲染应用程序。在cpu6上执行的渲染应用程序可包含(例如)操作系统、文字处理器应用程序、电子邮件应用程序、电子表格应用程序、媒体播放器应用程序、视频游戏应用程序、图形用户接口应用程序或另一程序。另外,cpu6可执行用于控制gpu12的运算的gpu驱动程序22。用户可经由一或多个输入装置(未图示)(例如,键盘、鼠标、麦克风、触摸垫或经由用户接口4耦合到目标设备的另一输入装置)将输入提供到目标设备。
21.cpu6上执行的渲染应用程序可包含一或多个图形渲染指令(也可以理解为待渲染的画面帧中包含一或多个所述图形),使得所述图形数据可以渲染到显示器8上。在一些实例中,所述图形渲染指令可符合图形应用程序编程接口(application interface,api),例如,开放式图形库api(opengl api)、开放式图形库嵌入系统(opengl es)api、direct3d api、x3d api、renderman api、webgl api、开放式计算语言(openclt m)、renderscript或任何其它异构计算api,或任何其它公用或专有标准图形或计算api。为了处理所述图形渲染指令,cpu6可向gpu12发出一个或多个图形渲染命令(例如,通过gpu驱动程序)以致使gpu12执行所述图形数据的渲染中的一些或者全部。
22.gpu12可经配置以执行图形运算,从而将一或多个图形图元渲染到显示器8。因此,当在cpu6上执行的渲染应用程序18中的一者需要图形处理时,cpu6可将所述图形命令和图形数据提供到gpu12以用于渲染到显示器8。所述图形数据可包含(例如)绘制命令、状态信息、图元信息、纹理信息等。在一些情况下,gpu12可内置有高度并行结构,其提供比cpu6高效的对复杂图形相关运算的处理。举例来说,gpu12可包含经配置来以并行方式对多个顶点或像素进行运算的多个处理元件,例如着色器单元。在一些情况下,gpu12的高度并行性质允许gpu12比使用cpu6更快速地将图形图像(例如,gui和二维(2d)和/或三维(3d)图形场景)绘制到显示器8上。
23.在一些情况下,可将gpu12集成到目标设备的母板中。在其它情况下,gpu12可存在于图形卡上,所述图形卡安装在目标设备的母板中的端口中,或可以其它方式并入在经配置以与目标设备互操作的外围装置内。gpu12可包含一或多个处理器,例如一或多个微处理器、专用集成电路(asic)、现场可编程门阵列(fpga)、数字信号处理器(dsp)或其它等效的集成或离散逻辑电路。gpu12还可包含一或多个处理器核心,使得gpu12可被称作多核处理
器。
24.系统存储器10,包括内存储器和外存储器,其中内存储器,经配置为暂时cpu6中的运算数据,以及与硬盘等外部存储器交换的数据。系统存储器10可包含一或多个易失性或非易失性存储器或存储装置,例如,随机存取存储器(ram)、静态ram(sram)、动态ram(dram)。
25.图形存储器40可为gpu12的一部分。因此,gpu12可在不使用总线的情况下从图形存储器40读取数据且将数据写入到图形存储器40。换句话说,gpu12可使用本地存储装置而不是芯片外存储器在本地处理数据。此类图形存储器40可被称作芯片上存储器。这允许gpu12通过消除gpu12经由总线读取和写入数据的需要来以更高效的方式操作,其中经由总线操作可经历繁重的总线业务。图形存储器40可包含一或多个易失性或非易失性存储器或存储装置,例如,随机存取存储器(ram)、静态ram(sram)、动态ram(dram)、可擦除可编程rom(eprom)、电可擦除可编程rom(eeprom)、快闪存储器、磁性数据媒体或光学存储媒体。
26.图2是进一步详细说明图1中cpu6、gpu12和系统存储器10的实例实施方案的框图。如图2所示,cpu6可执行至少一个渲染应用程序18、图形api20和gpu驱动程序22,其中的每一者可为一或多个渲染应用程序或服务。在一些实例中,图形api20和gpu驱动程序22可实施为cpu6的硬件单元。
27.可供cpu6和gpu12使用的存储器可包含系统存储器10和输出缓冲器16。输出缓冲器16可为系统存储器10的部分或可与系统存储器10分离。输出缓冲器16可存储经渲染图像数据,例如像素数据。输出缓冲器16还可被称为帧缓冲器或显存。
28.输出缓冲器16存储gpu12的目的地像素。每个目的地像素可与唯一屏幕像素位置相关联。在一些实例中,输出缓冲器16可存储每个目的地像素的色彩分量和目的地α值。举例来说,输出缓冲器16可存储每个像素的红色、绿色、蓝色、α(rgba)分量,其中“rgb”分量对应于色彩值,并且“a”分量对应于目的地α值(例如,用于图像合成的不透明度值)。尽管将输出缓冲器16和系统存储器10说明为单独的存储器单元,但在其它实例中,输出缓冲器16可以是系统存储器10的一部分。此外,输出缓冲器16还可能够存储除像素之外的任何合适的数据。
29.所述渲染应用程序18可为利用gpu12的功能性的任何应用程序。举例来说,渲染应用程序18可为gui应用程序、操作系统、便携式制图应用程序、用于工程或艺术应用的计算机辅助设计程序、视频游戏应用程序或使用2d或3d图形的另一类型的渲染应用程序。
30.渲染应用程序18可包含指令gpu12渲染图形用户接口(gui)和/或图形场景的一或多个绘制指令。举例来说,绘制指令可包含界定将由gpu12渲染的一组一或多个图形图元的指令。在一些实例中,绘制指令可共同地界定用于gui中的多个开窗表面的全部或部分。在额外实例中,所述绘制指令可共同地定义图形场景的全部或部分,所述图形场景包含在由应用程序定义的模型空间或世界空间内的一或多个图形对象。
31.渲染应用程序18可经由图形api20调用gpu驱动程序22,以向gpu12发出一或多个命令,以用于将一或多个图形图元渲染到可显示的图形图像中。举例来说,渲染应用程序18可调用gpu驱动程序22,以向gpu12提供图元定义。在一些情况下,图元定义可以例如三角形、矩形、三角形扇、三角形带等的绘制图元的列表的形式被提供到gpu12。图元定义可包含指定与待呈现的图元相关联的一或多个顶点的顶点规格。所述顶点规格可包含每个顶点的
位置坐标,且在一些情况下包含与顶点相关联的其它属性,例如色彩属性、法向量和纹理坐标。图元定义还可包含图元类型信息(例如,三角形、矩形、三角形扇、三角形带等)、缩放信息、旋转信息及类似者。
32.基于由渲染应用程序18向gpu驱动程序22发出的指令,gpu驱动程序22可调配指定供gpu12执行的一或多个运算以便渲染图元的一或多个命令。当gpu12接收到来自cpu6的命令时,gpu12可使用处理器集群46执行图形处理管线,以便对命令进行解码,并对图形处理管线进行配置以执行命令中所制定的操作。
33.通常, 可以通过定位设备上的debug工具定位所述画面帧绘制异常问题的原因:debug工具主要是基于目标设备和定位设备之间的通信连接,在用户空间开启调试接口,解析所述渲染应用程序下发的对于所述画面帧的渲染命令流(也就是opengl命令流)、渲染状态信息(也就是opengl状态信息)以及着色命令流(也就是shader命令流),逐条核对所述opengl命令流中的每一条opengl命令以及opengl状态信息以及shader命令流中的每一条shader命令,以定位该画面帧绘制异常的具体原因。但通过上述debug工具进行调试的过程极为复杂,特别是基于shader命令流的shader运算,由于通过debug工具也仅能得到顶点、法线、纹理坐标等shader命令的传入数据,但无法查看每一条shader命令的实际中间运算结果和shader命令的实际最终运算结果,因此很难准确快速的定位出引起所述画面帧绘制异常的shader命令。
34.综上所述,对于复杂的渲染场景(也就是上述画面帧中包括很多图形的情况),由于待渲染的数据量很大,相应的,shader命令流的运算复杂度也较高,导致上述两种方法定位渲染问题的效率较低。
35.通过分析可知,上述两种方法定位渲染问题的效率较低的主要问题在于:无法直接获得shader命令的实际中间运算结果以及实际最终运算结果,导致无法将shader命令的实际运算结果以及shader命令的期望运算结果进行对比,从而增加了定位所述画面帧的渲染效果异常的原因的难度。基于此,本技术实施例提出了一种渲染问题定位方法,调试人员可以获取shader命令流的实际中间运算结果以及实际最终运算结果,并根据shader命令流的实际中间运算结果以及实际最终运算结果定位所述画面帧的渲染效果异常的原因,从而可以提高定位渲染问题的效率。
36.需要说明的是,所述渲染问题定位方法的应用环境的系统架构中可以包括:定位设备、目标设备以及所述定位设备和所述目标设备之间的通信连接。其中,所述通信连接用以实现定位设备和目标设备之间的数据传输,所述通信连接可以包括各种连接类型,例如有线通信链路、无线通信链路或者光纤电缆等等。
37.在由于当前使用较多的api是opengl api,因此,本技术下面的描述中将以opengl api为例进行说明,本领域技术人员应理解,其他api处理的原理与opengl api是相同的,在本技术中不再赘述。
38.opengl本身是一个关于图形的api的详述规范(specification),规定了很多函数和其参数返回型,以及要实现的行为和管线操作。gpu12的硬件开发商提供满足opengl规范的驱动程序,将opengl定义的渲染指令翻译为gpu12可读的渲染命令,gpu12根据其可读的渲染命令对所述图形数据进行渲染。在opengl中,存在program和shader两个概念,program相当于当前渲染管线所使用的程序,是shader的容器,可以挂载多个shader。而每个shader
相当于一个程序部分,首先需要对shader脚本进行编译,然后将编译好的shader挂载到program上,在opengl的渲染中使用program来使shader生效。也就是说,shader是专门用来实现不同渲染工序的程序,通过shader可以自定义gpu12的shader渲染算法(也就是渲染应用程序传入gpu12的shader命令流中的每一条shader命令),以使得gpu12根据所述shader渲染算法处理所述图形数据中的每一个顶点以及每一个像素点,从而将该画面帧渲染到显示器8。
39.需要说明的是,本技术实施例中所述opengl命令流中可以包括至少一条opengl命令,同理的,shader命令流中可以包括至少一条shader命令。
40.下面,对本技术实施例提供的一种渲染问题定位方法进行详细描述。如图3所示,所述渲染问题定位方法应用于定位设备,所述方法包括:s301,当渲染应用程序在目标设备运行过程中出现渲染效果异常的画面帧,定位设备从所述目标设备获取所述渲染效果异常的画面帧的着色命令流的实际运算结果。
41.s302,所述定位设备根据所述着色命令流的实际运算结果和期望运算结果,定位所述画面帧的渲染效果异常的原因。
42.在一些示例中,所述着色命令流的实际运算结果包括:所述着色命令流的实际中间运算结果和所述着色命令流的实际最终运算结果。
43.对于上述示例,需要说明的是, shader标准规定了不同shader命令的传入数据和传出数据,每一条shader命令均可以包含一个或者多个实际中间运算结果和一个实际最终运算结果,该实际最终运算结果也就是shader命令的传出数据。调试人员可以通过添加代码的方式,灵活的获取所需的shader命令的实际中间运算结果。
44.例如,所述shader命令的传出数据可以包括但不限于以下几种:float4 vertex : position; //顶点坐标;float4 tangent : tangent; // tangent表示三角函数的一种,它的值是mesh到表面法线的正切值;float3 normal : normal; //表面法向量,以对象的坐标系标准化至单位长度;float4 texcoord : texcoord0;//纹理坐标系的第0个集合;float4 texcoord1 : texcoord1; //纹理坐标系的第1个集合;fixed4 color : color;//颜色,通常为常数。
45.举例来说,顶点着色命令(vertex shader)会被每个顶点调用,而通常一个顶点可能包含很多信息,例如顶点坐标、顶点法向量、纹理坐标等等,这些信息被称为顶点的属性。在一个vertex shader里,一个顶点属性可以由glsl标识符“in”来定义的。下面的代码里定义了两个vec3的属性,vertexposition和vertexcolor,其中还有一个类型为vec3的输出color,而这个输出color将作为传入数据传递给下一层处理的像素命令(fragment shader)中。
46.in vec3 vertexposition;in vec3 vertexcolor;out vec3 color;void main(){
ꢀꢀꢀꢀ
color = vertexcolor;
ꢀꢀꢀꢀ
gl_position = vec4(vertexposition,1.0);}在一些示例中,所述当渲染应用程序在目标设备运行过程中出现渲染效果异常的画面帧,定位设备从所述目标设备获取所述渲染效果异常的画面帧的着色命令流的实际运算结果之前,所述方法还包括:定位设备从所述目标设备获取所述渲染效果异常的画面帧的渲染命令流和渲染状态信息,排除所述渲染应用程序的输出给gpu的所述渲染命令流和所述渲染状态信息错误。
47.具体的,目标设备上出现显示异常的画面帧,也可以理解为目标设备出现了渲染错误,而出现渲染错误的原因可能包括:所述渲染应用程序向gpu输出的初始渲染数据的问题以及gpu软硬件问题。
48.第一种可能的原因:所述渲染应用程序向gpu输出的初始渲染数据的问题。由于所述初始渲染数据可以包括:所述渲染应用程序下发的对于所述画面帧的opengl命令流、相应的opengl状态信息以及shader命令流,而所述画面帧的opengl命令流、相应的opengl状态信息的问题较容易定位,因此,可以先定位所述渲染应用程序的输出给gpu的所述画面帧的所述渲染命令流和所述渲染状态信息错误。
49.例如,渲染应用程序向gpu下发的opengl命令顺序出现错误,或者,渲染应用程序是向gpu下发的opengl命令流中相应的渲染数据错误(如顶点数据错误或者像素数据错误)。
50.又例如,渲染应用程序向gpu下发了错误的状态信息。由于opengl定义了众多的状态和相应的状态变量,通过这些状态变量可以令渲染时使用光照、纹理、隐藏面消除、雾以及其他影响物体外观的状态。在默认情况下,这些状态大多数未被启动,这是由于启动这些状态的代价可能很大。举例来说,启动纹理映射将降低渲染速度,但渲染质量将更高。要启用和关闭这些状态,可使用下面两个简单的函数:void glenalble(glenum cap)和void gldisable(glenum cap),其中,glenable()用于启用功能,gldisable()用于关闭。有60多个枚举值可用作glenalbe()或gldisable()的参数,其中包括gl_blend、gl_depth_test等。还可以检查状态当前处于启动还是禁用状态。如glboolean glisenabled(glenum capability),该函数根据被查询的功能是否被启动,返回gl_true或gl_false。而上述仅描述了两种状态,大多数情况下,opengl定义的函数可能包括更复杂的状态变量设置值,例如,函数glcolor3f返回三个值,它们是状态gl_current_color的组成部分。可见,opengl状态信息设置错误也会导致渲染效果异常。
51.再例如,渲染应用程序向gpu下发了错误的shader命令流,也可以理解为shader算法错误,所述shader算法包括了多种对顶点数据或者像素数据的具体处理,举例来说,顶点数据(vertex)进入gpu运算首先需要进行的是顶点处理,这个部分就需要使用vertex shader来对顶点数据进行相应的处理,例如,对每一个顶点的坐标(position)进行几何变换,得到经过几何变换后的顶点坐标(包括坐标,颜色,纹理坐标、法线等顶点属性)。可见,若shader命令流错误,也会导致渲染效果异常。
52.需要注意的是,上述几种可能的原因还可能结合,产生其他可能的问题。举例来说,渲染应用程序是向gpu下发的数据是正确的,渲染应用程序是向gpu下发了错误的状态
信息,这可能导致在某些目标设备上可以进行渲染但渲染结果出现异常,但在另一些目标设备上无法进行渲染。例如,对于渲染应用程序为一款手机游戏时,在一些手机上,人物显示不出来,这可能是深度状态设置有误导致的;或者,武器闪烁,这可能与该手机本身屏幕的精度有关);或者,场景卡顿,这可能与该手机本身运算能力有关。
53.第二种可能的原因:gpu的问题,排除以上可能的原因后,就可以定位渲染效果异常的原因为gpu的问题。
54.举例来说,第一种可能的原因中的opengl命令流、相应的opengl状态信息的错误导致的渲染错误的问题,定位设备可以通过定位设备的debug工具,基于所述定位设备和所述目标设备之间的通信连接,获取所述目标设备的所述画面帧的opengl命令流、opengl状态信息,进而从所述画面帧的opengl命令流中获知所述渲染应用程序向gpu发送opengl命令的顺序以及从opengl命令流中获得相应的初始渲染数据,检查opengl命令的顺序是否错误,以及,检查该画面帧的顶点数据和像素数据是否正确,从而定位渲染错误的原因。定位设备还可以检查获取的画面帧的opengl状态信息是否正确来定位渲染问题。进一步的,定位设备还可以检查初始渲染数据以及opengl状态信息是否匹配来定位渲染错误的原因。
55.而对于第一种可能的原因中的shader命令流的错误导致的渲染错误的问题,可以通过debug工具获取的shader命令流,通过检查shader命令流是否正确来定位渲染问题。然而,通过shader命令流的问题定位十分复杂,需要进一步获取shader实际运算结果,以便定位渲染错误的原因。
56.可见,获取shader实际运算结果对于定位渲染错误的原因至关重要。而获取shader实际运算结果的方法有多种,本技术实施例对此不做限定。下面,对获取shader实际运算结果的两种可选的方法进行详细说明。
57.在一些示例中,所述当渲染应用程序在目标设备运行过程中出现渲染效果异常的画面帧,定位设备从所述目标设备获取所述渲染效果异常的画面帧的着色命令流的实际运算结果,包括:所述定位设备基于所述定位设备和所述目标设备之间的通信连接,暂停所述渲染应用程序的运行;获取所述着色命令流和对应于所述着色命令流的传入数据;所述定位设备根据对应于所述着色命令流的传入数据,执行所述着色命令流,获取所述着色命令流的实际运算结果。
58.对于上述示例,由于在目标设备运行所述渲染应用程序时,opengl命令流是实时变化的,难以获取到对应于一个画面帧的初始渲染数据,其中,所述渲染数据可以包括所述画面帧的opengl命令流、opengl状态信息以及shader命令流。因此,要获取对应于一个画面帧的初始渲染数据,需要先暂停当前运行渲染应用程序。
59.具体的,可以通过终止目标设备中的渲染命令的下发来暂停目标设备中所述渲染应用程序的运行,而渲染命令的下发是需要通过钩子函数来执行的,因此,gpu调试人员可以通过在所述目标设备中的目标渲染程序中注入hook(钩子)函数来暂停目标设备中所述渲染应用程序的运行。需要注意的是,hook函数会消耗处理时间,降低所述渲染应用程序的性能,因此,在调试完毕后要及时将之删除。需要说明的是,hook函数是一种特殊的消息处理机制,它可以监视系统或者进程中的各种事件消息,截获相应的消息并进行处理。因此,可以通过自定义hook函数,监视系统中特定事件的发生,完成特定功能。为完成上述不同的特定功能,hook函数的种类有很多,如键盘钩子可以截获键盘消息,外壳钩子可以截取、启
动和关闭应用程序的消息等。hook函数也可以分为线程钩子和系统钩子,线程钩子可以监视指定线程的事件消息,系统钩子监视系统中的所有线程的事件消息。可见,hook函数是一个消息的拦截机制,可以拦截单个进程的消息(线程钩子),也可以拦截所有进程的消息(系统钩子),也可以对拦截的消息进行自定义处理。
60.可选的,如图4所示,可以在定位设备的debug工具的基础上添加相关代码实现如下shader调试器的功能;基于所述定位设备和所述目标设备之间的通信连接,从所述目标设备获取所述着色命令流和对应于所述着色命令流的传入数据,并且基于所述对应于所述着色命令流的传入数据,执行所述着色命令流,包括但不限于单步运行所述shader命令流,以查看并获取shader命令流的实际中间运算结果和实际最终运算结果。
61.需要说明的是,图3中的内核空间(kernel space)主要是各种操作系统核心功能(例如时钟,任务调度,调频调压,中断响应等),而各种应用程序则主要运行在图3中的用户空间(user space)。
62.示例的, 可以通过回调的方式获取shader命令流, 然后采用shadertoy的网页模拟方式运行获取的shader命令流中的每一条shader命令,并在shader命令的模拟执行过程中添加相关打印命令,即可输出该shader命令相应的运算结果。需要说明的是,shadertoy是一个可以编辑、分享和查看shader命令及其渲染效果的网站。
63.在一些示例中,所述当渲染应用程序在目标设备运行过程中出现渲染效果异常的画面帧,定位设备从所述目标设备获取所述渲染效果异常的画面帧的着色命令流的实际运算结果,包括:所述定位设备基于所述定位设备和所述目标设备之间的通信连接,指示所述目标设备的gpu将所述着色命令流的实际运算结果保存在所述目标设备的gpu的图形存储器,并且指定所述目标设备的gpu的图形存储器到所述目标设备的系统存储器的映射关系,从而将所述目标设备的gpu的图形存储器中保存的所述着色命令流的实际运算结果映射到所述目标设备的系统存储器;所述定位设备的debug工具从所述目标设备的系统存储器中获取所述着色命令流的实际运算结果。
64.对于上述示例,具体的,所述定位设备可以基于所述定位设备和所述目标设备之间的通信连接,通过添加相关代码的方式指示所述目标设备的gpu保存所述画面帧的着色命令流的实际运算结果。例如,“export dump =1”。export函数可以新增,修改或删除环境变量,供后续执行的程序使用。export命令将使系统在创建每一个新的shell时定义这个变量的一个拷贝,因此,上述语句可以用于将shader命令流的运算结果保存在gpu的图形存储器中。
65.然而,由于现有的debug工具主要是通过在user space层开启调试接口,解析所述渲染应用程序下发的对于所述画面帧的opengl命令流,因此,debug工具无法直接获取的到所述目标设备的gpu的图形存储器中保存的所述着色命令流的实际运算结果,因此,所述定位设备还需要指定所述目标设备的gpu的图形存储器到所述目标设备的系统存储器的映射关系,从而将所述目标设备的gpu的图形存储器中保存的所述着色命令流的实际运算结果映射到所述目标设备的系统存储器,从而所述定位设备的debug工具可以获取到所述着色命令流的实际运算结果。
66.作为示例而非限定,如图5所示,可选的,由于dram的性价比很高且扩展性好,可以假设所述目标设备的gpu的图形存储器包括dram(称为dram1),所述目标设备的系统存储器
也包括dram(称为dram2),则可以通过将所述着色命令流的实际运算结果保存在gpu的dram2中的指定区域,并由i/o总线中的pcie总线建立dram1与dram2之间的地址映射关系,从而可以将所述目标设备的gpu的图形存储器中保存的所述着色命令流的实际运算结果映射到所述定位设备的系统存储器的指定区域。其中,pcie是一种高速串行计算机扩展总线,属于高速串行点对点双通道高带宽传输,数据传输的速率高且所连接的设备分配独享通道带宽,不共享总线带宽。
67.在一些示例中,所述方法还包括:建立所述定位设备和所述目标设备之间的所述通信连接。
68.对于上述示例,举例来说,若所述定位设备为pc机,可以在所述定位设备上安装pc助手,目标设备可以为安卓智能终端,所述目标设备可以至少具有一个用于调试的端口,如安卓调试桥(android debug bridge,adb)端口,adb可以是安卓软件开发工具包中的一个工具,采用此工具可以直接操作管理真实的安卓设备。定位设备的pc助手可以基于所述通信连接,通过所述目标设备的adb端口与之建立通信连接。
69.在一些示例中,所述根据所述着色命令流的实际运算结果和期望运算结果,定位所述画面帧的渲染效果异常的原因,包括:若所述着色命令流中存在至少一条着色命令的实际最终运算结果和相应的期望最终运算结果存在第一差异,则按照所述着色命令流的执行顺序,比较存在所述第一差异的至少一条着色命令的至少一个实际中间运算结果中的每一个实际中间运算结果和相应的期望中间运算结果,若两者存在第二差异,则基于所述第二差异定位所述画面帧的渲染效果异常的原因为存在所述第二差异的着色命令的错误。
70.对于上述示例,需要说明的是,由于着色命令流中包含至少一条着色命令,因此,每一个所述着色命令的实际最终运算结果都有一个相应的期望最终运算结果;每一个所述着色命令中包括至少一个实际中间运算结果,因此,每一个所述着色命令的实际中间运算结果也都有一个对应的期望中间运算结果。其中,所述实际最终运算结果和实际中间运算结果为目标设备实际渲染过程中产生的,或者,定位设备通过获取的shader命令流模拟实际渲染过程中产生的;所述期望最终运算结果和期望中间运算结果是调试人员根据shader传入数据通过经验或者计算的方式得到的。
71.对于上述示例,可以理解为:若所述着色命令流中包括2条着色命令,分别为shader1和 shader2,且执行顺序为shader1在shader2前面执行。其中,shader1的实际中间运算结果为shader11和shader12,shader11相应的期望中间运算结果shader11ideal,shader12相应的期望中间运算结果shader12idea,shader1的实际最终运算结果为shader1final,shader1final 相应的期望最终运算结果shader1finalideal;shader2的实际中间运算结果为shader21和shader22,shader21相应的期望中间运算结果shader21ideal,shader22相应的期望中间运算结果shader22ideal,shader2的实际最终运算结果为shader2final,shader2final 相应的期望最终运算结果shader2finalideal; 则调试人员可以先比较shader1final与shader1finalideal,若两者相同,则继续比较shader2final与shader2finalideal,若两者存在差异,则继续比较shader21与shader21ideal,若两者相同,则比较shader22和shader22ideal,若两者存在差异,则可以定位所述画面帧的渲染效果异常的原因为shader2的错误。然后,调试人员可以根据shader22和shader22ideal,对shader2的错误进行调试处理。
72.在一些示例中,所述方法还包括:若经调试后,所述着色命令的错误已解决,但对所述画面帧再次渲染的渲染效果仍异常,则定位所述画面帧的渲染效果异常的原因为所述gpu的问题。
73.对于上述示例,需要说明的是,若经调试后,所述着色命令的错误已解决,也就是说可以认为所述渲染应用程序输出给gpu的初始渲染数据是正确的,此时,可以确定所述画面帧再次渲染的渲染效果再次异常的原因是gpu内部软硬件功能的问题和/或gpu驱动程序的问题,需要gpu的调试人员对其进行调试处理。
74.图6为本发明实施例提供的一种渲染问题定位装置600,所述装置应用于所述定位设备,所述装置600包括:获取部分和定位部分,其中,所述获取部分601,经配置为当渲染应用程序在目标设备运行过程中出现渲染效果异常的画面帧,定位设备从所述目标设备获取所述渲染效果异常的画面帧的着色命令流的实际运算结果;所述定位部分602,经配置为所述定位设备根据所述着色命令流的实际运算结果和期望运算结果,定位所述画面帧的渲染效果异常的原因。
75.在一些示例中,所述获取部分601,经配置为所述定位设备基于所述定位设备和所述目标设备之间的通信连接,暂停所述渲染应用程序的运行;获取所述着色命令流和对应于所述着色命令流的传入数据;所述定位设备根据对应于所述着色命令流的传入数据,执行所述着色命令流,获取所述着色命令流的实际运算结果。
76.在一些示例中,所述获取部分601,经配置为所述定位设备基于所述定位设备和所述目标设备之间的通信连接,指示所述目标设备的gpu将所述着色命令流的实际运算结果保存在所述目标设备的gpu的图形存储器,并且指定所述目标设备的gpu的图形存储器到所述目标设备的系统存储器的映射关系,从而将所述目标设备的gpu的图形存储器中保存的所述着色命令流的实际运算结果映射到所述目标设备的系统存储器;所述定位设备从所述目标设备的系统存储器中获取所述着色命令流的实际运算结果。
77.在一些示例中,所述定位部分602,经配置为若所述着色命令流中存在至少一条着色命令的实际最终运算结果和相应的期望最终运算结果存在第一差异,则按照所述着色命令流的执行顺序,比较存在所述第一差异的至少一条着色命令的至少一个实际中间运算结果中的每一个实际中间运算结果和相应的期望中间运算结果,若两者存在第二差异,则基于所述第二差异定位所述画面帧的渲染效果异常的原因为存在所述第二差异的着色命令的错误。
78.在一些示例中,所述定位部分602,还经配置为若经调试后,所述着色命令的错误已解决,但对所述画面帧再次渲染的渲染效果仍异常,则定位所述画面帧的渲染效果异常的原因为所述gpu的问题。
79.在一些示例中,所述装置600还可以包括:排除部分603,经配置为定位设备从所述目标设备获取所述渲染效果异常的画面帧的渲染命令流和渲染状态信息,排除所述渲染应用程序的输出给gpu的所述渲染命令流和所述渲染状态信息错误。
80.可以理解地,在本实施例中,“部分”可以是部分电路、部分处理器、部分程序或软件等等,当然也可以是单元,还可以是部分也可以是非部分化的。
81.另外,在本实施例中的各组成部分可以集成在一个处理单元中,也可以是各个单
元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能部分的形式实现。
82.所述集成的单元如果以软件功能部分的形式实现并非作为独立的产品进行销售或使用时,可以存储在一个计算机可读取存储介质中,基于这样的理解,本实施例的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)或processor(处理器)执行本实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom, read only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
83.因此,本实施例提供了一种计算机存储介质,所述计算机存储介质存储有一种渲染问题定位程序,所述一种渲染问题定位程序被至少一个处理器执行时实现上述技术方案中所述一种渲染问题定位方法步骤。
84.根据上述一种渲染问题定位装置600以及计算机存储介质,参见图7,其示出了本发明实施例提供的一种能够实施上述一种渲染问题定位装置600的定位设备700的具体硬件结构,所述定位设备700可以包括:通信接口701,存储器702、处理器703;各个组件通过总线系统704耦合在一起。可理解,总线系统704用于实现这些组件之间的连接通信。总线系统704除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图7中将各种总线都标为总线系统704。其中,所述通信接口701,用于在与其他外部网元之间进行收发信息过程中,信号的接收和发送;所述存储器702,用于存储能够在所述处理器703上运行的计算机程序;所述处理器703,用于在运行所述计算机程序时,执行以下步骤:当渲染应用程序在目标设备运行过程中出现渲染效果异常的画面帧,定位设备从所述目标设备获取所述渲染效果异常的画面帧的着色命令流的实际运算结果;所述定位设备根据所述着色命令流的实际运算结果和期望运算结果,定位所述画面帧的渲染效果异常的原因。
85.可以理解,本发明实施例中的存储器702可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。其中,非易失性存储器可以是只读存储器(read
‑
only memory,rom)、可编程只读存储器(programmable rom,prom)、可擦除可编程只读存储器(erasable prom,eprom)、电可擦除可编程只读存储器(electrically eprom,eeprom)或闪存。易失性存储器可以是随机存取存储器(random access memory,ram),其用作外部高速缓存。通过示例性但不是限制性说明,许多形式的ram可用,例如静态随机存取存储器(static ram,sram)、动态随机存取存储器 (dynamic ram,dram)、同步动态随机存取存储器(synchronous dram,sdram)、双倍数据速率同步动态随机存取存储器(double data rate sdram,ddrsdram)、增强型同步动态随机存取存储器(enhanced sdram,esdram)、同步连接动态随机存取存储器(synchlink dram,sldram)和直接内存总线随机存取存储器(direct rambus ram,drram)。本文描述的系统和方法的存储器702旨在包括但不限于这些和任意其它适合类型的存储器。
86.而处理器703可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器703中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器703可以是通用处理器、数字信号处理器(digital signal processor,dsp)、专用集成电路(application specific integrated circuit,asic)、现场可编程门阵列(field programmable gate array, fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中的公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。结合本发明实施例所公开的方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件部分组合执行完成。软件部分可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程 存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器702,处理器703读取存储器702中的信息,结合其硬件完成上述方法的步骤。
87.可以理解的是,本文描述的这些实施例可以用硬件、软件、固件、中间件、微码或其组合来实现。对于硬件实现,处理单元可以实现在一个或多个专用集成电路(application specific integrated circuits,asic)、数字信号处理器(digital signal processing,dsp)、数字信号处理设备(dsp device,dspd)、可编程逻辑设备(programmable logic device,pld)、现场可编程门阵列(field
‑
programmable gate array,fpga)、通用处理器、控制器、微控制器、微处理器、用于执行本技术所述功能的其它电子单元或其组合中。
88.对于软件实现,可通过执行本文所述功能的部分(例如过程、函数等) 来实现本文所述的技术。软件代码可存储在存储器中并通过处理器执行。存储器可以在处理器中或在处理器外部实现。
89.具体来说,处理器703还配置为运行所述计算机程序时,执行前述技术方案中所述渲染问题定位方法步骤,这里不再进行赘述。
90.可以理解地,上述渲染问题定位装置600以及定位设备700的示例性技术方案,与前述渲染问题定位方法的技术方案属于同一构思,因此,上述对于渲染问题定位装置600以及定位设备700的技术方案未详细描述的细节内容,均可以参见前述渲染问题定位方法的技术方案的描述。本发明实施例对此不做赘述。
91.需要说明的是:本发明实施例所记载的技术方案之间,在不冲突的情况下,可以任意组合。
92.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。