这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构。

由于Starling是模仿Flash的原生显示列表,所以我们可以参照原有的知识体系来阅读Straling的代码。

Starling类:

Straling类是整个Starling框架的核心,该类会管理Straling的显示列表、Touch事件、动画处理等等多个模块的功能;

同时Starling类会实现框架内部的帧循环;

实例化Starling类后会Starling的实例会作为一个静态量存储在Starling类中,可避免被垃圾回收;

Starling类的启动大致流程:

  1. 请求Stage3D对象;
  2. Starling类会创建和持有一个Stage对象,该对象为所有显示对象的基类;
  3. 实例化传入的文档类对象,该文档类作为第一个添加到Stage对象中的显示对象,类似于Flash中的root;
  4. 侦听Stage(flash.display.Stage)的ENTER_FRAME事件,每帧调用rander方法进行渲染;
  5. rander方法会调用stage(starling.display.Stage)的render方法开始对所有的子项进行渲染;

渲染处理,每个可显示的子项具体的渲染涉及到两个问题需要解决:

  1. 显示对象的最终状态。这里指的状态是:我添加了一个显示图像的纹理,坐标是0,0点,没有旋转,但是最终进行绘制时真的就把他绘制到0,0点么?这其实要看其父层到顶层(stage)的状态,比如其父层位置是100,100,旋转了50度,那么最终绘制时必须把这个数据考虑到;
  2. 显示对象的层级关系。即先绘制谁,Starling使用的是画家算法(后绘制的区域覆盖先绘制的区域),所以应该先绘制底层的图像,由于显示列表是一个树形结构,所以这块处理起来是比较方便的;

RenderSupport:

对象的绘制顺序只需要从根显示容器(即stage)开始从最底层到最上层的显示对象递归处理即可,这里主要说一下每个显示对象最终状态的处理,这就需要涉及到一个类,即RenderSupport。

RenderSupport内部维护一个名为mMatrixStack数组,该数组作为一个栈来使用,内部存放模型矩阵数据;mModelViewMatrix为当前处理的模型视图的矩阵数据。

渲染是从Stage开始处理,Stage本身是一个容器,会调用Stage的render方法。

如果为容器则render方法会依次处理每个子项:

  1. 每处理一个子项时会有一个当前矩阵的拷贝入栈(栈最开始时为空);
  2. 接下来会处理当前矩阵的数据,把当前处理的子项的位置、旋转和缩放等信息添加到该矩阵中;
  3. 调用子项的render方法进行,如果子项仍然是容器则会递归处理,如果是可显示的对象则会根据当前的矩阵信息绘制该对象;
  4. 将第一步入栈的对象出栈并设定为当前矩阵(其作用是还原到子项处理之前的矩阵数据);

我们可以发现,Starling利用栈方便的保存了显示列表中的一个分支的每个层级的矩阵信息,比如栈中的第一个元素是Stage的矩阵数据,第二个元素是第一个元素的数据添加了当前子项的转换矩阵的矩阵数据,后面的以此类推,每向下进入一个层级对当前的矩阵进行入栈,出来后会还原之前保存的矩阵信息;

由于每一帧都会对所有存在显示列表上的对象执行上面的render方法,所以矩阵对象会被大量创建,故Starling的新版使用了对象池来管理所有的矩阵信息可以减轻程序的开销,但是我们作为了解实现原理,先使用最清晰的方法来山寨该框架,后期如果有时间会添加优化方面的文章。

开始渲染:

Starling的DisplayObject类是一个抽象类,其render方法是一个抽象方法,并不会绘制任何图像,但是我们可以通过继承该类来实现具有绘制能力的类,具体的绘制方法之前的笔记有详细的代码和注释,写法不变,具体的类有如下几个,注:都不是容器哦:

  1. Quad:单纯显示矩形颜色的类;
  2. Image:可以显示一个纹理的类;
  3. MovieClip:注意了,Starling的MovieClip可不是继承Sprite的了(继承Image),他不是一个容器,可以理解为一个可以播放动画帧的显示对象,用来播放动画时使用;

下面的两个类其实是从容器类中添加额外的逻辑扩展得出的,本身是不需要绘制逻辑的:

  1. Button:加入了按钮的3态显示逻辑,更重要的是加入了显示文本的逻辑;
  2. TextField:可以显示文本的类;

解读到这来,其实对Starling的渲染流程有了一个大概的了解了,下一个笔记中,我们就照着Starling的写法开始山寨吧。

【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程的更多相关文章

  1. 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现

    批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...

  2. 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系

    我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...

  3. 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽

    还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...

  4. 【Stage3D学习笔记续】山寨Starling(一):从事件说起

    我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D 山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中 ...

  5. 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵

    如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...

  6. 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西

    我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...

  7. 【Stage3D学习笔记续】山寨Starling(四):渲染代码实现及测试程序

    本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-St ...

  8. 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF

    我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...

  9. 【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法

    Stage3D在运行中是存在随时会丢失上下文的尴尬情况. 渲染内容丢失的问题本身就说明是因为丢失了Context3D对象.出现此问题的原因很多,通常还不是因为Stage3D应用.比如在win7系统中, ...

随机推荐

  1. 网上图书商城项目学习笔记-014购物车模块页面javascrip

    一.流程分析 二.代码 1.view层 (1)list.jsp <%@ page language="java" import="java.util.*" ...

  2. LCMS

    LCMS(LearningContent Management System) 即学习内容管理系统

  3. (转)CSS+DIV float 定位

    来自:http://www.cnblogs.com/iyangyuan/archive/2013/03/27/2983813.html 很早以前就接触过CSS,但对于浮动始终非常迷惑,可能是自身理解能 ...

  4. 【php】对PHPExcel一些简单的理解

    这里有关于excel文件的几个概念需要跟大家说明一下,这几个概念对于我们的后续编程是很有帮助的:1.工作簿:在excel环境中用来存储数据并处理数据的文件,又称为excel文件或excel文档,   ...

  5. 微信公众平台 Premature end of file

    今天在研究微信公众平台 自动接收发送消息的时候,在如下代码: public String processRequest(HttpServletRequest request) { String res ...

  6. VPN column: PPTP(2)--PPTP协议解析

    zhu_hit原创,如需转载请注明出处.Thanks. PPTP协议大体上可以分为两部分:控制层连接和隧道,下面简要介绍两部分的功能.如果要详细了解PPTP协议请阅读RFC文档. 一. Control ...

  7. C#中this在构造函数时的使用

    今天编程的时候,想要用this来处理构造函数,想了半天没有想起来 后来找了自己以前记录的 http://www.cnblogs.com/chucklu/p/4842766.html public Cu ...

  8. 1306.Sequence Median(堆排序)

    1306 URAL真是没水题 以为简单的排序就好了 ME  内存限制很紧 堆排序 或者 STL 用堆排序做的 正好复习一下 都忘了 #include <iostream> #include ...

  9. mssql查找备注(text,ntext)类型字段为空的方法

    在sql语句中,如果查找某个文本字段值为空的,可以用select * from 表 where 字段='' ,但是如果这个字段数据类型是text或者ntext,那上面的sql语句就要出错了. 解决办法 ...

  10. CodeForces Round #290 Div.2

    A. Fox And Snake 代码可能有点挫,但能够快速A掉就够了. #include <cstdio> int main() { //freopen("in.txt&quo ...