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
推荐阅读
-
欧拉好猫不香吗?为何要花12万买辆十年车龄的二手MINI
哈喽!大家好检车家老司机又和大家见面了,我是二手车检测师洋葱。因为我的名字和洋葱很相近,他们也经常错叫我洋葱,久而久之洋葱就这么来了,我曾经是一名汽车维修工,经过重重的磨练与考核成为检车家的一名专业的二手车检测师,竭力维护大家的购车风险是我存在的价值。这次洋葱我给大家带来的便是一台MINI的检测分享...
-
五问|理性体验雷克萨斯混动,关于ES300h你真的不了解
往往在说一件事情的时候,纸上谈兵相当容易,抱着一堆数据说的条条是道,而当你拥有此物的时候,所理解的又和之前说的不一样,想来也是阵阵脸疼。虽然雷克萨斯ES300h并不是今年的新车,但有关这辆混合动力车型,还是有很多值得去告诉大家的。有关ES300h的外观,不想用大篇幅来描述,纵观雷克萨斯这两年的车型,...
-
我有4台混动车!真香!15年的丰田混合动力车主真实体会分享
2006年,丰田普锐斯来到了我家,起初,我是一直是不屑这个其貌不扬的家伙的。我对这台车唯一有那么一点点好感的就是它在那个年代已经标配无钥匙进入和启动功能,我当时只有18岁,我只是觉得好神奇(原谅我的少见多怪)。和凯美瑞的合影看到思铂睿混动了吧,如果各位有兴趣,我也可以讲讲丰田和本田的混合动力的区别欢...
-
东风开打价格战!新SUV风神L7卖12.49万!比吉利的L7更帅?
车市新贵,东风风神L7的崛起之路亲民实惠的价格是王牌业内人士指出,风神L7的定价策略非常精明。一方面,这个价位足以吸引大批追求高性价比的消费群体;另一方面,也给予了该车型在产品力方面有足够发挥空间。风神L7并非廉价车型,其产品实力完全可以与合资品牌的同级别车型一较高下。这种"高性价比"的定位,使其在...