文章目录
如果还不知道自己想要做什么,那么就努力去做到最好,等到有一天你想得到什么的时候,不会懊悔于自己没有足够的资本伸手追逐。
近期笔者将会从零开始系统的学习Android OpenGL ES相关知识,本专栏将会不定期更新,主要是对自己学习过程和心得的一个记录。同时也希望能够通过该笔记对后面想要学习Android OpenGL ES的同学提供一些帮助。
本篇我们将直奔主题,创建我们第一个Android OpenGL应用,本篇以及后续我们使用的ES版本为2.0。第一个OpenGL应用,它将初始化OpenGL,并且对Android的Activity的生命周期进行处理,并且会以一个RGB颜色来循环清空屏幕。这些将作为我们需要在屏幕上绘制东西时的基础。
为什么要清空屏幕?
如果已经在每一帧的屏幕上都绘制了内容,清空屏幕好像是浪费的,那为什么还要这样做呢?
回到一切都用软件渲染的时代,清空屏幕总是一种浪费;开发者总是要假定所有东西都已经绘制好了,并能覆盖前一帧的内容,而不必清空它,这样就能达到优化的目的;可以节省清空屏幕的处理时间。有时,这种优化会导致一些游戏中常见的著名的“镜子大厅”(Hall Of Mirrors)效应,如Doom:它导致的视觉效果就像站在镜子大厅中间,旧的内容一遍又一遍重复出现。
这种优化不再有效了;最新的GPU以不同的方式工作,他们使用特殊的渲染技术,如果屏幕是干净的,他们能工作得更快。通过让GPU清空屏幕,可以节省帧拷贝浪费的时间。因为GPU的这种工作方式,清空屏幕可以帮助避免很多问题,如闪烁或者有物品没有绘制;保留旧的内容容易看到不期望或者不理想的结果。
初始化OpenGL
我们将使用一个特殊的类GLSurfaceView初始化OpenGL。GLSurfaceView是SurfaceView的一个子类,内部会处理OpenGL初始化过程中比较基本的操作,如配置显示设备(display)以及在后台线程中渲染;渲染是在显示设备中一个称为“surface”的特定区域完成的,有时也称为视窗(viewport)。
其次是GLSurfaceView类也针对于Android Activity生命周期提供了对应的封装接口,使得在使用OpenGL时对于页面生命周期变化处理变的更容易。
使用GLSurfaceView
GLSurfaceView与其他View的使用其实基本上一致,分为两种方式一种是代码中直接创建,一种是在布局文件中添加。这里我们选择后者,在布局文件里面添加即可。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">