simple-framework(MaliSDK框架分析)

simple-framework(Mali SDK框架分析)

1.所有的定义及实现放在同一个命名空间中,文件包含#include一般在命名空间的外面。总的命名空间为namespace MaliSDK{};使用时using namespaceMaliSDK包含所有命名空间中的内容。

2.头文件中定义类型,并用#ifndef,#define, #endif来防止多次包含的问题,在对应的.cpp文件中实现。定义与实现相分离。

各文件功能:

1. VectorTypes.h:在该文件中定义了向量类型,用自定义的结构体类型实现。主要有Vec2,Vec3,Vec4表示整型的2,3,4维向量,用来存放坐标等数据。同理,Vec2f, Vec3f, Vec4f表示浮点的向量。没有对应的.cpp文件,只在.h文件中单纯的定义类型。

2. Platform.h:定义抽象基类Platform。然后通过公有继承产生三个针对具体平台的子类WindowsPlatform;DesktopLinuxPlatform;LinuxOnARMPlatform。

2.1 抽象基类中定义静态的可变参数成员函数log(const char* format, ...)来打印日志信息,间接组合成GL_CHECK(x)检测gl函数的返回值。

voidPlatform::log(const char*format, ...)

{   va_list ap;

va_start (ap, format);     //ap指向可变参数首地址

vfprintf (stderr, format, ap);//主要发挥作用

fprintf (stderr, "\n");

va_end (ap);

}

#defineGL_CHECK(x) \

x; \ //先返回值,然后在块语句中进行错误检查和处理

{ \

GLenum glError = glGetError(); \

if(glError!= GL_NO_ERROR) { \

LOGD("glGetError()= %i (0x%.8x) at %s:%i\n", glError, glError, __FILE__, __LINE__); \

exit(1); \

} \

}

2.2 LOGD宏来打印调试信息。如果定义了DEBUG则打印调试信息,否则不打印

用法举例:

LOGD("vertexShaderID= %d", vertexShaderID);

//文中定义如下:

#ifdef DEBUG

#define LOGD fprintf(stderr, "Debug: "); Platform::log

#else

#define LOGD

共有三类打印信息的宏定义:

#define LOGIPlatform::log  LOGI用来打印正常的信息

#define LOGEfprintf (stderr, "Error: ");Platform::log   LOGE用来打印错误的信息

LOGD宏来打印调试信息。

2.3 static Platform* getInstance(void);根据不同的平台调用相应平台的getInstance函数,返回一个指向派生类对象的基类指针;通过基类指正的虚函数和多态性进行调用子类的virtual voidcreateWindow(int width, int height);virtual void destroyWindow(void);virtual WindowStatus checkWindow(void);具体实现方法。

3. LinuxOnARMPlatform:基于ARM的Linux平台的类。针对平台环境具体实现了三个虚函数。

通过fbdev_window结构来创建窗口。

4. DesktopLinuxPlatform类:基于Linux平台的类。针对平台环境具体实现了三个虚函数。

5. WindowsPlatform类:基于Windows平台的类。针对平台环境具体实现了三个虚函数。

6. EGLRuntime类:主要管理和配置EGL相关的接口调用。类中全部使用静态变量。配置显示环境。

configAttributes[]:指定config属性列表,是我们指定的需求属性配置,主要有RGBA,buffer,深度缓存大小,渲染类型,反走样采样点的大小配置。

contextAttributes[]:上下文属性列表,主要是指定OpenGL es 的版本。

windowAttributes[]:窗口属性列表。指定渲染表面是前台缓存区还是后台缓存区。

initializeEGL函数:通过一系列的EGL接口调用配置一个可显示窗口环境。

eglGetDisplay:创建和初始化与本地EGL显示的连接,打开与EGL显示服务器的连接。

eglInitialize:成功的打开连接后,需要初始化EGL。

eglChooseConfig:查询底层窗口系统支持的所有EGL表面配置,通过configAttributes []指定的需求,EGL返回最佳的配置列表。首先返回最佳配置的个数,然后分配空间存储返回分配置列表数组。然后选择RGB,深度最匹配的配置。

eglCreateWindowSurface:根据最匹配的配置,在屏幕上创建渲染区域。

eglCreateContext:创建渲染上下文。

eglMakeCurrent:制定EGLcontext为当前上下文。

eglSwapBuffers:交换前台和后台缓存区。

terminateEGL函数:结束时的清理工作。

7. Shader类:用于创建和编译一个着色器对象。

