Gallery3D源码分析汇总.docx
- 文档编号:9783274
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:81
- 大小:69.30KB
Gallery3D源码分析汇总.docx
《Gallery3D源码分析汇总.docx》由会员分享,可在线阅读,更多相关《Gallery3D源码分析汇总.docx(81页珍藏版)》请在冰豆网上搜索。
Gallery3D源码分析汇总
Gallery3D
分析
文章分类:
移动开发
Gallery3D分析
1.Layer是个抽象类。
有5个变量,分别是mX;mY(位置坐标);mWidth;mHeight(宽与高);mHidden(是否隐藏);
一个抽象方法,非抽象子类都有实现。
Java代码
1.public abstract void generate(RenderView view, RenderView.Lists lists);
其他的可以在子类中重写
Java代码
1.// Returns true if something is animating.
2. public boolean update(RenderView view, float frameInterval) {
3. return false;
4. }
5.
6. public void renderOpaque(RenderView view, GL11 gl) {
7. }
8.
9. public void renderBlended(RenderView view, GL11 gl) {
10. }
11.
12. public boolean onTouchEvent(MotionEvent event) {
13. return false;
14. }
15.
16. // Allows subclasses to further constrain the hit test defined by layer
17. // bounds.
18. public boolean containsPoint(float x, float y) {
19. return true;
20. }
21.
22. protected void onSurfaceCreated(RenderView view, GL11 gl) {
23. }
24.
25. protected void onSizeChanged() {
26. }
27.
28. protected void onHiddenChanged() {
29. }
有好几个类都继承了Layer抽象类:
BackgroundLayer
CanvasLayer
GridLayer
HudLayer
LoadingLayer
RootLayer
其中用到的RenderView类
Java代码
1.final class RenderView extends GLSurfaceView implements GLSurfaceView.Renderer, SensorEventListener
里面有个静态final类Lists
里面定义了updateList,opaqueList,blendedList,hitTestList,systemList等以Layer为对象内容的ArrayList;以及一个清空所有ArrayList的方法Clear().
Gallery3D代码分析之概览
文章分类:
移动开发
Gallery3DUI非常炫,如下图所示:
需要明确的几个问题
伪2D还是3D:
gallery3d基于androidSDKOpenGLES接口开发,使用了JavaAPI,没有使用NDK。
图片如何显示:
在OpenGLES中,要显示图片,需要定义一个四边形,然后把图片当作texture贴到四边形上。
布局及特效如何实现:
这是gallery3d的精华所在,需认真分析。
大数据量图片/cache如何实现和管理:
gallery3d有缓冲区的设计,非常不错,需要认真分析。
动画引擎:
简单的讲,动画引擎对外可表现为一个接口:
Java代码
1.float animate(float initVal, float *currentVal, long timeElapsed, long duration)
即,给定初始值(initVal),动画引擎根据逝去的时间(timeElapsed)和动画总时间(duration)计算下一帧对应的值(currentVal),这个值可能是位置坐标,也可能是一个矩阵matrix,或者是其它的属性。
显示一帧就调用该函数更新actor的属性,各个帧连起来显示就成了动画。
3D坐标与2D坐标的转换:
这个需要仔细分析。
使用缓冲区对象(GL_OES_vertex_buffer_object)
OpenGLES中的顶点数组使得几何图元的显示方便了很多,但是如果每次都要向 OPENGL 发送一大块数据,而这数据其实并没有修改过,那么这传输就是冗余的。
所以这里添加了缓冲区对象,将顶点数组存储在服务器端的缓冲区对象中。
gallery3d使用了缓冲区对象来保存顶点数据。
参考:
NexusOneGalleryonAndroid
构件图
gallery3d的基本构件组成及其关系如下所示:
Gallery3D代码分析之GLSurfaceView
文章分类:
移动开发
简介
SDK中的 android.opengl.GLSurfaceView 类提供如下功能:
∙ 在OpenGLES和View系统之间建立联系;
∙ 使得OpenGLES可以工作在Activity生命周期中;
∙ 可选择合适的framebuffer像素格式;
∙ 创建并管理一个单独的渲染线程,可以实现平滑的动画;
∙ 提供 debugging工具和API。
一个简单的GLSurfaceView应用
Java代码
1.package com.example.android.apis.graphics;
2.
3.import javax.microedition.khronos.egl.EGLConfig;
4.import javax.microedition.khronos.opengles.GL10;
5.
6.import android.app.Activity;
7.import android.opengl.GLSurfaceView;
8.import android.os.Bundle;
9.
10.public class ClearActivity extends Activity {
11. @Override
12. protected void onCreate(Bundle savedInstanceState) {
13. super.onCreate(savedInstanceState);
14. mGLView = new GLSurfaceView(this);
15. mGLView.setRenderer(new ClearRenderer());
16. setContentView(mGLView);
17. }
18.
19. @Override
20. protected void onPause() {
21. super.onPause();
22. mGLView.onPause();
23. }
24.
25. @Override
26. protected void onResume() {
27. super.onResume();
28. mGLView.onResume();
29. }
30.
31. private GLSurfaceView mGLView;
32.}
33.
34.class ClearRenderer implements GLSurfaceView.Renderer {
35. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
36. // Do nothing special.
37. }
38.
39. public void onSurfaceChanged(GL10 gl, int w, int h) {
40. gl.glViewport(0, 0, w, h);
41. }
42.
43. public void onDrawFrame(GL10 gl) {
44. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
45. }
46.}
这个程序功能很简单,每帧绘制时将屏幕设置成黑色。
但它是一个完整的工作在Activity生命周期中的 OpenGL程序。
当activity暂停时,它暂停渲染;当activity继续时,它继续渲染。
可以将这个程序用作非交互式的demo程序。
可以在ClearRenderer.onDrawFrame()接口中增加OpenGL调用做很多的绘制。
GLSurfaceView.Render接口有三个方法:
*onSurfaceCreated():
该方法在渲染开始前调用,OpenGLES的绘制上下文被重建时也会被调用。
当activity暂停时绘制上下文会丢失,当activity继续时,绘制上下文会被重建。
另外,创建长期存在的OpenGL资源(如texture)往往也在这里进行。
*onSurfaceChanged():
当surface的尺寸发生改变时该方法被调用。
往往在这里设置viewport。
若你的camera是固定的,也可以在这里设置camera。
*onDrawFrame():
每帧都通过该方法进行绘制。
绘制时通常先调用glClear 函数来清空framebuffer,然后在调用OpenGLES的起它的接口进行绘制。
输入如何处理
若是开发一个交互型的应用(如游戏),通常需要子类化GLSurfaceView,由此可以获取输入事件。
下面有个例子:
Java代码
1.package com.google.android.ClearTest;
2.
3.import javax.microedition.khronos.egl.EGLConfig;
4.import javax.microedition.khronos.opengles.GL10;
5.
6.import android.app.Activity;
7.import android.content.Context;
8.import android.opengl.GLSurfaceView;
9.import android.os.Bundle;
10.import android.view.MotionEvent;
11.
12.public class ClearActivity extends Activity {
13. @Override
14. protected void onCreate(Bundle savedInstanceState) {
15. super.onCreate(savedInstanceState);
16. mGLView = new ClearGLSurfaceView(this);
17. setContentView(mGLView);
18. }
19.
20. @Override
21. protected void onPause() {
22. super.onPause();
23. mGLView.onPause();
24. }
25.
26. @Override
27. protected void onResume() {
28. super.onResume();
29. mGLView.onResume();
30. }
31.
32. private GLSurfaceView mGLView;
33.}
34.
35.class ClearGLSurfaceView extends GLSurfaceView {
36. public ClearGLSurfaceView(Context context) {
37. super(context);
38. mRenderer = new ClearRenderer();
39. setRenderer(mRenderer);
40. }
41.
42. public boolean onTouchEvent(final MotionEvent event) {
43. queueEvent(new Runnable(){
44. public void run() {
45. mRenderer.setColor(event.getX() / getWidth(),
46. event.getY() / getHeight(), 1.0f);
47. }});
48. return true;
49. }
50.
51. ClearRenderer mRenderer;
52.}
53.
54.class ClearRenderer implements GLSurfaceView.Renderer {
55. public void onSurfaceCreated(GL10 gl, EGLConfig config) {
56. // Do nothing special.
57. }
58.
59. public void onSurfaceChanged(GL10 gl, int w, int h) {
60. gl.glViewport(0, 0, w, h);
61. }
62.
63. public void onDrawFrame(GL10 gl) {
64. gl.glClearColor(mRed, mGreen, mBlue, 1.0f);
65. gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
66. }
67.
68. public void setColor(float r, float g, float b) {
69. mRed = r;
70. mGreen = g;
71. mBlue = b;
72. }
73.
74. private float mRed;
75. private float mGreen;
76. private float mBlue;
77.}
其他的GLSurfaceView例子
在AndroidSDK的APIDemo例子程序中还有很多例子:
∙ GLSurfaceView
∙ Kube
∙ TranslucentGLSurfaceView:
透明背景
∙ TexturedTriangle:
纹理贴图
∙ SpriteText:
在texture上写文本并显示在3D场景中
∙ TouchRotate:
旋转3D对象
选择一个Surface
GLSurfaceView提供了接口可选择surface的类型。
默认情况下,GLSurfaceView会使用一个16位RGB framebuffer,带16位深度。
你也可以根据自己的需要进行选择,比如在 TranslucentGLSurfaceView 例子里,需要一个Alpha通道来实现透明。
GLSurfaceView提供了setEGLSurfaceChooser()方法来选择surface。
选择一个RGB(565)的16位framebuffer,接口如下:
Java代码
1.setEGLConfigChooser(boolean needDepth)
若要定制red,green,blue,alpha和depth,则用如下接口:
Java代码
1.setEGLConfigChooser(int redSize, int greenSize,int blueSize, int alphaSize,int depthSize, int stencilSize)
使用自己实现的EGLConfigChooser,用如下的接口:
Java代码
1.setEGLConfigChooser(EGLConfigChooser configChooser)
持续型渲染模式&通知型渲染模式
大多数3D应用,如游戏、模拟等都是持续型渲染的动画,还有些3D应用是反应式的(reactive),它们往往先被动等待,当用户有了动作再做出反应。
对于这种应用,持续渲染屏幕是浪费时间。
若开发反应式的应用,可以调用下面的方法
Java代码
1.GLSurfaceView.setRenderMode(RENDERMODE_WHEN_DIRTY);
停止持续渲染。
当调用
Java代码
1.GLSurfaceView.requestRender()
时,程序再渲染屏幕。
调试
GLSurfaceView.setDebugFlags()方法可以激活log 或者错误检测,它们可以帮助调试OpenGLES调用。
具体使用时,在 GLSurfaceView的构造函数中,调用setRender()之前调用 GLSurfaceView.setDebugFlags()就可以了。
下面是个例子:
Java代码
1.public ClearGLSurfaceView(Context context) {
2. super(context);
3. // Turn on error-checking and logging
4. setDebugFlags(DEBUG_CHECK_GL_ERROR | DEBUG_LOG_GL_CALLS);
5. mRenderer = new ClearRenderer();
6. setRenderer(mRenderer);
7.}
Gallery3d代码分析之渲染流程
文章分类:
移动开发
RenderView
gallery3d的渲染从RenderView开始。
RenderView从GLSurfaceView继承而来,采用了通知型绘制模式,即通过调用requestRender通知RenderView重绘屏幕。
RenderView将所有需要绘制的对象都保存一个Lists中,Lists包含了5个ArrayList,其定义如下所示:
Java代码
1.public final ArrayList
2.public final ArrayList
3.public final ArrayList
4.public final ArrayList
5.public final ArrayList
RenderView的onDrawFrame接口完成每一帧的绘制操作,绘制时遍历lists里每个list的每一个成员并调用其renderXXX函数。
主要代码如下所示:
Java代码
1....
2.final Lists lists = sLists;
3.
4.final ArrayList
5.boolean isDirty = false;
6.for (int i = 0, size = updateList.size(); i !
= size; ++i) {
7. boolean retVal = updateList.get(i).update(this, mFrameInterval);
8. isDirty |= retVal;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Gallery3D 源码 分析 汇总