【Stage3D学习笔记续】山寨Starling(七):一般优化方法简介及混合模式

时间:2022-10-27 05:14:38

关于事件的优化:

遍历注册的事件由foreach改变为fori,在大量数据遍历时会有提升;

事件池优化:

所有的事件都使用一个对象池进行保存,而不是使用到时进行创建,使用EventDispatcher类的dispatchEventWith方法可以使用事件池,使用事件池在大量使用事件的情况下可以极大的提升运行效率,因为FlashPlayer不需要对大量的事件对象进行垃圾回收了。

该特性在Starling1.2中添加,我们的山寨版本就不添加这个功能了,有兴趣的童鞋可以自行查看。

关于算法的优化:

  1. 在多个方法中尽量不创建新的对象,如VertexData的getPosition方法由内部创建Vector3D对象返回更改为Vector3D对象作为参数传入修改,不返回新对象来处理。
  2. 某些方法中需要使用到临时变量来帮助运算,这个临时变量可以作为一个静态变量保存来重复利用,如VertexData的sPositions和sHelperPoint静态变量。
  3. 矩阵转换之前会判断是否需要进行转换,参考RenderSupport的transformMatrixForObject方法;
  4. 矩阵栈(mMatrixStack)使用一个当前的索引(mMatrixStackSize)记录当前使用的矩阵,栈中的矩阵都进行缓存,以供下一次循环中使用,不重新创建新的对象减小GC的压力提高运行效率;
  5. 矩阵运算上的优化,在Starling1.2的版本之后,RenderSupport里的矩阵运算都改为了二维矩阵,在使用时通过MatrixUtil类转换为三维矩阵使用,可以加快运算速度,我们的山寨版就不添加该功能了;

混合模式:

下面的解释来自于Starling中文站:

一个混合模式,总是被两个"Context3DBlendFactor"值来定义。一个混合因素代表一个特定的四个数值的数组, 这个数组是根据源和目标颜色用混合公式计算的。这个公式是:

result = source × sourceFactor + destination × destinationFactor

在这个公式里面,源颜色是像素着色器的输出颜色。目标颜色是在上一次清理和绘制操作之后,颜色缓冲区中的目前存在的颜色。

要注意的是,由于不同的纹理类型,混合因素会产生不同的输出。纹理可能包含'预乘透明度'(PMA), 意思就是他们的RGB色值是根据他们的颜色值分别相乘而得到的(以节省计算时间)。基于'BitmapData'的纹理,会拥有预乘透明度值,还有ATF纹理也有这个值。 基于这个原因,一个混合模式可能根据PMA值拥有不同的因素。

混合模式的好文链接:

Starling 混合模式

HTML5 2D游戏引擎研发系列 第六章

WEBGL 2D游戏引擎研发系列 第七章

在线混合模式查看工具:

http://www.andersriggelsen.dk/glblendfunc.php

混合模式的搭配可以查看BlendMode类的sBlendFactors静态变量。

混合模式即使用一个特定的公式,计算源颜色(像素着色器的输出颜色)和目标颜色(目标颜色是在上一次清理和绘制操作之后,颜色缓冲区中的目前存在的颜色),得到的结果作为最终显示的颜色。

混合模式需要考虑颜色值是否预乘了透明度,预乘透明度的意思就是他们的RGB色值是根据他们的颜色值分别相乘而得到的(据说是为了节省计算时间)。而BitmapData是预乘了透明度的,当然我们只需要关心是否预乘了透明度的混合模式的技术公式即可。