`
hbczzsw
  • 浏览: 42709 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Gallery3d 代码分析之渲染流程

阅读更多

RenderView

gallery3d 的渲染从 RenderView 开始。RenderView 从 GLSurfaceView 继承而来,采用了通知型绘制模式,即通过调用 requestRender 通知 RenderView 重绘屏幕。

RenderView 将所有需要绘制的对象都保存一个 Lists中,Lists 包含了5个ArrayList,其定义如下所示:

Java代码 复制代码
  1. public final ArrayList<Layer> updateList = new ArrayList<Layer>();   
  2. public final ArrayList<Layer> opaqueList = new ArrayList<Layer>();   
  3. public final ArrayList<Layer> blendedList = new ArrayList<Layer>();   
  4. public final ArrayList<Layer> hitTestList = new ArrayList<Layer>();   
  5. public final ArrayList<Layer> systemList = new ArrayList<Layer>();  
        public final ArrayList<Layer> updateList = new ArrayList<Layer>();
        public final ArrayList<Layer> opaqueList = new ArrayList<Layer>();
        public final ArrayList<Layer> blendedList = new ArrayList<Layer>();
        public final ArrayList<Layer> hitTestList = new ArrayList<Layer>();
        public final ArrayList<Layer> systemList = new ArrayList<Layer>();




RenderView 的 onDrawFrame 接口完成每一帧的绘制操作,绘制时遍历 lists 里每个 list 的每一个成员并调用其 renderXXX 函数。主要代码如下所示:

Java代码 复制代码
  1. ...   
  2. final Lists lists = sLists;   
  3.   
  4. final ArrayList<Layer> updateList = lists.updateList;   
  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;   
  9. }   
  10. if (isDirty) {   
  11.     requestRender();   
  12. }   
  13.   
  14. // Clear the depth buffer.   
  15. gl.glClear(GL11.GL_DEPTH_BUFFER_BIT);   
  16. gl.glEnable(GL11.GL_SCISSOR_TEST);   
  17. gl.glScissor(00, getWidth(), getHeight());   
  18.   
  19. // Run the opaque pass.   
  20. gl.glDisable(GL11.GL_BLEND);   
  21. final ArrayList<Layer> opaqueList = lists.opaqueList;   
  22. for (int i = opaqueList.size() - 1; i >= 0; --i) {   
  23.     final Layer layer = opaqueList.get(i);   
  24.     if (!layer.mHidden) {   
  25.         layer.renderOpaque(this, gl);   
  26.     }   
  27. }   
  28.   
  29. // Run the blended pass.   
  30. gl.glEnable(GL11.GL_BLEND);   
  31. final ArrayList<Layer> blendedList = lists.blendedList;   
  32. for (int i = 0, size = blendedList.size(); i != size; ++i) {   
  33.     final Layer layer = blendedList.get(i);   
  34.     if (!layer.mHidden) {   
  35.         layer.renderBlended(this, gl);   
  36.     }   
  37. }   
  38. gl.glDisable(GL11.GL_BLEND);  
    ...
    final Lists lists = sLists;

    final ArrayList<Layer> updateList = lists.updateList;
    boolean isDirty = false;
    for (int i = 0, size = updateList.size(); i != size; ++i) {
        boolean retVal = updateList.get(i).update(this, mFrameInterval);
        isDirty |= retVal;
    }
    if (isDirty) {
        requestRender();
    }

    // Clear the depth buffer.
    gl.glClear(GL11.GL_DEPTH_BUFFER_BIT);
    gl.glEnable(GL11.GL_SCISSOR_TEST);
    gl.glScissor(0, 0, getWidth(), getHeight());

    // Run the opaque pass.
    gl.glDisable(GL11.GL_BLEND);
    final ArrayList<Layer> opaqueList = lists.opaqueList;
    for (int i = opaqueList.size() - 1; i >= 0; --i) {
        final Layer layer = opaqueList.get(i);
        if (!layer.mHidden) {
            layer.renderOpaque(this, gl);
        }
    }

    // Run the blended pass.
    gl.glEnable(GL11.GL_BLEND);
    final ArrayList<Layer> blendedList = lists.blendedList;
    for (int i = 0, size = blendedList.size(); i != size; ++i) {
        final Layer layer = blendedList.get(i);
        if (!layer.mHidden) {
            layer.renderBlended(this, gl);
        }
    }
    gl.glDisable(GL11.GL_BLEND);




lists 的各个 list 里包含的各个 layer 如下所示:

Java代码 复制代码
  1. lists   
  2.   |------------------|-----------------|-----------------|---------------|   
  3. updateList        opaqueList        blendedList      systemList     hitTestList   
  4.   |                  |                 |                 |            |   
  5. GridLayer         GridLayer         GridLayer        GridLayer      GridLayer   
  6. BackgroudLayer    BackgroudLayer    BackgroudLayer   
  7. HudLayer           HudLayer         HudLayer                        HudLayer   
  8. TimeBar                             TimeBar                         TimeBar   
  9. PathBar                             PathBar                         PathBar   
  10. XXXButton                           XXXButton                       XXXButton   
  11. XXXMenu                             XXXMenu                         XXXMenu  
lists
  |------------------|-----------------|-----------------|---------------|
updateList        opaqueList        blendedList      systemList     hitTestList
  |                  |                 |                 |            |
GridLayer         GridLayer         GridLayer        GridLayer      GridLayer
BackgroudLayer    BackgroudLayer    BackgroudLayer
HudLayer           HudLayer         HudLayer                        HudLayer
TimeBar                             TimeBar                         TimeBar
PathBar                             PathBar                         PathBar
XXXButton                           XXXButton                       XXXButton
XXXMenu                             XXXMenu                         XXXMenu





Layer 类提供了 update(...), renderOpaque (...), renderBlended (...) 接口,从上面 RenderView 的 onDrawFrame 绘制代码可以看到,这些接口被调用。

Java代码 复制代码
  1. public abstract class Layer {   
  2.     ... ...   
  3.   
  4.     public abstract void generate(RenderView view, RenderView.Lists lists);   
  5.   
  6.     public boolean update(RenderView view, float frameInterval) {   
  7.         return false;   
  8.     }   
  9.   
  10.     public void renderOpaque(RenderView view, GL11 gl) {   
  11.     }   
  12.   
  13.     public void renderBlended(RenderView view, GL11 gl) {   
  14.     }   
  15.     ... ...   
  16.   
  17. }  
public abstract class Layer {
    ... ...

    public abstract void generate(RenderView view, RenderView.Lists lists);

    public boolean update(RenderView view, float frameInterval) {
        return false;
    }

    public void renderOpaque(RenderView view, GL11 gl) {
    }

    public void renderBlended(RenderView view, GL11 gl) {
    }
    ... ...

}




GridLayer

GridLayer 中有个 GridDrawManager,专门负责绘制。

下面是 GridDrawManager 的构造函数,从其参数里可以看出些门道。

Java代码 复制代码
  1. mDrawManager = new GridDrawManager(context, mCamera, mDrawables, sDisplayList, sDisplayItems, sDisplaySlots);  
分享到:
评论

相关推荐

    android Gallery3D 最新源码

    《Android Gallery3D最新源码解析》 Gallery3D是Android平台上的一款开源3D图片浏览应用,它以其高效、流畅的用户体验和强大的3D渲染能力而受到开发者和用户的喜爱。本文将深入探讨Gallery3D的最新源码,揭示其背后...

    Gallery3D源码分析

    Gallery3D源码分析

    Android_Gallery3D源码(已编译)

    《Android_Gallery3D源码解析》 Gallery3D是Android平台上的一款3D图片浏览应用,它展示了Android系统中3D图形处理和图像展示的强大能力。这个应用的源码提供了深入理解Android图形库、线程管理、数据加载优化以及...

    gallery3D源码分析

    《Gallery3D源码分析详解》 Gallery3D是一款基于OpenGL进行界面绘制的高效图片浏览应用,它的设计和实现方式与传统的Android应用有着显著的区别。本文将深入探讨Gallery3D的核心概念、线程架构、控件系统以及渲染...

    Gallery3D源码

    《Gallery3D源码解析——打造高效且直观的图库应用》 Gallery3D是一款流行的开源图库应用程序,以其高性能和用户友好的界面而受到广大开发者和用户的喜爱。本文将深入探讨Gallery3D的源码,揭示其在图像处理、性能...

    Gallery 3D源码分析汇总

    在Android平台上,Gallery 3D是一款用于展示图片的3D应用,其源码分析对于理解Android图形渲染和3D图像处理具有很高的学习价值。以下是关于Gallery 3D源码分析的一些关键知识点: 1. **Layer抽象类**: Layer是...

    Gallery 3D 分析汇总(文档)

    ### 源码分析 拥有源码意味着开发者可以深入学习和研究Gallery 3D的实现细节,例如如何实现3D滚动效果、如何高效管理内存、以及如何优化GPU渲染等。这对于Android开发者尤其是对3D图形编程感兴趣的开发者来说是一份...

    Gallery_3D_源码分析汇总

    标题和描述均提到了"Gallery_3D源码分析汇总",这暗示着文档是对Google的Gallery3D应用源码的深入解析。Gallery3D是一款由Google开发的图像浏览应用程序,它利用OpenGL ES技术提供了丰富的3D效果和交互体验。在分析...

    froyo 的Gallery3D源码

    《深入解析Android froyo Gallery3D源码》 在Android系统中,Gallery3D是一款高性能的图片浏览器,尤其在froyo(Android 2.2)版本中,它的源码设计与实现揭示了许多Android图形处理和性能优化的精髓。今天我们将...

    安卓Android源码——Gallery3D.zip

    综上所述,分析Gallery3D的源码有助于开发者理解Android图像处理、内存管理、GPU渲染、UI优化等方面的知识,对于提高应用性能和用户体验具有重要指导意义。通过学习和实践,开发者能够掌握更高级的Android开发技巧,...

    android 的gallery3d

    Gallery3D作为开源项目,允许开发者深入研究其源代码并进行定制化开发。开发者可以从中学到如何在Android平台上实现高性能的3D图形处理,以及如何构建一个用户友好的图片管理应用。 综上所述,Gallery3D是Android...

    Gallery3D_画廊效果Android源码.zip

    《Gallery3D:Android平台上的3D画廊效果解析》 Gallery3D是Android系统中一个用于展示图片的3D视图组件,它为用户提供了一种动态、立体且交互性强的图片浏览体验。这个组件充分利用了Android平台的硬件加速功能,...

    Android2.3.3图库Gallery3D源码带Eclispe工程直接编译

    《深入解析Android 2.3.3图库应用Gallery3D源码》 在Android开发领域,理解系统自带应用的源码是提升技术水平的重要途径。本文将深入剖析Android 2.3.3版本中的图库应用——Gallery3D的源码,帮助开发者了解其工作...

    Gallery 3D效果

    代码可能包括自定义的Gallery子类,以及与之相关的布局文件和资源。通过分析和调试这些代码,可以加深对Android图形和动画系统的理解,从而在自己的应用中实现类似的复杂效果。 总的来说,"Gallery 3D效果"涉及了...

    Gallery3D 图库分析

    《Gallery3D图库分析——深入理解Layer与渲染机制》 Gallery3D是一款基于Android平台的3D图像浏览应用,其独特的用户界面和高效的图片处理技术使其在移动开发领域备受关注。本文将深入剖析Gallery3D的核心组件——...

    Android Gallery3D

    **Android Gallery3D详解** Gallery3D是Android...通过分析和学习Gallery3D的源代码,开发者不仅可以提升对Android平台的深入理解,还能掌握3D图像处理、性能优化等高级技术,为自己的应用开发提供宝贵的实践经验。

    froyo Gallery3D解析

    《froyo Gallery3D解析》 Android 2.2中的Gallery3D是一个引人注目的功能,它展示了Android在图形处理和用户界面设计上的强大能力。Gallery3D基于OpenGL ES,提供了丰富的3D视觉效果,使用户可以以独特的方式浏览...

    安卓Andriod源码——Gallery3D.zip

    《安卓Android源码——Gallery3D深度解析》 在安卓Android的世界里,源码是开发者探索系统奥秘、提升应用性能、实现个性化定制的关键。本文将深入探讨“Gallery3D”这一组件的源码,帮助读者理解其工作原理,从而在...

    最新android4.0gallery3d源码

    Android 4.0 Gallery3D源码分析 Gallery3D是Android系统中一个经典的3D图像浏览应用,尤其在Android 4.0(冰淇淋三明治)版本中,它提供了流畅且富有视觉冲击力的用户体验。这个源码是开发者深入理解Android 3D图像...

Global site tag (gtag.js) - Google Analytics