现在的位置: 首页 > 综合 > 正文

第一篇 准备上路吧

2012年09月06日 ⁄ 综合 ⁄ 共 1005字 ⁄ 字号 评论关闭

 

不得不承认,突然发现Opengl es所包含的内容是在是太多。那我应该怎么办?好吧,从代码说起,毕竟这个是我们最熟悉的。但是在代码之前有点必要的知识要先搞清楚。所以,我会在每一课需要分析知识的地方才会分析知识,而不是分析一大堆知识然后采取弄代码,好吧,依然是那句话:我们最熟悉的还是代码。

关于动画的含义。毕竟,我们写opengl 99%的情况下是为了搞点动画,除非是为了写书。所以必须先把动画阐述一下。

动画的伪代码如下:

一个循环

         清除屏幕

         绘制当前屏幕的东西

         休息一小会 (要保持一定的帧率呀)

结束

这个就是动画原理,呵呵,似乎比哥德巴赫猜想简单的多(事实上我并不知道什么是哥德巴赫猜想)。

但是这里会有一个小问题,因为下一帧再次“清除屏幕”的时候,会产生一个闪烁,这个闪烁就是清除屏幕的动作。那么怎么办?这里出现第一个重要概念 双缓冲。屏幕显示有一个图片,称之为图片1(图片就是一个缓冲区,不过比缓冲区理解起来更加直观),还有另外一个图片,称之为图片2,你看不到。那么,现在是不是有两个图片了,对头,这个就是双缓冲区。具体的工作原理就是这样的,如下下面伪代码:

一个循环

         图片2 清除所有的内容

         在图片2上绘制

         将图片2 复制给 图片1

  显示图片1

结束

这样就没有了图片1的清除痕迹了,这些清除是在图片2上进行的,而我们却看不到这个图片。这个就是双缓冲的原理和存在的必要。

那么在opengl中是如何处理和设置的呢?opengl 中使用 glutInitDisplayMode(GLUT_DOUBLE) 这个函数来初始化双缓冲,剩下的事情,不用你管了,那是opengl的事情。貌似,我们在讲android的opengl es的事情,这个用不到。L

那么在android的opengl es中是如何处理这个双缓冲的呢?又是如何执行这个循环的呢?

线程!绝对是线程。在android opengl需要使用一个叫做GLSurfaceView来显示相关opengl的内容,而执行这个循环的是一个叫做GLSurfaceView.Renderer 的家伙,这个Renderer的内部就是一个线程在执行,而双缓冲就是直接被这个renderer搞定了。所以,告诉大家一个好消息,我们不需要设置这个双缓冲了。既然不需要,貌似我唠叨了一大堆哈。

这章基本的就这样,下章开始第一个例子吧。

抱歉!评论已关闭.