Satrling基础知识

自作多情 提交于 2020-02-24 07:21:42

驱动关系:
GPU —> OpenGL/ES2-DirectX —> stage3D —> starling

flash 显示层次结构:
stage video —> stage3D —> Display List。
注:原生flash显示对象会覆盖stage3D,因为dispalylist层次结构在前面

Mip映射
将一个纹理保存多个缩小版本的方式就叫做Mip映射
若要使用Mip映射,那么你的纹理尺寸必须保证为2的倍数,但形状不一定必须是矩形

Texture atlases 纹理贴图集
SpriteSheet 精灵表
SpriteSheet = texture atlases

Flat Sprites
Starling提供了一种优化方案,具体做法可以理解为将全部子对象的顶点着色器及索引缓冲区集成为一个大的并由它来接管全局的渲染工作
(包括容器及其子对象),且只需要调用一次绘制方法即可完成渲染的工作,就跟完成一个简单的纹理的渲染一样
(如果所有子对象都共享同一个纹理的话,那自然是这样)

flat sprites特性相关的API:
flatten: 如果你想尽可能地提高存在大量嵌套的Sprite对象的话,调用此方法可以让你达到满意效果。一旦调用了此方法,Starling将会把显示树
(即以一个Sprite对象为顶点,所有子对象为子节点)中的渲染工作全部统一管理,在一次绘制操作中完成全部渲染工作。
如果显示树中某个节点发生了外观改变,那么你需要再次调用此方法才能看见改变。

unflatten: 禁用flat行为. 
isFlatenned: 判断是否使用了flat 。

注意:如果子对象所用纹理不一致,那么Starling会对不同的纹理进行独立地绘制工作,这样的话,flatten特性所能带来的性能提升便也不那么明显了

Starling 对象的API:
enableErrorChecking : 允许你启用或禁用错误检测功能。
isStarted :一个标记,用于指示start方法是否被调用过
juggler:juggler 是一个用于存储一系列实现了IAnimatable 接口的对象的对象,你可以通过调用juggler对象的advanceTime方法来让它调度其保存的那些实现IAnimatable
接口的对象每一帧的行为。当一个动画播放完毕后,juggler 会将其剔除。
start : 开始渲染并处理事件
stop : 停止渲染和事件处理,你可以在游戏被置于后台(如将Flash最小化时)时使用此方法来停止渲染,这样可以避免硬件开销上的浪费。

dispose : 当你想要销毁Starling中全部的渲染内容并释放其在GPU中所占用空间时你可以调用此方法。这个API将会在内部同时销毁着色器程序及事件侦听器(GPU用于绘图的东东)
Wmodel模式:使用GPU加速,需要设置一个参数,否则会报一个Context3D not availible或者wrong wmodel value;
    params.wmode = "direct";    // 可以通过这个来判断是否起用了硬件渲染 ,从而定制不同的渲染策略。
    var isHW:Boolean = Starling.context.driverInfo.toLowerCase().indexOf("software") == -1;    // software硬件渲染也就是CPU渲染模式。

Starling中DisplayObject类提供的一系列共有方法:

* removeFromParent : 从父对象中移除,如果它有父对象的话 
* getTransformationMatrixToSpace : 创建一个用于表现本地坐标系和另一个坐标系转换关系的矩阵 
* getBounds : 得到一个以某个坐标系为参考系的能包含该显示对象的最小矩形。 
* hitTestPoint : 返回当前坐标系中某个点位置下层次最高(挡在最前面)的显示对象 
* globalToLocal : 将一个点由舞台坐标转换为当前坐标系坐标 
* localToGlobal : 将一个点由当前坐标系坐标转换为舞台坐标

Starling中DispObject中提供的属性:

* transformationMatrix : 当前显示对象位置相与其父容器的转换矩阵 
* bounds : 当前显示对象在其父容器中的矩形(Rectangle)对象 
* width、height、root、x、y、scaleX、scaleY、alpha、visible、parent、stage、root
* rotation:当前显示对象绕其注册点的旋转弧度(非角度) 
* pivotX、pivotY : 当前显示对象的注册点,默认为(0,0) 如缩放、旋转时的需要
* touchable : 指定当前显示对象是否能够接受Touch事件(相当于原生DisplayObject的mouseEnable,因为在Starling中所有鼠标事件都被定义为Touch事件)

