Starling的handleLostContext属性说明

AS3的Stage3D存在设备丢失的问题;会带来的问题就是,已经上传到显存的所有数据丢失,当遇到该问题后唯一的解决方法就是在设备丢失后重新上传一次数据;

Starling提供了一个静态属性handleLostContext,设置为true则会自动处理设备丢失的问题;那么Starling会如何进行处理呢?

我们可以看看Texture类,其提供的4个静态方法用来创建Texture,分别为fromBitmap、fromBitmapData、fromAtfData和fromColor,其中可以找到的逻辑就是,如果handleLostContext为true,则ConcreteTexture对象会记录对应的BitmapData或ATFData的数据,并侦听Event.CONTEXT3D_CREATE事件,在下一次Event.CONTEXT3D_CREATE事件中重新上传数据到显存,处理了设备丢失问题。

Texture类:

        public static function fromAtfData(data:ByteArray, scale:Number=1, useMipMaps:Boolean=true, 
                                           async:Function=null, repeat:Boolean=false):Texture
        {
            var context:Context3D = Starling.context;
            if (context == null) throw new MissingContextError();
            
            var atfData:AtfData = new AtfData(data);
            var nativeTexture:flash.display3D.textures.Texture = context.createTexture(
                atfData.width, atfData.height, atfData.format, false);
            var concreteTexture:ConcreteTexture = new ConcreteTexture(nativeTexture, atfData.format, 
                atfData.width, atfData.height, useMipMaps && atfData.numTextures > 1, 
                false, false, scale, repeat);
            
            concreteTexture.uploadAtfData(data, 0, async);
            concreteTexture.onRestore = function():void
            {
                concreteTexture.uploadAtfData(data, 0);
            };
            
            return concreteTexture;
        }

ConcreteTexture类:

基于上面源码实现的功能来看,在handleLostContext为true时,我们是不能对BitmapData和ATFData调用dispose方法,但是可以置空,该对象已被ConcreteTexture对象引用,所以不会被垃圾回收。

对于不会出现3D设备丢失的设备,如IOS上,handleLostContext可设为false,同时在数据上传到显存后可销毁数据,释放内存;但是其它设备由于可能会出现3D设备丢失的情况,所以内存中应保有数据的信息,在设备丢失后可以重新上传,否则将会出现问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值