掌桥专利:专业的专利平台
掌桥专利
首页

一种基于逐级逼近的像素填充率测试方法

文献发布时间:2023-06-19 19:38:38


一种基于逐级逼近的像素填充率测试方法

技术领域

本发明属于图形测试技术领域,具体涉及一种基于逐级逼近的像素填充率测试方法。

背景技术

像素填充率是指图形处理单元在每秒内所渲染的像素数量,单位是MPixel/S(每秒百万像素),或者GPixel/S(每秒十亿像素),是用来度量当前显卡的像素处理性能的最常用指标。显卡的渲染管线是显示核心的重要组成部分,是显示核心中负责给图形配上颜色的一组专门通道。渲染管线越多,每组管线工作的频率越高,所绘出的显卡的填充率就越高,显卡的性能就越高,因此可以从显卡的像素填充率上大致判断出显卡的性能。

现有像素填充率的测试一般采用计算的方式,主要包括以下两类,一种是采用像素填充率理论值公式进行计算,即由光栅化处理单元(Raster Operations Units,ROP)与GPU主频进行乘积运算得到像素填充率,这类方法存在的问题是光栅化处理单元的数量是标称值通过软件无法测量获取,此外需要通过机台测试获取GPU主频;另一种是采用软件测量像素填充率经典公式进行计算,即由复杂测试场景、帧速率及修正系数进行乘积运算得到像素填充率,这类方法存在的问题是测试场景引入的复杂光影效果在不同参数下对像素填充效果影响的程度不同,并且修正系数随测试环境而改变。

综上所述,现有像素填充率的测试方法主要存在以下问题:一是由测试过程依赖于机台测试或标称值所导致的测试结果不可靠的问题,二是由测试环境对测试结果干扰较大所导致的测试结果不准确的问题。

发明内容

有鉴于此,本发明提供了一种基于逐级逼近的像素填充率测试方法,实现了基于软件的GPU像素填充率的测试。

本发明提供的一种基于逐级逼近的像素填充率测试方法,包括以下步骤:

步骤1、在被测平台上创建测量窗体,并将测量窗体设置为全屏模式,获取此时测量窗体的窗口大小;构建平面图形,覆盖测量窗体整个窗口的平面图形的数量为图形数量;确定测量窗体显示窗口的窗口像素数量;

步骤2、以2为底、图形数量为指数的计算结果作为当前轮所要绘制的平面图形的第一图形数量,将第一图形数量的平面图形绘制到测量窗体内,获取绘制过程中的帧速率作为当前轮的第一帧速率;计算第一图形数量、窗口像素数量及第一帧速率三个量的乘积作为当前轮测得的第一像素填充率;

步骤3、监测被测平台的CPU占用率,若当前CPU占用率与CPU平均占用率的偏差值大于性能阈值则将当前轮的第一图形数量记为极值图形数量并执行步骤4,否则以当前轮的第一图形数量作为图形数量执行步骤2;

步骤4、以第一像素填充率的最大值所对应的图形数量作为基准图形数量,以极值图形数量与基准图形数量的差值为偏移量,确定图形数量的变化范围为基准图形数量与偏移量之差到基准图形数量与偏移量之和的区间;以设定的步长在变化范围内遍历确定第二图形数量,并将第二图形数量的平面图形绘制到测量窗体内,获取绘制过程中的帧速率作为第二帧速率,计算第二图形数量、窗口像素数量及第二帧速率三个量的乘积作为第二像素填充率;将第二帧速率的最大值作为测试结果输出,结束本流程。

进一步地,所述步骤1还包括:当显卡支持像素屏蔽功能时将测量窗体显示窗口裁剪为正方形,并确定测量窗体显示窗口的窗口像素数量。

进一步地,所述步骤1中的所述平面图形为平行四边形。

进一步地,所述平行四边形采用由三角带绘制函数构建的两个三角形组成。

进一步地,所述步骤2还包括:将第一图形数量的平面图形的相邻帧数据中具有相同显示位置的像素点设置为不同颜色。

进一步地,所述步骤3还包括:计算当前轮的第一图形数量与窗口像素数量的乘积,若该乘积大于存储阈值则将当前轮的第一图形数量记为极值图形数量并执行步骤4,否则以当前轮的第一图形数量作为图形数量执行步骤2,所述存储阈值为内存与显存容量之和的四分之一。

进一步地,所述步骤4中的所述步长为1。

有益效果

本发明通过在构建测试场景中使用被测GPU执行渲染操作,获取执行过程中的测试场景与帧速率,通过使测试场景的数据量逐级递增以逐渐逼近被测GPU渲染性能的极限值,进而测得被测GPU像素填充率的实际最大值,提高了像素填充率测试结果的准确性。

