`

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

阅读更多
http://uh.9ria.com/space-109929-do-blog-id-7267.html

内存优化在项目是一个重要的环节,如果不合理的利用和回收内存会合你的程序整体大大下降.

合理使用对象
     创建不同对象一般所消耗的内存是不一样的。如:Number 消耗 8 个字节,int消耗 4个字节, uint消耗 4个字节.下面我举一些例子:

1.       int 类可使用表示为 32 位带符号整数的数据类型。 int 类表示的值的范围是:-2,147,483,648 (-2^31) 到 2,147,483,647 (2^31-1),所以如果你的取值范围在-2,147,483,648 (-2^31) 到 2,147,483,647 (2^31-1)请你用int而不是用Number(刚从2.0转过来的人可能喜欢用Number).uint 范围是0 到 4,294,967,295 (2^32-1) 之间,Actionscript3中类型很少,所以这些只要你平时稍加注意一下就行.

2.       合理使用Shape与Sprite,MovieClip,你可能用MovieClip可以完成Sprite与Shape的功能,但是他们所需的内存是不一样的Shape需要 236 字节,Sprite 需要 412字节, MovieClip  需要440字节,如果你只想显示图形没有交互那你使用Shape,如果是有交互的图形你可以用Sprite,如果是动画你才用MovieClip.

以上只是2个常见的实例,其实在as3中还有很多值得注意的这类情况。我还看到有些大哥为了派发一个事件而去继承Sprite类,Sprite需要消耗400字节, EventDispatcher只需要40字节.

对象重用

   简单的说就是重复使用对象,而不是释放再重新申请,你可能这么认为:释放一个对象回收100字节的空间,我重新在new一个又占用100字节,返正都得占用100字。在flashplayer中不是说你想释放就能释放的,垃圾回收是由flashplayer来执行的,程序是不能控制,更不知道他是什么时候来执行的.所以对于我们来说回来是完全不可控的.所以说你觉得可回收了对象,很可能没回收继续占用空间直到flashplayer觉得内存不够时才可能执行垃圾回收从而被释放.而执行垃圾回收是非常耗费资源的操作尤其在大型的项目中.

虽然我们不能控制垃圾回收,但是我们可以降低垃圾回收器执行的次数,这就是我们尽量做到不去new,而使用现有的对象。这些做还有个好处就是,节省了创建对象的性能开销.

这里是不断的创建对象

var size:Rectangle;
var bitmap:BitmapData=new BitmapData(100,100);
for (var:int = 0; i < 100; i++)
{

    size = new Rectangle(i,0,1,10);
     myBitmapData.fillRect(size,COLOR);
}

重用对象

var bitmap:BitmapData=new BitmapData(100,100);
var size:Rectangle = new Rectangle(0,0,1,10);
for (var:int = 0; i < 100; i++)
{
    size.x = i;
    myBitmapData.fillRect(size,COLOR);
}

对象池技术

   对象池技术的原理就是回收不使用的对象而不是遗弃等待FlashPlayer垃圾回器的执行,等到再需要时再拿来使用.这种技术使用非常广泛,看下面的简单的实现(这里只是一个抛砖引玉,具体怎么设计这个对象池,要看各位的具体项目了).

IRecyclable接口,可以被回收对象必须实现。再就是ObjectPool.

package
{
    public interface IRecyclable
    {
       function dispose():void;
     }
}

//对象池的实现
package{
public class ObjectPool{

        private var pool:Vector.<IRecyclable>;
        private var type:Class;//回收对象的类型

       public function ObjectPool(type:Class)
       {
          this.type=type;
            pool=new Vector.<IRecyclable>();
        }


        public function addObject(o:IRecyclable):void{
            o.dispose();
            pool.push(o);
        }
         public function getObject():*{
            if(pool.length<=0) return new type();
             return pool.pop();
          }
    }
}

对象的另类存储

   在存储大量对象时,我们可以以另一种方式存储或者叫序列化,即存储对象的数据而不存储具体的对象,当需要时再根椐需要数据返序列化出一个对象。这样做法的好处在于不会有大量的对象产生,在as中对即使是空对象也会占用40个字节.

很多时候你可能这样写代码:

var p:Array=[];

for(var i:int=0;i<1000000;i++){
     p.push(new Point(i,i))
}
这里我来实现另一种对象存储:

package{
    import flash.geom.Point;

     public class PointContainer{


        private var container:Array
        public function PointContainer()
        {


            container=[];
         }


        public function add(v:Point):void{
            container.push(v.x);
            container.push(v.y);
        }


        public function getPointAt(index:int):Point{

           return new Point(container[index],container[index+1]);

        }

    }

}

//使用
var p:PointContainer=new PointContainer

for(var i:int=0;i<1000000;i++){
   p.add(new Point(i,i))
}


for(var i:int=0;i<1000000;i++){
   p.getPointAt(i);
}

这种对象存储方式适合大量小型对象存储,比如粒子系统.如果是庞大的对象,这种方式没有任何优式.
事件优化
     使用事件模型通信与使用传统的回调函数相比,速度更慢且占用的内存更多 
AS3中事件的派发传递参数是采用Event,所以在高频率派发事件的地方你可以采用传统的回调函数这样可以大大提高你的效率和内存消耗.(下篇)

(此文为原创,如有雷同纯属缘分)
分享到:
评论

相关推荐

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

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

    flash游戏开发教程

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

    STM8系列操作flash

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

    Flash高级动画教程

    此外,还会探讨如何优化游戏性能,减少内存占用,以确保游戏在不同设备上流畅运行。 教程中包含的资源,如"AdvancED ActionScript 3.0 Animation中文完整版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 内存...学习和掌握这些内容,不仅能够解决实际问题,还能为开发更高效率、更低功耗的嵌入式产品打下坚实基础。

    Flash cs4 游戏开发教程

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

    flash动画与游戏高级实例教程

    4. 性能优化:通过减少不必要的计算、优化图形渲染和内存管理,确保游戏运行流畅。 五、发布与部署 1. 文件导出:Flash支持多种格式导出,如SWF(用于网络)、EXE(独立应用程序)和移动设备的APK或IPA。 2. 测试...

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

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

    电子-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作为该系列微控制器的编程工具,具备...

    STM32F429内部FLASH读写程序

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

    STM32f101的flash编程指南

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

    flash性能优化

    在IT行业中,Flash曾是网页动画、交互设计和游戏开发的重要工具。然而,随着技术的发展,Flash的性能问题逐渐显现,对于用户体验产生了负面影响。为了提升Flash应用的性能,Adobe提供了多方面的优化建议,帮助开发者...

Global site tag (gtag.js) - Google Analytics