基于Android/ target=_blank class=infotextkey>安卓平台的 OpenGL(http://androidxref.com/9.0.0_r3/),实现功能的鸿蒙化迁移和重构,全球首发鸿蒙平台的 OpenGL-ISRC,代码已经开源,欢迎各位下载使用并提出宝贵意见!
文章插图
开源代码:
https://gitee.com/iscas-ohos/OpenGL_ISRC/tree/main
01背景OpenGL(Open Graphics Library)是用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口(API),可绘制从简单的图形到复杂的三维景象,操作在 GPU 之上,实现硬件加速渲染。
目前,Microsoft、SGI、IBM、DEC、SUN、HP 等大公司都采用了 OpenGL 做为三维图形标准 。
著名的动画制作软件 Soft Image 和 3D Studio MAX、仿真软件 Open Inventor、VR 软件 World Tool Kit、CAM 软件 ProEngineer、GIS 软 ARC/INFO 等等都是以 OpenGL 为基础制作完成的 。
OpenGL 是个与硬件无关的软件接口,可以在不同的平台之间移植 。
OpenGLES 是 OpenGL 的高性能版本,删减了其中的低效能的操作方式,Android 就是使用的这种标准,因此鸿蒙平台的 OpenGL-ISRC 也是使用的这种标准 。
02鸿蒙 OpenGL-ISRC 的结构
文章插图
①Android 的 OpenGL 库
文章插图
②Harmony 的 OpenGL-ISRC 库
文章插图
③Harmony 的 OpenGL 库
由图 1,OpenGL 库对比可知,OpenGL-ISRC 整体的结构和 Android OpenGL 类似 。
【全球首发:鸿蒙开源平台OpenGL】不同之处在于 OpenGL-ISRC 由两个包组成,分别是 android.opengl 和 ohos.opengl 。
android.opengl 里放置的是目前支持版本的 OpenGLES 标准,ohos.opengl 放置的是常用的图像处理类 。且类的数量少于 Android 的 OpenGL 。
下面对这几点给出解释:
①为什么其中一个包名是 android.opengl?
采用 C++ 实现接口的方式,通过 so 库的调用实现接口的调用 。对于目前支持版本的 OpenGLES 标准这部分,Android 已经开源了其生成的 so 库 。
为了避免功能重复开发,此处直接使用 Android 的 so 库,因此包名必须是 android.opengl 。
②OpenGL-ISRC 为什么由两个包组成?
对于图像处理类的实现,若继续采用 Android so 库调用的方式,需要将图像处理类放置于 android.opengl 包下 。
此时运行鸿蒙环境,会出现方法声明重复的错误,见图 2,表明图像处理类中的方法与鸿蒙底层存在的某些方法存在冲突,因此继续使用 Android so 库调用的方式不再可行 。
文章插图
图 2:图像处理类放置于 android.opengl 包下的报错情况
在 OpenGL-ISRC 中,图像处理类这一部分,依旧采用 C++ 实现接口,通过 so 库调用实现接口调用的方式 。
与 android.opengl 里的类不同的是,我们对图像处理的类的接口进行了鸿蒙化的移植重构,生成了全新的 so 库进行调用,适配了鸿蒙底层的环境,也避免了此处对安卓的依赖 。
③OpenGL-ISRC 为什么缺少 EGL 类?
鸿蒙 SDK 自带 OpenGL 库,见图1.(3),内部含有 EGL 类 。OpenGL-ISRC 是基于鸿蒙平台,所以直接使用了鸿蒙 SDK 自带 OpenGL 库的 EGL 类,避免了功能的重复开发 。
④OpenGL-ISRC 中的 GLSuefaceprovider
OpenGL-ISRC 中的 GLSuefaceProvider 在功能上和 Android 的 GLSurfaceView 相同 。
因为鸿蒙中的 SurfaceView 命名为 SuefaceProvider,根据命名一致原则,OpenGL-ISRC 中的 GLSurfaceView 命名为 GLSuefaceProvider 。
03与鸿蒙 SDK OpenGL 的区别
OpenGL-ISRC 是鸿蒙开源系统的功能相对完整的 OpenGL ES 库 。从使用上来说,OpenGL-ISRC 具有较大的独立性,与鸿蒙 SDK OpenGL 在实现方式、完善程度、功能提供等方面都存在较大不同 。
①OpenGL-ISRC 采用 C++ 实现接口,通过 so 库调用实现接口调用的方式,而鸿蒙 SDK OpenGL 的接口采用 JAVA 实现的方式,二者的使用较为独立,不存在冲突 。
②图1,(2)和(3)的对比中可以看出,OpenGL-ISRC 的所提供的功能是相对完善的,鸿蒙 SDK OpenGL 目前还缺少很多标准类,已存在的标准类内部功能也有不完整的现象 。
③OpenGL-ISRC 封装使用了鸿蒙 SDK OpenGL 的 EGL 类,避免功能重复开发,因此二者是互相完善的关系 。
④由于鸿蒙 SDK OpenGL 的不完整性,OpenGL-ISRC 支持的 OpenGLES 标准类的实现使用了安卓 so 库的调用,没有使用鸿蒙 SDK OpenGL 的 OpenGLES 标准 。
推荐阅读
- 泰国|泰国免核酸向全球游客开放!效果立竿见影
- 运动|孕期护肤品哪个牌子比较安全?全球十大安全孕期护肤品牌排行榜
- 天文航天|全球首次!中国成功发射临近空间空基平台火箭
- 腾讯发布全球首个面向移动端的VVC标准视频解码器
- 全球最好的冰箱排名是什么?
- 全球13台根服务器,中国没有任何一台,一旦断网中国网络会瘫痪吗
- 世界上钻石最多的地方是哪里?全球钻石储量人均
- OPPO|首发269元!OPPO Enco Air2 Pro蓝牙耳机发布:双核主动降噪
- 2020 全球 JavaScript 调查报告新鲜出炉
- OPPO|全球首发天玑8000-MAX!OPPO K10开箱图赏