loadShader:通过文件形式加载着色器源代码到字符数组或者字符指针中。

processShader:创建着色器对象,提供着色器源码,编译着色器,查看着色器的编译状态。如果编译失败,则打印着色器源码和着色器编译的日志信息。

8. Matrix类:和矩阵相关的类,定义常用举证和常用举证操作,比如平移,旋转,缩放,乘法,正投影变换举证,透视投影变换矩阵,转置,逆矩阵等。(矩阵列主序

identityArray:类中一个静态的单位矩阵。

degreesToRadians:角度转弧度。

multiply或者*:矩阵乘法,列主序。

getAsArray:返回一个指向矩阵元素的指针。

matrixScale:对矩阵的每一个元素同时乘以一个缩放因子。

createScaling:创建缩放矩阵。

createTranslation:创建平移矩阵。

matrixPerspective:创建Perspective矩阵。

matrixOrthographic:创建Ortho矩阵。

createRotationX,createRotationY,createRotationZ:绕X轴,Y轴,Z轴旋转。

vertexTransform:顶点向量矩阵相乘。

print:打印矩阵元素。

matrixTranspose:矩阵转置。

matrixDeterminant:按第一行展开求3x3 或者4x4矩阵行列式的值。

matrixInvert:用伴随举证求矩阵的逆矩阵。

9. Timer类:提供了一个高精度的定时器类,采用硬件定时器,计数器来达到平台独立计时,分为Linux版和Windows版,主要分析Windows版本。

reset:置位当前时间戳为计数器转化的当前时间。

getTime:当前时间和reset时的时间戳之间的时间差值。

getInterval:当前时间和上次时间间隔节点之间的时间差值。

getFPS:每隔一秒计算一次Frames Per Second。

isTimePassed:产生一定的时间间隔。默认为1秒。

阅读:

原型:BOOLQueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

作用:返回硬件支持的高精度计数器的频率。

返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。

在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。

10. ETCHeader类:从ETC压缩纹理中获取ETC文件头的信息。.pkm文件格式的文件头共有16个字节,其中前6个字节用来说明文件格式名字,版本类型。7,8字节为空字节。8,9压缩纹理宽度的最高最低有效位,10,11为压缩纹理高度的最高最低有效位。12,13原始纹理宽度的最高最低有效位,14,15为原始纹理高度的最高最低有效位。

getWidth:原始纹理的宽度。    getHeight:原始纹理的长度。

getPaddedWidth:压缩纹理的宽度。getPaddedHeight:压缩纹理的长度。

getSize:压缩纹理的尺寸,以字节为单位。(ETC1每个像素4位,ETC2中有4或者8位)

11. Texture类:使用纹理。

getCompressedTextureFormats:获取支持的压缩纹理格式和数量。

isETCSupported:判断是否支持ETC纹理压缩,并打印支持纹理信息和数量等关键信息。

loadData:从文件中读取数据,可以读取压缩或者未压缩纹理数据。

createTexture:用随机数据创建一幅指定大小的纹理图像。(RGBA四通道

createTexture:还可用来生成单通道纹理。(R单通道)

deleteTextureData:删除createTexture生成的纹理图像。

loadPKMData:从.pkm压缩纹理图像中提取ETC压缩纹理文件头16字节,提取纹理数据,返回指向纹理数据的指针。

loadCompressedMipmaps:自动加载各类级别的mipmap压缩纹理。从level0到最大级别,通过glCompressedTexImage2D依次加载绑定到不同的mipmap的压缩纹理级别上。

12. Text类:使用纹理绘制ANSI可显示字符。每个字符的大小为8*16个像素。字体大小的缩放倍数scale 默认设置为1.0,其他比较合理的取值范围为0.75-3.0。

13. Geometry类:用于生成几何形状,主要产生圆环,球的顶点数据,立方体,矩形的顶点数据和法向量。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-17 02:16:33

simple-framework(MaliSDK框架分析)的相关文章

(转)simple-framework(MaliSDK框架分析)

 出自:http://blog.csdn.net/u013467442/article/details/46940501 simple-framework(Mali SDK框架分析) 1.所有的定义及实现放在同一个命名空间中,文件包含#include一般在命名空间的外面.总的命名空间为namespace MaliSDK{}:使用时usingnamespaceMaliSDK包含所有命名空间中的内容. 2.头文件中定义类型,并用#ifndef,#define, #endif来防止多次包含的问题,在对

Entity Framework 实体框架的形成之旅--利用Unity对象依赖注入优化实体框架(2)

在本系列的第一篇随笔<Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)>中介绍了Entity Framework 实体框架的一些基础知识,以及构建了一个简单的基于泛型的仓储模式的框架,例子也呈现了一个实体框架应用的雏形,本篇继续介绍这个主题,继续深化介绍Entity Framework 实体框架的知识,以及持续优化这个仓储模式的实体框架,主要介绍业务逻辑层的构建,以及利用Unity和反射进行动态的对象注册. 1.EDMX文件位置的调整 我们从上篇例子,

(七) UVC框架分析

title: UVC框架分析 date: 2019/4/23 19:50:00 toc: true --- UVC框架分析 源码的位置在drivers\media\video\uvc,查看下Makefile,我们可以从入口uvc_driver.c中分析 uvcvideo-objs := uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o uvc_ctrl.o uvc_status.o uvc_isight.o uvc_debugfs.o ifeq ($

Google Test测试框架分析

Google Test测试框架分析 一.简介 Google Test是由Google主导的一个开源的C++自动化测试框架,简称GTest.GTest基于xUnit单元测试体系,和CppUint类似,可以看作是JUnit.PyUnit等对C++的移植. 下图是GTest测试框架的测试过程,表示的是GTest的两种测试方式. 下面将使用一个极其简单的例子表示xUnit测试的主要过程.如对Hummer的CTXString类的成员方法GetLength进行测试.详见下面GTest代码和注释说明. //

Android Bitmap 开源图片框架分析(精华三)

主要介绍这三个框架,都挺有名的,其他的框架估计也差不多了 Android-Universal-Image-Loaderhttps://github.com/nostra13/Android-Universal-Image-Loader ImageLoaderhttps://github.com/novoda/ImageLoader Volley(综合框架,包含图片部分)https://github.com/mcxiaoke/android-volley 扯淡时间,可以跳过这段这些开源框架的源码还

Android Bitmap 开源图片框架分析(精华四)

disk缓存主要难点在于内存缓存,disk缓存其实比较简单,就是图片加载完成后把图片文件存到本地方便下次使用 同样,先贴一下官方主页的介绍(主页地址见文章最开始处)和内存缓存差不多,根据算法不同提供了几种类别,可以自行通过ImageLoaderConfiguration.discCache(..)设置<ignore_js_op> 硬盘缓存,保存是以文件的形式框架提供了4种类型,具体算法规则不同,看名字我们大概也能知道对应意思 UnlimitedDiscCache                

Entity Framework 实体框架的形成之旅--为基础类库接口增加单元测试,对基类接口进行正确性校验(10)

本篇介绍Entity Framework 实体框架的文章已经到了第十篇了,对实体框架的各个分层以及基类的封装管理,已经臻于完善,为了方便对基类接口的正确性校验,以及方便对以后完善或扩展接口进行回归测试,那么建立单元测试就有很大的必要,本篇主要介绍如何利用VS创建内置的单元测试项目进行实体框架的基类接口测试. 在采用单元测试这个事情上,很多人可能想到了NUnit单元测试工具和NMock工具进行处理,其实微软VS里面也已经为我们提供了类似的单元测试工具了,可以不需要使用这个第三方的单元测试工具,经试

Entity Framework 实体框架的形成之旅--Code First的框架设计(5)

在前面几篇介绍了Entity Framework 实体框架的形成过程,整体框架主要是基于Database First的方式构建,也就是利用EDMX文件的映射关系,构建表与表之间的关系,这种模式弹性好,也可以利用图形化的设计器来设计表之间的关系,是开发项目较多采用的模式,不过问题还是这个XML太过复杂,因此有时候也想利用Code First模式构建整个框架.本文主要介绍利用Code First 来构建整个框架的过程以及碰到的问题探讨. 1.基于SqlServer的Code First模式 为了快速

Linux输入子系统框架分析(1)

在Linux下的输入设备键盘.触摸屏.鼠标等都可以用输入子系统来实现驱动.输入子系统分为三层,核心层和设备驱动层,事件层.核心层和事件层由Linux输入子系统本身实现,设备驱动层由我们实现.我们在设备驱动层将输入事件上报给核心层input.c,核心层找到匹配的事件层,将事件交给事件层处理,事件层处理完后传递到用户空间. 我们最终要搞清楚的是在用户空间调用open和read最终在内核中是怎样处理的,向内核上报的事件又是谁处理的,处理完后是怎样传递到用户空间的? 上面两个图是输入子系统的框架. 下面