附图说明

图1为本发明提供的一种基于逐级逼近的像素填充率测试方法的流程图。

具体实施方式

下面结合附图并举实施例,对本发明进行详细描述。

本发明提供了一种基于逐级逼近的像素填充率测试方法,其核心思想是:构建测试场景,在测试场景中使被测GPU执行渲染操作,获取测试中的测试场景与帧速率,采用测试场景与帧速率进行乘积运算得到像素填充率,通过使测试场景的数据量逐级递增以逐渐逼近被测GPU的渲染性能的极限值,从而测得被测GPU像素填充率的实际最大值。

本发明提供的一种基于逐级逼近的像素填充率测试方法,其流程如图1所示,具体包括以下步骤:

步骤1、在被测平台上创建测量窗体,并将测量窗体设置为全屏模式运行,获取全屏模式时测量窗体的窗口大小;构建平面图形,绘制多个平面图形以覆盖测量窗体整个窗口,此时平面图形的数量即为图形数量;根据投影变换关系,绘制的多个平面图形的覆盖区域恰好与屏幕分辨率相同,因此渲染该覆盖区域所需填充的像素个数也与屏幕分辨率相同,由此确定测量窗体显示窗口的窗口像素数量。被测平台为搭载了被测GPU的计算机系统。

帧速率是指每秒钟刷新的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,或刷新一帧所需时间的倒数。在实际的窗体刷新过程中,窗体刷新时间等于CPU维持窗体的时间与GPU渲染窗体内显示内容的时间之和,而像素填充率则直接与GPU渲染窗体内显示内容的时间相关。随着窗体的增大,窗体内显示数据逐渐增多,GPU所需渲染的计算量也会相应增大,而CPU维持窗体的时间保持不变,因此在这一过程中GPU渲染窗体内显示内容的时间将逐渐成为影响窗体刷新时间的优势项,其作用将远超过CPU维持窗体的时间,由此可知帧速率与渲染速度正相关。通过上述分析本发明确定了需要在尽量增大窗体,即尽可能增大分辨率的情况下进行测量的方案。

其中,通过查询系统支持的分辨率,并选取其中最大的窗口即可确定全屏模式时的窗口大小。

为进一步地提高测试效率,当显卡支持像素屏蔽功能时可不以全屏模式运行测量窗体,而是利用像素屏蔽功能将测量窗体显示窗口裁剪为正方形,并确定测量窗体显示窗口的窗口像素数量。由于显示窗口为正方形,行列方向上投影相同,因此避免了处理变形引入的多余计算,进而提升了测试效率。通过判断显卡驱动的像素屏蔽API即可得知该显卡是否支持像素屏蔽功能。

为进一步地提升测试性能,采用平行四边形作为平面图形,由于平行四边形能够覆盖测量窗体的整个窗口,因此着色器能够整行整列地进行填充,而这是其他图形所不能实现的,由此就可避免由规避未被覆盖的区域所导致的额外计算开销。具体来说,可采用DirectX、OpenGL、OpenGL ES、Vulkan、Metal等提供的三角带绘制函数构建由两个三角形组成的平行四边形作为平面图形;也可采用四边形绘制函数直接构建平行四边形作为平面图形。

在采用平行四边形作为平面图形的基础上,为将其他显示要素对测量结果的影响降到最低,本发明采用OpenGL API创建测量窗体,由于OpenGL函数直接将数据绘制到由窗体提供的设备上下文中因此能够减少其他因素的影响。

步骤2、以2为底、图形数量为指数的计算结果作为当前轮所要绘制的平面图形的第一图形数量,将第一图形数量的平面图形绘制到测量窗体内,获取绘制过程中的帧速率作为当前轮的第一帧速率;计算第一图形数量、窗口像素数量及第一帧速率三个量的乘积,乘积结果即为当前轮测得的第一像素填充率。

此外,本发明采用将相邻帧数据中具有相同显示位置的像素点设置为不同颜色的方式,以避免编译器优化功能将循环中不变化的值作为冗余量清除所导致的无法调用渲染单元渲染像素点的问题。

进一步地,本发明通过关闭消隐功能,以避免消隐功能所导致的被遮挡的平面图形不被渲染从而达不到增加渲染数量的问题。

为进一步提升获取到的当前轮帧速率的准确率,采用绘制过程中多次获取帧速率求平均值作为当前轮帧速率的方式。

步骤3、监测被测平台的CPU占用率,计算当前CPU占用率与CPU平均占用率的偏差值,当偏差值大于性能阈值时则将当前轮的第一图形数量记为极值图形数量并执行步骤4,否则以当前轮的第一图形数量作为图形数量执行步骤2完成粗粒度的图形数量的增加。

