`

[转] Flash高性能开发基础系列 ― 内存篇【下】

阅读更多
http://uh.9ria.com/space.php?uid=109929&do=blog&id=7306

上一篇我已介绍了一优化方法(上篇),这节我们继续.
位图优化
     一般最占用内存的部分就是位图,在我开发的MMO游戏中90%以上的的内存是由位图占据的,所以在位图的使用过程序要特别注意,不使用的位图一定要释放掉。在这里我提一些小的建议,以尽量控制位图的内存占用。

1.  能共享位图的尽量共享,具体做法就是用一个BitampData创建多个Bitamp对象。尽量不要去复制BitmapData对象.

2.  将滤镜应用于显示对象时,Flash Player 将在内存中创建两个位图,所以这需要大量内存。所以尽量不要去使用滤镜,一般可以用ps做好滤镜后生成位图给flash来使用.

3.  合理的使用位图缓存.对矢量图形做位图缓存,其实在把矢量图形变成位图,并使用该

位图进行呈现,此会显著提高呈现的性能,但需要占用大量内存。针对复杂的矢量内容使用位图缓存功能。

释放对象
    释放对象其实只有一句话,就是不支有对象的引用,包括声音/视频流,socket,件事等等.我最多的一种情况是事件忘记移除导致对象无法回收,这并不是我不知道这一点,而是在写代码时的疏忽。如果你是一个人开发,你可能经常去profile你的代码,可能很容易找出哪个地方没被移除,但是如果你主程或者架构师你手下有很多少人在Coding,你怎么让他不遗忘移除事件呢,下面我来简单介绍一种方法一次性移除所有事件,避免一个一个移除带来的遗漏问题.
       一般大家都用EventDispatcher来派发事件.现在我们就对addEventListener进行一个小小的改造即可.
package
{
    import flash.events.EventDispatcher;
    import flash.events.IEventDispatcher;

    public class MyEventDispatcher extends EventDispatcher{


        private var events:Array

        public function MyEventDispatcher(target:IEventDispatcher=null)
        {


            super(target);
            events=[];
         }


        override public function addEventListener(type:String, listener:Function, useCapture:Boolean=false, priority:int=0, useWeakReference:Boolean=false):void{

            events.push({type:type,fun:listener})

            super.addEventListener(type, listener, useCapture, priority, useWeakReference);

        }

        override public function removeEventListener (type:String, listener:Function, useCapture:Boolean = false):void{
               super. removeEventListener(type,listener, useCapture);
              for(var i:int=0;i< ;i++){
                  if( events[i].type==type && events[i].fun==listenner){
                   events.splice(i,1)


               }

            }
      }

        public function dispose():void{
          var ev:Object;

            while(events.length){

               ev=events.pop();
                super.removeEventListener(ev.type,ev.fun);


            }

        }

    }

}

所以你在使用EventDispatcher的地方全部使用MyEventDispatcher即可,在回收之前端调用一下dispose方法,就会内部移除所有事件.

还有很多方法可以做到这一点,以上方法只是一个抛砖引玉.

滥用强制垃圾回收

     在Flashplayer debug版本提供了System.gc()接口,可以让虚拟机执行垃圾回收,但是flashplayer 普通用户版是没有这个接口的,于是有人想出使用异常还出发垃圾回收如:
function gc():void{
         try{
                (new LocalConnection).connect("foo");
                 (new LocalConnection).connect("foo");
           }catch(e){

                    trace(System.totalMemory);

                }

}

当然还有其他方法在这里我就不多举了.

Adobe为什么在普通用户版的flashplayer中取消对System.gc()接口的支持,adobe肯定不希望用户直接去触发垃圾回器,肯定是有理由的,下面我将对这个理由进行的浅薄分析.

垃圾回收器通过查找系统中的相互引用,从而检测出处于非活动状态的对象。将删除通过这种方式检测到的处于非活动状态的对象。也就说他要扫描可能持有对象的的所有变量,这一点所需的代价很大,尤其是在大型项目中.如果你经常去做这样的事,这会大大浪费你的CPU资源.

  我做Flash开发已快5年了,我没有什么地方非要用到强制垃圾回收的地方.所以我要在这里提醒广大Flash开发者,在没有特术需求的时候不要使用强制垃圾回收,不要会了腾出一点内存空间而去强制垃圾回收,可能很多时候你是检芝麻丢西瓜,回收器的执行不是普通程序员管的事,Flashplayer会选择最合适的时候去调用.(原本这一节不是我要写的内容,原因是我看到在天地会主页很醒目的位置有一篇《AS3强制内存回收方法之二》,而且受到大家的广泛关注,所以我不想让这篇文章误导了一些新手,以上只是个人见解我希望大家一起讨论这个问题).(上篇)
(此文为原创,如有雷同纯属缘分)
分享到:
评论

相关推荐

    STM32F系列ARM内核32位高性能微控制器参考手册

    STM32F系列是由意法半导体(STMicroelectronics)开发的高性能微控制器,采用ARM Cortex-M3内核,提供了一系列针对不同应用需求的微控制器产品,包括小容量、中容量、大容量及互联型产品。该系列微控制器以其卓越的...

    flash游戏开发教程

    本教程“Flash游戏开发教程”旨在引导初学者掌握如何利用Flash进行游戏制作,从基础到进阶,一步步创建属于自己的小游戏。 首先,我们从第1节开始,这一部分通常会介绍Flash的基础知识,包括界面布局、工具箱的使用...

    STM8系列操作flash

    STM8系列微控制器具备高性能、成本效益高以及易于开发等特性。本知识点主要介绍STM8系列微控制器中Flash程序存储器和数据EEPROM的操作方法。 首先,Flash程序存储器用于存储微控制器的程序代码,而数据EEPROM则用于...

    Flash高级动画教程

    《Flash高级动画教程》是一门深入探讨Flex开发技术和Flash高级应用的课程,旨在帮助游戏开发者以及其他视觉内容创作者提升他们的技能,使他们能够更好地理解和运用ActionScript 3.0来创建复杂的交互式动画和游戏。...

    Flash游戏开发实例系列:打小狗

    在本“Flash游戏开发实例系列:打小狗”的教程中,我们将深入探讨如何使用Adobe Flash进行游戏开发,特别是创建一个互动的、用户参与度高的小游戏——打小狗。Flash是一款广泛应用于创建动画、交互式内容和轻量级...

    GD32全系列硬件开发指南_gd32所有系列_GD32_GD32开发_硬件_硬件开发指南

    GD32微控制器基于ARM Cortex-M内核,提供了高性能、低功耗和丰富的外设接口。Cortex-M系列是ARM公司专为微控制器设计的一系列处理器核心,具有易于编程、高效执行、硬件浮点支持等特点,使得GD32在嵌入式领域具有...

    msp430x22x4系列读写Flash程序

    该系列芯片具有高性能、低功耗、丰富的外设接口以及灵活的内存配置等特点。其中,Flash存储器是其重要组成部分,用于存放程序代码和数据,支持在系统编程(ISP)和在应用编程(IAP)。 **二、Flash存储器** Flash存储器...

    flash中国象棋游戏

    《深入解析Flash中国象棋游戏开发》 Flash中国象棋游戏是一种基于Adobe Flash技术开发的互动娱乐项目,它充分利用了Flash强大的图形渲染能力和ActionScript编程语言的灵活性,为玩家提供了逼真的象棋对战体验。在...

    Flash开发面试题

    ### Flash开发面试题知识点解析 #### 1. 在复杂对象结构中查找特定实例 ...综上所述,Flash开发面试题涵盖了从基础的算法实现到高级的面向对象设计原则,以及项目管理和优化策略,这些都是Flash开发者必备的核心技能。

    嵌入式linux 内存使用与优化

    在嵌入式Linux系统中,内存管理是至关重要的,因为它直接影响到系统的稳定性和效率。针对“嵌入式Linux 内存...学习和掌握这些内容,不仅能够解决实际问题,还能为开发更高效率、更低功耗的嵌入式产品打下坚实基础。

    AD Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明.zip_合泰

    《AD Flash MCU HT66F 系列单片机原理与实务-汇编语言实例说明》是一本深入探讨合泰(Holtek)公司AD Flash MCU HT66F系列的专著,主要关注单片机的基础理论、工作原理及其实用汇编语言编程技术。在深入理解这本书...

    STM32F429内部FLASH读写程序

    STM32F429系列是意法半导体(STMicroelectronics)推出的高性能微控制器,它基于ARM Cortex-M4内核,具有浮点运算单元(FPU),特别适用于嵌入式应用,如工业控制、医疗设备、消费电子等。在STM32F429中,内部Flash...

    Flash cs4 游戏开发教程

    《Flash CS4 游戏开发教程》是一本深入讲解如何使用Adobe Flash CS4进行游戏开发的专业书籍,由张鹏撰写。这本书旨在引导读者掌握利用Flash平台创建互动游戏所需的各项技能和知识,涵盖从基础概念到高级技巧的全面...

    STM32f101的flash编程指南

    在嵌入式系统开发领域,STM32系列微控制器因其高性能、低功耗及丰富的外设支持而广受好评。其中,STM32F101作为STM32F1系列的一员,其内置的Flash存储器成为了程序存储的关键组成部分。本文旨在深入探讨STM32F101的...

    flash cs3源代码

    熟悉这些最佳实践,可以使你的Flash作品在不同平台和网络环境下运行得更加流畅。 总之,这个Flash CS3源代码集合是一个宝贵的教育资源,它可以帮助开发者从多个角度深入理解Flash技术,提升开发技能。无论你是初学...

    电子-nandflash.rar

    STM32-F0、F1、F2分别代表了不同的性能等级和功能定位,F0是基础级,F1是经典级,F2是高性能级,它们都支持对NAND Flash的控制,但具体的硬件接口和驱动实现可能有所不同。 1. **NAND Flash结构与特性**:NAND ...

    Flash Programming V3.90.zip

    C8051F系列微控制器是Silicon Labs(芯科实验室)推出的一系列高性能混合信号微控制器,内置了Flash存储器,使得用户能够方便地进行现场编程和升级。Flash Programming V3.90.exe作为该系列微控制器的编程工具,具备...

Global site tag (gtag.js) - Google Analytics