Molehill 2D 研究继续中
今天加入几个基本属性:
1.旋转 rotation
2.缩放 scaleX,scaleY
3.透明度 alpha
前两个属性毫无压力,使用matrix相关的两个函数,各一条语句搞定了
alpha把我给愁死了,因为对agal的不了解,一下子无从下手
到目前为止试了3种方式,都是采用替换掉Texture的方法:
1.根据保存的每一帧BitmapData,BitmapData加一个透明的色彩滤镜
sourceBitmapData.applyFilter(sourceBitmapData, sourceBitmapData.rect, new Point(), new ColorMatrixFilter([1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, nodeSprite.alpha, 0]));
再new一个Texture,之后渲染前使用这个new的Texture
实测,此方式效率极低,而且内存占用率也非常高,马上放弃
2.每一帧从原先的一个Texture改成两个Texture,第二个是alpha为0.5色彩滤镜得到的BitmapData生成的
因为哪怕我只能做0.5的alpha,使用起来也比无alpha的好很多,因为像一些游戏只需要一种半透明状态即可
实测,效率跟无alpha差不多,出乎意料的是内存占用没比一个Texture的高,所以做了第三种尝试
3.每一帧11个Texture,alpha分别是0,0.1...,1.0
然后到时候根据真实的alpha取最接近的值替代,得到最接近的Texture
实测,效率跟无alpha差不多,内存占用没比一个Texture的高
效果如图:
总结,单单看帧频和内存的话完全达到了很满意的效果,但是有点后怕的地方是,提交的这些Texture是不是缓存在显存当中
这样的话第3种方式还是很不合理的。
希望之后能找到怎样用最简单的方式解决alpha问题的方法!
补充:刚刚测试方式3时在任务管理器里看到chrome的内存是500多兆,在flash里显示出来只有几兆,真是美好的假象,所以这种方式还是要摒弃的!
继续找方法...
想到第4种方法,还是Texture的
默认一帧只有一个Texture,同时保存此帧的BitmapData,如果有alpha小于1的情况时,根据原先的一组帧得到一组新的帧,这些帧里面对应的Texture是alpha处理过的。同时当此显示原件不需要时,清除其内包括Texture的所有数据。目前考虑的结果是这个方式应该比前3个方式都要好。
第5种方法,可以再用类似于第3种方式的分区间取值进行优化。但是不在第一时间全部创建。
但是这两种方法在物件多,alpha值多样性的情况下,仍然存在内存高的问题。