关于事件的优化:

遍历注册的事件由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是预乘了透明度的,当然我们只需要关心是否预乘了透明度的混合模式的技术公式即可。

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

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

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

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

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

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

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

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

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

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

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

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

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

  7. 【Stage3D学习笔记续】真正的3D世界(四):空间大战雏形

    前面几个星期抽空用Starling做了一个打飞机的小游戏(所以没有接着看书了),准备面试时用的,结果面试还是没过%>_<%...这个游戏打算过几天全部开源了 那么接下来打算这周把<S ...

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

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

  9. 【Stage3D学习笔记续】山寨Starling(三):Starling核心渲染流程

    这篇文章我们剔除Starling的Touch事件体系和动画体系,专门来看看Starling中的渲染流程实现,以及其搭建的显示列表结构. 由于Starling是模仿Flash的原生显示列表,所以我们可以 ...

随机推荐

  1. 187. Repeated DNA Sequences

    题目: All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: " ...

  2. allegro飞线隐藏

    这些都是最基本的操作,你说的应该是飞线的显示和隐藏,命令在display下面,display>show rats>net(component/all) display>blank r ...

  3. Svn忽略配置

     Debug bin obj *.user *.suo *.vspscc *.scc *.o *.lo *.la *.al .libs *.so *.so.[0-9]* *.a *.pyc *.pyo ...

  4. sublime text2卸载和重新安装

    很多同学使用 sublime text2 的时候,出现一些奇怪的bug,且重启无法修复. 于是,就会想到卸载 sublime text2 再重新安装. 然而,你会发现,重新安装后,这个bug任然存在, ...

  5. freemarker 如何获得list的索引值

    <#list toplist as toplists> ${toplists_index} </#list> 相当方便

  6. (转载)Web存储和SessionStorage locaStorage

    <转> sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web请求之间保存数据.有了本地数据,就可以避免数据在 ...

  7. (转载)有关反演和gcd

    tips : 积性函数 F (n) = Π F (piai ) 若F (n), G (n)是积性函数则 F (n) * G (n) Σd | n F (n) 是积性函数 n = Σd | n  φ ( ...

  8. CQOIX2007余数之和

    朴素能得个差不多吧…… 这题改进算法真恶心 pascal一直过不了,难道非得转c++? 代码:(pascal) var n,k,i,l,r,m:longint; ans:qword; function ...

  9. Archlinux里面安装VMware Tools

    用虚拟机学习linux确实很方便,但是和主机的文件共享是个大问题,VMWARE TOOLS可以很好的解决这个问题,但是在ARCH里却不能向大多数linux那样方便的安装,在查了很多帖子试了无数遍之后, ...

  10. [VC6]ONMESSAGE()宏编译时出现"sytax error ;"错误时

    自定义消息时编译出错,经排查,在定义消息的头文件里 #define WM_XXX (WM_USER+1000); 最后多加了一个分号引起. 吐血.