【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程
这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构。
由于Starling是模仿Flash的原生显示列表,所以我们可以参照原有的知识体系来阅读Straling的代码。
Starling类:
Straling类是整个Starling框架的核心,该类会管理Straling的显示列表、Touch事件、动画处理等等多个模块的功能;
同时Starling类会实现框架内部的帧循环;
实例化Starling类后会Starling的实例会作为一个静态量存储在Starling类中,可避免被垃圾回收;
Starling类的启动大致流程:
- 请求Stage3D对象;
- Starling类会创建和持有一个Stage对象,该对象为所有显示对象的基类;
- 实例化传入的文档类对象,该文档类作为第一个添加到Stage对象中的显示对象,类似于Flash中的root;
- 侦听Stage(flash.display.Stage)的ENTER_FRAME事件,每帧调用rander方法进行渲染;
- rander方法会调用stage(starling.display.Stage)的render方法开始对所有的子项进行渲染;
渲染处理,每个可显示的子项具体的渲染涉及到两个问题需要解决:
- 显示对象的最终状态。这里指的状态是:我添加了一个显示图像的纹理,坐标是0,0点,没有旋转,但是最终进行绘制时真的就把他绘制到0,0点么?这其实要看其父层到顶层(stage)的状态,比如其父层位置是100,100,旋转了50度,那么最终绘制时必须把这个数据考虑到;
- 显示对象的层级关系。即先绘制谁,Starling使用的是画家算法(后绘制的区域覆盖先绘制的区域),所以应该先绘制底层的图像,由于显示列表是一个树形结构,所以这块处理起来是比较方便的;
RenderSupport:
对象的绘制顺序只需要从根显示容器(即stage)开始从最底层到最上层的显示对象递归处理即可,这里主要说一下每个显示对象最终状态的处理,这就需要涉及到一个类,即RenderSupport。
RenderSupport内部维护一个名为mMatrixStack数组,该数组作为一个栈来使用,内部存放模型矩阵数据;mModelViewMatrix为当前处理的模型视图的矩阵数据。
渲染是从Stage开始处理,Stage本身是一个容器,会调用Stage的render方法。
如果为容器则render方法会依次处理每个子项:
- 每处理一个子项时会有一个当前矩阵的拷贝入栈(栈最开始时为空);
- 接下来会处理当前矩阵的数据,把当前处理的子项的位置、旋转和缩放等信息添加到该矩阵中;
- 调用子项的render方法进行,如果子项仍然是容器则会递归处理,如果是可显示的对象则会根据当前的矩阵信息绘制该对象;
- 将第一步入栈的对象出栈并设定为当前矩阵(其作用是还原到子项处理之前的矩阵数据);
我们可以发现,Starling利用栈方便的保存了显示列表中的一个分支的每个层级的矩阵信息,比如栈中的第一个元素是Stage的矩阵数据,第二个元素是第一个元素的数据添加了当前子项的转换矩阵的矩阵数据,后面的以此类推,每向下进入一个层级对当前的矩阵进行入栈,出来后会还原之前保存的矩阵信息;
由于每一帧都会对所有存在显示列表上的对象执行上面的render方法,所以矩阵对象会被大量创建,故Starling的新版使用了对象池来管理所有的矩阵信息可以减轻程序的开销,但是我们作为了解实现原理,先使用最清晰的方法来山寨该框架,后期如果有时间会添加优化方面的文章。
开始渲染:
Starling的DisplayObject类是一个抽象类,其render方法是一个抽象方法,并不会绘制任何图像,但是我们可以通过继承该类来实现具有绘制能力的类,具体的绘制方法之前的笔记有详细的代码和注释,写法不变,具体的类有如下几个,注:都不是容器哦:
- Quad:单纯显示矩形颜色的类;
- Image:可以显示一个纹理的类;
- MovieClip:注意了,Starling的MovieClip可不是继承Sprite的了(继承Image),他不是一个容器,可以理解为一个可以播放动画帧的显示对象,用来播放动画时使用;
下面的两个类其实是从容器类中添加额外的逻辑扩展得出的,本身是不需要绘制逻辑的:
- Button:加入了按钮的3态显示逻辑,更重要的是加入了显示文本的逻辑;
- TextField:可以显示文本的类;
解读到这来,其实对Starling的渲染流程有了一个大概的了解了,下一个笔记中,我们就照着Starling的写法开始山寨吧。
【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程的更多相关文章
- 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
批处理是使GPU进行高效绘制的一种技术手段,也是整个渲染流程中最核心的技术,到目前为止我们并没有使用到这种技术手段,下面我们看看我们现在的渲染机制. 先想一想我们最开始是怎么向GPU绘制一幅图像的,可 ...
- 【Stage3D学习笔记续】山寨Starling(十一):Touch事件体系
我们的山寨Starling版本将会在这里停止更新了,主要还是由于时间比较有限,而且我们的山寨版本也很好的完成了他的任务“了解Starling的核心渲染”,接下来的Starling解析我们将会直接阅读S ...
- 【Stage3D学习笔记续】山寨Starling(二):VertexData探幽
还记得之前的学习笔记中我们的顶点缓冲数组中的顶点数据么,我们使用一个一维数组来记录所有的顶点数据,这是由于顶点缓冲上传数据时是使用的一维数组. 如果对顶点数据进行一层代码的封装,就能更加的方便我们来操 ...
- 【Stage3D学习笔记续】山寨Starling(一):从事件说起
我在GitHub上新开了一个项目:https://github.com/hammerc/hammerc-study-Stage3D 山寨的Starling版本我取名叫做Scorpio2D,以后的笔记中 ...
- 【Stage3D学习笔记续】真正的3D世界(一):透视矩阵
如果各位看官跟着我的学习笔记一路看过来的话,一定会吐槽我的,这都是什么3D啊?从头到尾整个都是在使用GPU绘制一堆2D图像而已,的确,之前我们一直使用正交矩阵利用GPU加速来实现2D世界的展示,算不上 ...
- 【Stage3D学习笔记续】山寨Starling(十二):总结和一些没提到的东西
我们的山寨Starling到这里就告一段落了,不得不说这是一个非常优秀的2D框架,他的设计和架构为后来的许多框架都提供了很好的参考,比如现在正在崛起的Egret,我们的一番解读也只是窥见了Starli ...
- 【Stage3D学习笔记续】山寨Starling(四):渲染代码实现及测试程序
本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看. 点击下载:https://codeload.github.com/hammerc/hammerc-study-St ...
- 【Stage3D学习笔记续】山寨Starling(十):高效游戏设计、纹理集和ATF
我发布了经过批处理优化的v0.3版,点击下载:https://github.com/hammerc/hammerc-study-Stage3D/archive/v0.3.zip 先看看我们批处理优化后 ...
- 【Stage3D学习笔记续】山寨Starling(九):上下文丢失处理方法
Stage3D在运行中是存在随时会丢失上下文的尴尬情况. 渲染内容丢失的问题本身就说明是因为丢失了Context3D对象.出现此问题的原因很多,通常还不是因为Stage3D应用.比如在win7系统中, ...
随机推荐
- Invoke BeginInvoke
http://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke http://www.codeproject.com/Arti ...
- js2word/html2word的简单实现
js2word/html2word的简单实现 以C#描述如下: StringBuilder sb = new StringBuilder(); sb.Ap ...
- 1022. Genealogical Tree(topo)
1022 简单拓扑 不能直接dfs 可能有不联通的 #include <iostream> #include<cstdio> #include<cstring> # ...
- poj 水题系列
题目:http://poj.org/problem?id=3006 筛选法求素数 #include <iostream> #include<cstdio> #include&l ...
- innodb b+树
http://www.admin10000.com/document/5372.html
- WindowsPhone8SDK重装后设计器加载异常的处理办法
Close all running instances of Visual Studio 2012 start cmd.exe (as admin/elevated) cd /d %windir%\i ...
- shell 全局和局部变量
/******************************************************************** * shell 全局和局部变量 * 声明: * 到目前为止, ...
- can't able to update the design capacity in bq27441-G1
/*************************************************************************** * can't able to update ...
- 【转】Android项目中编译 C的模块
原文网址:http://blog.csdn.net/Harrison_zhu/article/details/4057738 Android编译环境本身比较复杂,且不像普通的编译环境:只有顶层目录下才 ...
- [selenium webdriver Java]显示的等待同步
显示等待可以在执行下一次操作时,自定义等待条件 显示的等待只需要执行在需要同步的地方而不影响脚本的其他地方 Selenium WebDriver提供了WebDriverWait和ExpectedCon ...