glmark2代码分析2(代码结构)

本文介绍了代码结构,包含src、data、doc等目录及各文件功能,还提及依赖库和编译脚本。测试模块以scene为用例,按特定顺序执行。阐述了主要数据结构和关系,如MainLoop中的scene_和benchmarks_,并说明了主要类关系,如MainLoop类。

代码结构

代码目录:
├── src
│ ├── android.cpp Anroid平台的入口
│ ├── benchmark-collection.* benchmake的处理,程序运行的benchmark有不同的方式,可以来自文件(运行参数有这个选项)或配置选择。
│ ├── scene-default-options.cpp 对接benchmark中的scene,setup options
│ ├── benchmark.* benchmark类,用来处理scene的
│ ├── canvas-* 继承自Canvas类,按照Android和非Android分,做OpenGL绘制前的初始化。
│ ├── canvas.h Canvas类
│ ├── default-benchmarks.h 运行的bench,每个bench来自scene,有不同的配置。
│ ├── gl-headers.* OpenGL版本和扩展的判断 support 函数
│ ├── gl-state-* 不同窗口系统egl/glx/wgl的OpenGL初始化和配置封装
│ ├── gl-visual-config.* 计算和选择窗口的配置 GL visual
│ ├── main.cpp 入口函数
│ ├── main-loop.* 主循环
│ ├── mesh.* 将顶点和相关的属性封装成mesh类,处理范围包括:vbo和draw
│ ├── model.* 处理model目录下的模型文件,加载解析3ds和obj文件,转换顶点、计算法向量和纹理坐标等。
│ ├── native-state-* NativeState基类,根据不同的桌面窗口系统:dispmanx/drm/mir/wayland/win32/x11
│ ├── options.* 运行时参数的解析和管理
│ ├── scene.* 各个运行测试模块的管理
│ ├── scene-* 具体各个测试用例场景构建
│ ├── scene-clear.cpp scene的一个模板,空的什么也没有做
│ ├── scene-collection.h 初始化管理所有的scene,将他们串起来
│ ├── shared-library.* SharedLibrary类,给窗口系统用,来加载和使用GL的库。在Android平台下使用,x11不用。
│ ├── text-renderer.* main-loop中绘制fps和title的纹理
│ ├── image-reader.* png/jpeg图片进行统一管理,抽象成ImageReader类
│ ├── texture.* 纹理贴图的封装,纹理数据读取来自ImageReader类
│ ├── wscript_build 二级编译脚本
│ ├── include 系统的头文件:dirent.h、getopt.h、sys/time.h
│ ├── libjpeg-turbo 依赖库
│ ├── libmatrix 实现的一个矩阵操作库
│ ├── libpng 依赖库
│ ├── glad glad2
│ └── zlib 依赖库
├── data
│ ├── models 存放模型文件3ds.obj.jobj
│ ├── shaders 存放shader文件
│ ├── textures 存放纹理照片
│ └── wscript_build 二级编译脚本
├── doc
│ ├── glmark2.1.in 用来生成说明文件man
│ └── wscript_build 二级编译脚本
├── INSTALL 安装说明
├── README 说明
├── waf 编译工具
├── waflib 编译工具
└── wscript 编译脚本

测试模块

测试的用例用为一个scene,每个scene可以配置不同option为一个测试项目,运行glmark默认包含的scene有:
buffer
build
bump
conditionals
desktop
effect2d
function
ideas
jellyfish
loop
pulsar
refract
shading
shadow
terrain
texture
是按照 default-benchmarks.h 中定义的顺序执行,比运行glmark --scene-list 列出所有的测试项少一个clear。
所有的scene在scene-collection.h文件中通过 add_scenes 添加到 scenes_ 集合中,这里比上面的 --scene-list中多添加一个DefaultOptions,添加的每个scene都有一个对应的cpp文件scene-*.cpp,scene-grid.cpp为中间文件。

主要数据结构和关系

用例存储主要是 class MainLoop 中的 scene_ 和 benchmarks_ ,benchmarks_ 是 MainLoop::step() 中从 benchmarks_ 中取出scene给 scene_

while (bench_iter_ != benchmarks_.end()) {
    scene_ = &(*bench_iter_)->scene();
    next_benchmark();
}
if (bench_iter_ != benchmarks_.end()) {
    before_scene_setup();
    scene_ = &(*bench_iter_)->setup_scene();
    after_scene_setup();
}

scene() 直接返回 Benchmark 中的 scene_
setup_scene() 给scene分佩 option ,option来自构造函数Benchmark::Benchmark(const string &s),每个Benchmark是单独的一个测试项来自 benchmark-collection 的 benchmarks_,benchmarks_ 的每一项来自三个方面:
1、通过运行命令中的参数“-b, --benchmark BENCH”获取option生成
2、通过运行命中的的参数“-f, --benchmark-file F”读文件生成
3、来自DefaultBenchmarks中的populate函数中定义的默认
其主要还是获取固定格式的options列表
load和setup就走到具体的scene中了。

Scene &
Benchmark::setup_scene()
{
    scene_.reset_options();
    load_options();

    scene_.load();
    scene_.setup();

    return scene_;
}

主要类关系说明

class MainLoop:

MainLoopValidation MainLoop # Canvas &canvas_ # Scene *scene_ # vector<Benchmark *> &benchmarks_ +reset() +step() +draw() +before_scene_setup() +after_scene_setup() MainLoopDecoration Canvas int width_ int height_ mat4 projection_ bool offscreen_ GLVisualConfig visual_config_ +init() +reset() +visible() +clear() +update() +write_to_file(string &filename) +should_quit() +resize() +offscreen() +visual_config(GLVisualConfig &config) CanvasGeneric CanvasAndroid Benchmark - Scene &scene_ - vector<OptionPair> options_ +Scene &scene() +Scene &setup_scene() void teardown_scene +register_scene(Scene &scene) Scene string name_ # map<std::string, Option> options_ double startTime_ double lastUpdateTime_ unsigned currentFrame_ bool running_ +load() +unload() +setup() +teardown() +update() +draw() +set_option() SceneBuild SceneTexture SceneGrid SceneBump SceneEffect2D ScenePulsar SceneDesktop SceneBuffer SceneConditionals SceneFunction SceneLoop SceneClear SceneShading SceneIdeas SceneTerrain SceneJellyfish SceneShadow SceneRefract
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值