gpu跑分-glmark2详解
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
推荐阅读
-
起步5.29万,最高下调3.7万!朗逸、凌尚、思域等五款车便宜了
售价起步5.29万,最高已经下调3.7万,降幅力度几乎翻了一倍。大众朗逸、丰田凌尚、本田思域、大众ID3,荣威i5,每一款轿车颜值非常高,口碑也是不错。现在价格战打的非常激烈,考虑买轿车的同学,可别急着划走。第一台车大众朗逸,最大降幅比例26%,最高下调2.81万,裸车起步7.49万,顶配12.49...
-
#有大汽会高升
夜幕笼罩着古老的城镇,朱瞻基漫步在寂静的街道上,冷风呼啸吹得他的衣角翻飞。他来到了一座废弃的大厦前,这座大厦曾经是一家精神病院,如今却被时间遗忘。朱瞻基听说这里经常传出奇怪的声音,有人说在晚上还能看到诡异的身影,他决定深入这座大厦揭开其中的秘密。当他推开那扇摇摇欲坠的大门时,一股陈旧的气息扑面而来。...
-
10万买7座SUV?!体验第二代长安X7PLUS!空间灵活,颜值扛打…
在紧凑型SUV市场上,如果一个品牌单靠一款产品是无法在这细分市场占有领先地位。在长安品牌里面,第二代X5PLUS是主打年轻运动,那么全新升级而来的第二代X7PLUS就是瞄准新组建的家庭用户而设定。针对当下用户用车需求,新的X7PLUS在外观和车内空间做了不少升级,接下来的静态体验将会带大家了解这款新...
-
5月26日车圈早报:魏建军周末开直播 奇瑞RUN圆满收官
今日,长城汽车董事长将驾驶新一代哈弗H6,开启一场“魏建军的周末”直播,带您云游河北保定,一起见证保定的自然人文风光和新一代哈弗H6的产品魅力。车市红点:新一代哈弗H6的预热,从魏建军董事长开始!昨日回顾:奇瑞RUN圆满收官5月25日,奇瑞集团举行了奇瑞RUN——“在一起去远方奔向星纪元”活动,在芜...