| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 从零开始的跨平台渲染引擎(一)——OpenGL基础环境搭建 -> 正文阅读 |
|
[移动开发]从零开始的跨平台渲染引擎(一)——OpenGL基础环境搭建 |
前言在前文中,我主要分析了渲染引擎的整体架构。本文的主要内容是对OpenGL基础环境的搭建,主要涉及架构图中的Container、Graphic Wrapper和Platform层。 这里也放上代码仓的链接:https://github.com/dongzhong/ReZero。代码也是从零开始搭建,会逐步的完善功能。 一、OpenGL环境介绍OpenGL是一些操作GPU的API集合。但是OpenGL并没有提供操作平台本地窗口的API。所以需要另外一套可以起到本地窗口和OpenGL之间桥梁作用的工具。OpenGL的维护组织Kronos也提供了一套本地窗口接口EGL,而苹果公司也为iOS系统提供了一套EAGL框架。 下面就对这两个工具、框架进行相关API介绍,以及如何在工程中应用,可能面临的问题。 二、OpenGL环境搭建基本流程Android EGL 环境如果开发过Android图形相关应用的开发,应该会了解过 但是,这些API都是Android的Java层接口。如果考虑到跨平台特性,就需要使用OpenGL的C++接口了。而NDK提供了EGL工具。在上篇文章中也提到了,Android平台的容器需要使用 下面对EGL环境搭建和销毁进行详细介绍。 初始化
这两个API用于获取系统屏幕资源,并与其进行连接。设备有可能会有多个屏幕,
这个方法返回一些列满足给定属性的配置。举个栗子:
这个方法是对接了Android系统的本地窗口。上文我们讲到,在Android平台上,Java层中我们会使用JNI从 关于JNI的使用方法,这里就不展开讲了。
这一步很重要,这个方法用于切换当前线程的 要注意的是:
这一步发生在所有的OpenGL渲染指令结束后,将绘制结果展示到本地窗口上去。可以理解为,我们所进行的OpenGL绘制,都是发生在隐藏在屏幕后面的一块内存中,当我们需要将绘制结果展示到屏幕上去,我们就要将屏幕上对应那块内存与需要展示的内存互换位置(这里实际上是互换的内存指针,这样效率更高),就像是更换相框里的相片一样。 销毁
在销毁
最后,如果需要退出当前整个EGL环境,则还需要解除 iOS EAGL 环境苹果公司为iOS操作系统提供了自己实现的一套类似EGL的EAGL框架。下面简单说一下EAGL环境的搭建与销毁。 初始化
绑定
此处使用了OpenGL ES本身的API,可以形象的理解为在画架上贴上画布。
这两个方法是为Renderbuffer分配内存。
其中的 销毁
三、工程化实现OpenGL的基础环境搭建的流程其实很简单。但是如果想要在一个工程项目中完整实现,那么需要考虑的就不仅仅是这些了。下面简单的说几个在工程化使用EGL/EAGL需要注意的点。 多线程OpenGL对多线程的支持比较弱。但是在做渲染引擎时,又对多线程渲染有着强烈的需求,比如我们肯定不希望在主线程上做消耗时间的渲染操作;又或者在上传一个不是紧急使用的纹理数据时,我们不希望占用大量的渲染时间。在这些情况下,我们就需要在多个线程中对GLES环境进行操作。 为了解决这个问题,我们首先要有一个比较好的线程工具。在ReZero中,我借鉴了Flutter的线程工具MessageLoop和TaskRunner。并且在很多时间需要阻塞线程,来等待特定操作结束。 还需要注意EGL/EAGL在多线程使用时的注意事项。Context不能同时绑定到两个不同的线程上;不同的Context需要通过share创建出来,才能共享同样的GL状态。 在使用EAGL时, Surface的创建时机在Android平台上, 为了解决这个问题,则需要对引擎进行类似音乐播放的暂停、继续操作。 注意避免内存泄漏因为OpenGL是一个大型的状态机,每一步的操作都需要若干步的操作。所以在环境销毁掉时候,若是不慎漏掉一步操作,就很容易引起内存泄漏问题。 为了解决这个问题,就需要对这些必要步骤进行包装,比如简单的举个栗子:可以在类的构造函数中包装一些创建和初始化的操作,而在析构函数中则包装一些解除绑定和销毁目标等操作。当然,这里只是一个简单的栗子,还有其他很多方法来进行包装,根据实际情况来使用,可以有效避免内存泄漏的问题。 总结本文主要介绍了OpenGL的基础环境搭建,以及部分工程化时需要考虑到的问题。 在文章的最后,放出一个简单的测试效果,用于测试环境搭建是否成功:测试效果 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 22:37:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |