gpu跑分-glmark2详解

admin 2024-11-22 114人围观 ,发现192个评论

glmark2是一个用于测试OpenGL性能的开源工具,可以用于评估GPU性能和OpenGL驱动程序的质量。glmark2通过运行一系列OpenGL场景来测试GPU的性能,测试结果包括帧率、顶点处理能力、纹理渲染能力、光照效果等。

原理

glmark2一共定义了16种场景,每个场景包含1~4测试case,主要是通过测试不同的参数得到不同的跑分结果,共有33个case。

每个case跑完后都会有对应的帧率(FPS),FPS对应跑分值,所有caseFPS的均值即为最终的跑分值:score=sum(FPS)/33。

[build]use-vbo=false:FPS:3512FrameTime:0.285ms[build]use-vbo=true:FPS:4496FrameTime:0.222ms[texture]texture-filter=nearest:FPS:4422FrameTime:0.226ms=======================================================glmark2Score:3181=======================================================

每个场景对应一个,该文件会加载data目录中对应的资源进行绘制。

编译

镜像源:()

环境:

步骤:可以参考INSTALL和文件,生成的文件在build/src中,包含glmark2、glmark2-drm、glmark2-wayland、glmark2-es、glmark2-es-drm、glmark2-es-wayland。

sudoaptinstallpython3-piplibjpeg-devpkg-configlibpng-devcmakelibx11-devlibdrm-devibgbm-devlibudev-devlibwayland-devwayland-protocolsninja-buildmesonsetupbuild-Dflavors=drm-gl,drm-glesv2,wayland-gl,wayland-glesv2,x11-gl,x11-glesv2sudomkdir/usr/local/share/glmark2glmark2./glmark2
参数

-b,--benchmarkBENCH:指定测试场景,glmark2-bxxx,xxx可以通过-l查看;

--validate:快速输出glmark2测试信息,包括测试场景、参数和OpenGL信息。

--frame-METHOD:每帧结束的方法,包括:default,none,swap,finish,readpixels。该参数会影响到跑分,finish即glFinish();swap即glXSwapBuffers(),会上屏;readpixels即glReadPixels().

--off-screen:渲染到离屏buffer中,不会在屏幕上显示图像。

--reuse-context:所有场景使用一个上下文,默认每个场景都使用自己的上下文

-s,--sizeWxH:设置窗口的宽高;

--fullscreen:窗口全屏显示模式;

-l,--list-scenes:列出所有可用的场景以及对应的参数;、

--show-all-options:显示所有场景参数值;

--run-forever:无限循环;

--annotate:on-screen窗口上显示FPS和参数信息;

-d,--debug:显示debug信息;

--visual-config:用于指定要使用的可视化配置文件;

-h,--help:显示help信息。

流程

流程

应用入口::main;

解析参数,默认窗口大小是800*600;

创建画布canvas,编译出的不同二进制使用了不同的实现,如glmark2-x11;glmark2-drm-drm;glmark2-wayland-wayland;

添加所有测试sences;

进入测试主函数do_benchmark。

do_benchmark实现

do_benchmark实现

填充场景,default-benchmarks中填充默认场景的字符串和参数,benchmark-collection会对字符串进行解析后构建Scene添加到benchmarks_中;

//添加默认场景字符串,用于后面解析staticvoidpopulate(std::vectorstd::stringbenchmarks){_back("build:use-vbo=false");_back("build:use-vbo=true");}//解析字符串,用:分割staticSceneget_scene_from_description(conststrings){Util::split(s,':',elems,Util::SplitModeNormal);}//把各个scene封装成Benchmark,用于后面遍历voidBenchmarkCollection::add(conststd::vectorstd::stringbenchmarks){for(std::vectorstd::string::const_iteratoriter=();iter!=();iter++){benchmarks_.push_back(newBenchmark(*iter));}}

启动循环进行绘制loop-step(),首先会从benchmarks中获取场景scene进行绘制,每个场景会运行10s中,然后把scene_-running变量更新为false停止运行,计算场景的score,最后切换到下一个benchmark场景next_benchmark()继续运行

boolMainLoop::step(){//获取场景while(bench_iter_!=benchmarks_.()){scene_=(*bench_iter_)-scene();}//设置scene_-running()=truescene_=(*bench_iter_)-setup_scene();if(scene_-running()!should_quit)//进行绘制,如果循环时间超过了10s,running=false停止绘制,否则一直循环drawdraw();if(!scene_-running()||should_quit){//单个scene绘制完成,计算score并统计运行场景个数score_+=scene_-average_fps();benchmarks_run_++;}//切换到下一个继续绘制next_benchmark();}}

绘制主要流程,先清空画布canvas,调用对应场景中的draw方法进行旋转等操作,然后调用update方法更新时间,如果超过了10s会把running变量赋值为false,最后画布更新,针对不同的frame_参数调用不同的结束方法,如glFinish、.swap()等。

//绘制方法voidSceneBuffer::draw(){LibMatrix::mat4model_view_proj(canvas_.projection());model_(0.0,0.0,-4.0);model_(45.0,-1.0,0.0,0.0);}//更新时间voidSceneBuffer::update(){Scene::update();priv_-wave-update(realTime_.elapsed());}//更新画布,结束一帧绘制voidCanvasGeneric::update(){Options::Framem=Options::frame_;switch(m){caseOptions::FrameSwap:gl_state_.swap();native_state_.flip();break;caseOptions::FrameFinish:glFinish();break;}
场景

场景

文件名

参数

build

scene-build

use-vbo=false

use-vbo=true

texture

scene-texture

texture-filter=nearest

texture-filter=linear

texture-filter=mipmap

shading

scene-shading

shading=gouraud

shading=blinn-phong-inf

shading=phong

shading=cel

bump

scene-bump

bump-rer=high-poly

bump-rer=normals

bump-rer=height

effect2d

scene-effect2d

kernel=0,1,0;1,-4,1;0,1,0

kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1

pulsar

scene-pulsar

light=false:quads=5:texture=false

desktop

scene-desktop

blur-radius=5:effect=blur:passes=1:separable=true:windows=4

effect=shadow:windows=4

buffer

scene-buffer

columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=map

columns=200:interleave=false:update-dispersion=0.9:update-fraction=0.5:update-method=subdata

columns=200:interleave=true:update-dispersion=0.9:update-fraction=0.5:update-method=map

ideas

scene-ideas

speed=duration

jellyfish

scene-jellyfish

default

terrain

scene-terrain

default

shadow

scene-shadow

default

refract

scene-refract

default

conditionals

scene-conditionals

fragment-steps=0:vertex-steps=0

fragment-steps=5:vertex-steps=0

fragment-steps=0:vertex-steps=5

function

scene-function

fragment-complexity=low

fragment-complexity=medium:fragment-steps=5

loop

scene-loop

fragment-loop=false:fragment-steps=5:vertex-steps=5

fragment-steps=5:fragment-uniform=false:vertex-steps=5

fragment-steps=5:fragment-uniform=true:vertex-steps=5

猜你喜欢
    不容错过