Sprite对象继承自DisplayObjectContainer类,DisplayObjectContainer类中提供的API:

* addChild : 不解释,和原生Flash中的一样,下同 
* addChildAt : 略 
* dispose : 完全销毁一个对象,释放其在GPU中所占内存,移除其全部事件侦听。 
* removeFromParent : 略 
* removeChild : 略 
* removeChildAt : 略 
* removeChildren : 移除一个容器中所有的子对象
* getChildAt : 略
* getChildByName : 根据名称搜索一个子对象 
* getChildIndex : 略 
* setChildIndex : 略 
* swapChildren : 略 
* swapChildrenAt : 略 
* contains : 略

Starling对象都继承自EventDispatcher类:
addEventListener : 为指定事件添加事件侦听器.
hasEventListener : 为指定事件监测是否具备事件侦听器
removeEventListener : 移除某个事件侦听器
removeEventListeners : 移除一个对象中对某一事件或全部事件添加的侦听器。
注:Starling中的事件机制保留了事件冒泡阶段,却没有事件捕捉阶段。

Starling中用Touch实现(替代)mouseclick相关事件:
TouchPhase类中的常量(通过这个类型判别触发的是什么类型的事件):
began : 鼠标/手指开始交互(类似于mouseDown)
ended : 鼠标/手指停止交互(类似于mouseClick)
hover : 鼠标/手指悬于物体上(类似于mouseOver)
moved : 鼠标/手指在物体上移动(类似于mouseDown + mouseMove)
stationary : 鼠标/手指停止与物体的交互但仍停留在其上

TouchEvent事件对象中的API:
ctrlKey : 触发Touch事件是是否按住Ctrl键
getTouch: 得到此事件的Touch对象
getTouches : 得到一组Touch对象(用于多点交互)
shiftKey: 触发Touch事件是是否按住Shift键
timestamp : 事件触发时间
touches : 得到同一时间发生的全部Touch对象

Touch对象中的API:
clone : 复制一个副本
getLocation: 得到Touch事件触发的对应于当前坐标系的位置
getPreviousLocation: 得到之前触发的Touch事件对应于当前坐标系的位置
globalX、Y: 得到Touch事件触发的舞台位置
id: 一个Touch对象所拥有的独一无二的标示符
phase : 指示当前事件触发的类型(阶段)
previousGlobalX、Y : 得到之前触发的Touch事件舞台位置
tapCount : 手指轻拍显示对象的次数(用以识别手指双拍)
target : 触发Touch事件的对象
timestamp : 事件触发时间(此时间是从应用程序启动开始计时的)

设置属性:simulateMultiTouch=true; //表示是否是多点触控,按住ctrl模拟

Texture:纹理,用来填充显示对象。
Texture 对象API:
base : 该Texture对象所基于的Stage3D texture对象
dispose : 销毁该Texture对象的潜在纹理数据
empty : 静态方法。创建一个指定大小和颜色的空Texture对象
frame : 一个Rectangle矩形对象,用于指示一个Texture对象的范围
fromBitmap : 静态方法。从一个Bitmap对象创建一个外观与其一致的Texture纹理对象。
fromBitmapData : 静态方法。从一个BitmapData对象创建一个外观与其一致的Texture纹理对象。
fromAtfData : 静态方法。允许运用ATF (Adobe Texture Format)格式创建一个压缩过的材质。经过压缩的材质能让你节省大量空间,尤其是在像移动设备这样对存储空间异常苛刻的环境中尤为有用。
fromTexture : 静态方法。从一个Texture对象创建一个外观与其一致的Texture纹理对象。
height 、width: 我想这两个属性就不用多说了
mipmapping : 此属性用以指示该材质是否包含了mip映射
premultipliedAlpha : 此属性用以指示该texture对象的透明度是否被预乘到了RGB值中(premultiplied into the RGB values).
repeat : 用以指定当前材质是否启用重复平铺模式,就像铺壁纸那样。

