代码改变世界

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

2014-11-14 20:20  阿诚de窝  阅读(417)  评论(0编辑  收藏  举报

本章会实现最核心的代码,所以涉及点会比较多,这里会发布一个版本,方便日后的回退查看。

点击下载:https://codeload.github.com/hammerc/hammerc-study-Stage3D/zip/v0.1

先看看Demo:

代码

代码

 

下面说一下一些比较关键的点:

事件播放处理:

DisplayObject2D类添加了一个内部方法dispatchEventOnChildren,核心实现在DisplayObjectContainer2D类中,该方法主要作用是使当前容器及递归容器中的所有显示对象都发送同一个事件。比如EnterFrameEvent的进入帧事件就是顶级stage调用了dispatchEventOnChildren方法,时所有子对象都可以抛出进入帧事件。

着色器创建:

着色器在框架启动时就会进行创建,创建代码放在Quad2D和Image2D的registerPrograms方法中(Starling高版本位置已经调整),根据参数的不同,会一口气创建多个着色器并进行缓存,使用时直接获取。

rotation:

和原生的属性不同,Starling使用的弧度。

KeyboardEvent:

Starling中只是简单的把该事件进行了一下转换,由starling.display.Stage抛出(子项不会抛出),所以我们山寨的版本里取消了这个事件。

viewPort:

viewPort属性比较简单,其x和y会被赋值到stage3D对象的x和y属性上,width和height属性用来设置后台缓冲区的尺寸,可以达到调整stage3D的位置和尺寸目的。

Quad2D与Image2D渲染

框架内部已经做过处理,所以render方法执行渲染时只需要进行之前笔记实现的渲染步骤即可,需要注意的是顶点、缓冲数据和纹理数据在创建或修改时就会实时的上传到显存,所以我们只要指定使用哪个数据即可,即数据的上传和销毁不在render方法中执行。

Texture2D简介:

Texture2D是纹理的抽象基类,但是提供了多个方便的静态创建方法用来创建纹理对象。ConcreteTexture2D是最简单的纹理类,SubTexture2D是可以基于其它纹理描述其中一个区域的子纹理类,RenderTexture2D类是可以把一个显示对象(straling.display包中的3D显示对象哦,2D的绘制当然用BitmapData就可以了)绘制为纹理来显示的动态纹理类。

需要注意的是纹理一旦创建就会提交到GPU,然后本地的BitmapData或ByteArray会被销毁,这会存在一个问题,如果显存数据丢失(比如最小化时)后,这些纹理就不能从内存中重新找回来了,关于这个问题得解决我们后期会谈到。

更具体的东西我们下一个笔记中会谈到。

尺寸计算:

尺寸计算是一个重点,我们会在下个笔记中详细的来完善和解说。