首页 > 代码库 > Away3D ATFTexture

Away3D ATFTexture

  之前在项目中贴图大量使用了 PNG 和 jpg 遇到了个问题。在使用BitmapTexture的时候发现 是必须MIP 不管你 是否开启或者关闭 MIP 他都会去创建。而每次MIP都会根据贴图大小去生成不同级别的 材质 比如说 512 * 512 映射的结果是 256 * 256 、128 * 128、64*64、32*32、16*16...等等然后依次uploadFromBitmapData;这个过程效率极低。如果强行不然它做MIP效果巨丑无比。 后来研究了一下DDS,DDS在端游里使用的比较多 因为 DDS里自带了 MIP。在flash里 这种格式解析开销本身就很大,还得靠CPU去解压。得不偿失!经过一番折腾,决定采用ATF。

  ATF是Stage3D 默认支持的格式 这种格式是不需要在CPU上做 MIP的同时还支持异步上传处理。这样一来CPU压力是减少了但是上传比较大的贴图时间还是很长。flash 的帧频也会受到影响。然后看看Away3D 的ATFTexture 的实现默认是直接同步上传。压根就没留开启异步上传的参数。没办法忍受不了卡顿只好改代码了。

修改ATFTexture类代码如下:

    override protected function uploadContent(texture : TextureBase) : void
        {

            
            if (_atfData.data.length == 0)
            {
                DevLog.debug(DevLog.ALL, "texture " + url + " length is invalid");
                return;
            }

            _nativeTexture = Texture(texture);
           
            _nativeTexture.addEventListener(Event.TEXTURE_READY, _onTextureReady);
            _nativeTexture.uploadCompressedTextureFromByteArray(_atfData.data, 0, true);
        }
        
        private function _onTextureReady(event : Event) : void

    {
            
            _nativeTexture.removeEventListener(Event.TEXTURE_READY, _onTextureReady);
            _nativeTexture = null;
            
            if(hasEventListener(TextureEvent.UPLOAD_TEXTURE_COMPLETE))
                dispatchEvent(new TextureEvent(TextureEvent.UPLOAD_TEXTURE_COMPLETE));            
        }