智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...

导航

Starling位图使用

Posted on 2013-04-09 16:02  Bill Yuan  阅读(2240)  评论(0编辑  收藏  举报

转自:http://yanda20056.blog.163.com/blog/static/56501931201202953143469/

一般使用starling时,是用位图进行动画表现的,starling也是调用

flash.display3D.textures.Texture.uploadFromBitmapData(source:BitmapData, miplevel:uint=0):void 

这个方法将位图作为材质传入到了显存中. 但为了能在传入时做到最快,要注意一下几点:

1: 

 

starling.textures.Texture.fromBitmapData(data:BitmapData, generateMipMaps:Boolean=true, optimizeForRenderTexture:Boolean=false):Texture 

 

这个方法是接收一个bitmapdata作为starling的Texture.美工提供的图片大小最好和以下级别一致(单位制像素): 1X1,2X2,4X4,8X8,16X16,32X32,64X64,128X128,256X256,512X512,1024X1024,2048X2048. 不要超过2048. 因为FP11为了提供统一接口,既支持openGL又支持DirectX,但openGL对材质的大小要求是2的幂(directX不是), 如过你的材质大小是65X128,则它分配的显存空间依然是按照128X128(64的下一级)来进行分配,所以FP11就要求必须传入的bitmapData的大小是2的幂才能同时满足两种类型的显卡,如果离上面的尺寸标准相差越大就越浪费显存, starling在该方法中进行的自动的判断和扩充,所以当不等于以上尺寸时,它会产生一个新的bitmapdata,并copyPixels,所以这里会浪费拷贝的时间. 当位图完全符合以上尺寸时,速度所有提升.

2: 它的第二个参数表示的是否设置mipMap(3D中用于缩放画面时加快图像缩放运算的一种方式), 但一般用starling开发的游戏是2D游戏,如果不需要用到缩放,则在调用此番那个发时,应该显示的指定为false. 该方法会继续调用starling.textures.Texture.uploadTexture(data:BitmapData, texture:Texture, generateMipmaps:Boolean):void 方法. 这个方法中会根据generateMipmaps是否为true来自动产生新的小于当前大小级别的所有级别的材质.
例如: 即便当前图片大小是16X16,但generateMipmaps为true,那么它会在uploadTexture()方法中会再多产生1X1,2X2,4X4,8X8这几种大小的bitmapdata,并用draw的方式从原始图片上进行绘制,并进行缩放一半. 
draw会消耗很多性能,所以当不需要时,完全可以将generateMipmaps设置为false.

3: starling.textures.Texture在产生后,如果要重复利用,最好保存在内存中(如果用C++直接操作显存,可以直接从显存中获取材质,并重复利用,但starling或FP11,我还不知道怎么直接从显存中获取引用...),以便下次直接利用. 如果是临时用的,要进行dispose(). 如果要彻底销毁一个材质:
texture.dispose();
    if(texture is SubTexture){
     (texture as SubTexture).parent.dispose(); 
    }

4: FP11,最大支持的材质在显存中的占用是350M,所以要注意. 可以用ByteArray对当前你使用的starling.textures.Texture进行大小的粗略统计.