Juggler:
Juggler类允许我们控制所有实现了IAnimatable接口的对象的动画播放。MovieClip类实现了该接口,你也可以自定义一个动画类在Starling中播放,你所要做的,仅仅是让你的自定义类实现IAnimatable接口,然后重载advanceTime方法即可
Juggler API:
add : 添加一个动画对象到juggler
advanceTime : 如果你需要手动调控Juggler的主循环逻辑的话,调用之.
delayCall : 延迟调用某个对象的某个方法
elapsedTime : 指示一个juggler对象的完整生命周期时间
isComplete : 指示一个Juggler的状态,默认情况下它总是返回flase.
purge : 一次性移除全部子对象
remove : 从juggler中移除一个对象
removeTweens : 移除全部类型为Tween的且存在指定目标的对象

Tweens:补间

Tween对象中可用的API:
animate : 缓动一个对象的某个属性至指定目标值. 你可以在一个Tween对象中多次调用此方法
currentTime : 补间动画当前播放到的时间
delay : 补间动画开始前需要等待的延迟时间
fadeTo : 缓动一个对象的透明度至指定目标值. 你可以在一个Tween对象中多次调用此方法
isComplete : 此标记用以判断一个补间动画是否播放完毕
moveTo : 同时缓动一个对象的x、y属性至指定目标值
onComplete : 补间动画播放完毕回调函数
onCompleteArgs : 补间动画播放完毕回调函数参数
onStart : 补间动画开始播放回调函数
onStartArgs : 补间动画开始播放回调函数参数
onUpdate : 补间动画每帧更新时都会调用此方法
onUpdateArgs : 需要传入补间动画每帧更新时都会调用的方法的参数
roundToInt :若该标记为true,则所有带小数的属性值都会去掉小数变为整数
scaleTo : 同时将scaleX及scaleY属性值缓动至指定目标值.
target : 缓动目标对象
totalTime : 补间动画所要消耗的总时间(单位为秒).
transition : 指定补间动画所用缓动方程

注意项
1.避免重复调用width和height
获取宽度和高度属性是一个昂贵的性能开销,特别是对于Sprite容器
在某些情况下,使用一个恒定的值来代替它们更有意义
2.使用BlendMode.NONE
如果您有完全不透明的矩形纹理,可以帮助GPU禁用那些纹理混合。这对于大背景图像特别有用。
backgroundImage.blendMode = BlendMode.NONE;
3.让容器不可点击
当您在屏幕上移动您的光标/手指的时候,Starling就会寻找哪一个对象被点击了。这可能是一项昂贵的操作,
因为它需要遍历所有的显示对象,并调用hitTest方法。
如果您不需要一个对象被触碰,将它设置为“untouchable”是非常有帮助的。最好是在容器上进行禁用:这样,
Starling就不会遍历它的子元件。
for (var i:int=0; i<XX;i)
containter.getChildAt(i).touchable = false; // 好方案
container.touchable = false; // 更好的方案
4.使用新的事件模型
object.dispatchEvent(new Event(“type”, bubbles)); // 传统方式
object.dispatchEventWith(“type”, bubbles); // 新方式
第二种方法也会派发一个事件对象,但是在屏幕背后,它会用对象池来缓存事件对象。这就意味着,如果您使用第二种方式,
将会节省一些垃圾回收器工作的时间。由于它书写简练并且速度更快—因此,它是现在派发事件的首选方式。
如果您已经创建了Event类的子类,就不能用这个方法来派发事件
5.避免创建对象
for (var i:int=0; i<10; 
i)
{
var point:Point = new Point(i, 2*i);
doSomethingWith(point);
} // 坏的
var point:Point = new Point();
for (var i:int=0; i<10; ++i)
{
point.setTo(i, 2*i);
doSomethingWith(point);
} // 好的

6.访问数组或向量数组元素
var element:Object = array[10*x]; // 坏的
var element:Object = array[int(10*x)]; // 好的

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!