本发明还提供了以下方式:计算当前轮的第一图形数量与窗口像素数量的乘积,若该乘积大于存储阈值则将当前轮的第一图形数量记为极值图形数量并执行步骤4,否则以当前轮的第一图形数量作为图形数量执行步骤2。理想情况下,存储阈值可设置为内存与显存容量之和的四分之一。

步骤4、选取步骤2得到的所有轮的第一像素填充率中的最大值,以该最大值所对应的图形数量作为基准图形数量;以极值图形数量与基准图形数量的差值为偏移量,确定细粒度测试的图形数量的变化范围为基准图形数量与偏移量的差到基准图形数量与偏移量的和;以设定的图形数量变化步长在变化范围内遍历确定需要使用的第二图形数量,并将第二图形数量的平面图形绘制到测量窗体内,获取绘制过程中对应的帧速率作为第二帧速率,计算第二图形数量、窗口像素数量及第二帧速率三个量的乘积作为第二像素填充率;选取得到的所有第二帧速率中的最大值作为测试结果输出,结束本流程。

实施例

本实施例中采用本发明提供的一种基于逐级逼近的像素填充率测试方法,基于OpenGL提供的接口实现了基于软件的GPU像素填充率的测试过程,具体包括以下步骤:

S1、在被测平台上创建测量窗体,并将测量窗体设置为全屏模式运行,获取全屏模式时测量窗体的窗口大小。

S2、采用OpenGL的三角带绘制函数构建由两个三角形组成的平行四边形作为平面图形,绘制多个平面图形以覆盖测量窗体整个窗口,确定图形数量及测量窗体显示窗口的窗口像素数量。

具体过程为采用OpenGL API定义三角带数据:

float vertices[] = {

      // positions             // colors

         1.0f, 1.0f, 0.0f,   1.0f, 0.0f, 0.0f,   // top right

         1.0f, -1.0f, 0.0f,   0.0f, 1.0f, 0.0f,   // bottom right

        -1.0f, -1.0f, 0.0f,   0.0f, 0.0f, 1.0f,   // bottom left

        -1.0f, 1.0f, 0.0f,   1.0f, 1.0f, 0.0f,   // top left

};

将数据绑定到显存:

glBindBuffer(GL_ARRAY_BUFFER, VBOs);

glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

实现三角带的绘制:

glBindVertexArray(VBOs);

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

S3、修改片元着色器代码中的从外部引入的随机量,使每次执行着色器时该随机量都取不同值,将该随机量直接作用于像素颜色输出,实现不同帧中相同位置像素点的颜色均不同。

实现代码如下所示:

                      "#version 330 core\n"

                      "uniform vec4 deltaColor;\n"

                      "out vec4 FragColor;\n"

                      "in vec4 vertexColor;\n"

                      "void main(void)\n"

                      "{\n"

                      "    FragColor = vertexColor+deltaColor;\n"

                      "}\n\0";

S4、采用OpenGL的glDisable(GL_CULL_FACE)方法关闭消隐功能。

S5、以2为底、图形数量为指数的计算结果作为当前轮所要绘制的平面图形的第一图形数量,将第一图形数量的平面图形绘制到测量窗体内,获取绘制过程中的帧速率作为当前轮的第一帧速率;计算第一图形数量、窗口像素数量及第一帧速率三个量的乘积,乘积结果即为当前轮测得的第一像素填充率。

S6、监测被测平台的CPU占用率,计算当前CPU占用率与CPU平均占用率的偏差值,当偏差值大于性能阈值时则将当前轮的第一图形数量记为极值图形数量并执行S7,否则以当前轮的第一图形数量作为图形数量执行S5完成粗粒度的图形数量的增加。

S7、选取S5得到的所有轮的第一像素填充率中的最大值,以该最大值所对应的图形数量作为基准图形数量;以极值图形数量与基准图形数量的差值为偏移量,确定细粒度测试的图形数量的变化范围为基准图形数量与偏移量的差到基准图形数量与偏移量的和;以图形数量为1作为步长在变化范围内以逐步增加或减少1个的方式选择对应的图形数量作为第二图形数量,并将第二图形数量的平面图形绘制到测量窗体内,获取绘制过程中对应的帧速率作为第二帧速率,计算第二图形数量、窗口像素数量及第二帧速率三个量的乘积作为第二像素填充率;选取得到的所有第二帧速率中的最大值作为测试结果输出,结束本流程。

综上所述,以上仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

相关技术
  • 基于多分辨率小波逼近的单像素光子计数三维成像系统及方法
  • 基于多分辨率小波逼近的单像素光子计数三维成像系统及方法
技术分类

06120115981435