博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AS3优化性能笔记二
阅读量:5117 次
发布时间:2019-06-13

本文共 4194 字,大约阅读时间需要 13 分钟。

处理像素

使用setVector()方法绘制像素。

var wdth:int = 200;var hght:int = 200;var total:int = wdth*hght;// Pixel colors Vectorvar pixels:Vector. = new Vector.(total, true); for ( var i:int = 0; i< total; i++ ){
// Store the color of each pixelpixels[i] = Math.random()*0xFFFFFF;} // Create a non-transparent BitmapData objectvar myImage:BitmapData = new BitmapData ( wdth, hght, false );var imageContainer:Bitmap = new Bitmap ( myImage );// Paint the pixelsmyImage.setVector ( myImage.rect, pixels );addChild ( imageContainer );

如果用的是较慢的方法,如setPixel()或者setPixel32(),请使用lock()和unlock()方法加快运行速度。

var buffer:BitmapData = new BitmapData(200,200,true,0xFFFFFFFF);var bitmapContainer:Bitmap = new Bitmap(buffer);var positionX:int;var positionY:int;// Lock updatebuffer.lock();var starting:Number=getTimer(); for (var i:int = 0; i<2000000; i++){
// Random positionspositionX = Math.random()*200;positionY = Math.random()*200;// 40% transparent pixelsbuffer.setPixel32( positionX, positionY, 0x66990000 );} // Unlock updatebuffer.unlock();addChild( bitmapContainer );trace( getTimer () - starting );// output : 670

BitmapData类的lock()方法可以锁定图像,并防止引用该图像的对象在BitmapData对象更改时进行更新。

注:如果处理的是位图(而不是显示列表)中的像素(双缓动),有时该技术不会提高性能。如果位图对象没有引用位图缓冲区,则使用lock()和unlock()不会提高性能。

遍历像素的方法(例如getPixel()、getPixel32()、setPixel()、setPixel32()可能速度很慢,特别是移动设备上。如果可能,则使用在一次调用中检索所有像素的方法。要读取像素,使用getVector()方法,它比getPixels()方法速度快。尽可能使用依赖于Vector对象的API,因为它们的运行速度可能会更快。

TextField优化

使用appendText()方法而不要使用 += 运算符。并尽可能的更新循环外的文本字段。

+=运算符:

var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); for (var i:int = 0; i< 1500; i++ ){
myTextField.text += "ActionScript 3";} trace( getTimer() - started );// output : 1120

appendText()方法:

var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer(); for (var i:int = 0; i< 1500; i++ ){
myTextField.appendText ( "ActionScript 3" );} trace( getTimer() - started );// output : 847

在每个循环中更新文本字段会使用很多内部处理。通过仅连接一个字符串并将其分配给循环外的文本字段,可大大减少运行代码所需的时间。

var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer();var content:String = myTextField.text; for (var i:int = 0; i< 1500; i++ ){
content += "ActionScript 3";} myTextField.text = content; trace( getTimer() - started );// output : 2

处理HTML文本时,前一种方法速度更慢,易造成Timeout异常,如果基础硬件速度太慢,则可能会引发异常。

var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT;var started:Number = getTimer(); for (var i:int = 0; i< 1500; i++ ){
myTextField.htmlText += "ActionScript 2";} trace( getTimer() - started );

通过此值分配给循环外的字符串,此代码将仅需要29毫秒即可完成:

var myTextField:TextField = new TextField();addChild ( myTextField );myTextField.autoSize = TextFieldAutoSize.LEFT; var started:Number = getTimer();var content:String = myTextField.htmlText; for (var i:int = 0; i< 1500; i++ ){
content += "ActionScript 3";} myTextField.htmlText = content;trace ( getTimer() - started );// output : 29

尽可能避免使用中括号[]运算符

使用中括号运算符可能会降低性能,以下代码演示了使用中括号运算符的效率很低:

var lng:int = 5000;var arraySprite:Vector. = new Vector.(lng, true);var i:int; for ( i = 0; i< lng; i++ ){
arraySprite[i] = new Sprite();} var started:Number = getTimer(); for ( i = 0; i< lng; i++ ){
arraySprite[i].x = Math.random()*stage.stageWidth;arraySprite[i].y = Math.random()*stage.stageHeight;arraySprite[i].alpha = Math.random();arraySprite[i].rotation = Math.random()*360;} trace( getTimer() - started );// output : 16

以下优化的版本减少了对中括号运算符的使用:

var lng:int = 5000;var arraySprite:Vector. = new Vector.(lng, true);var i:int; for ( i = 0; i< lng; i++ ){
arraySprite[i] = new Sprite();} var started:Number = getTimer(); for ( i = 0; i< lng; i++ ){
currentSprite = arraySprite[i];currentSprite.x = Math.random()*stage.stageWidth;currentSprite.y = Math.random()*stage.stageHeight;currentSprite.alpha = Math.random();currentSprite.rotation = Math.random()*360;} trace( getTimer() - started );// output : 9

转载于:https://www.cnblogs.com/youlechang123/archive/2013/02/17/2914028.html

你可能感兴趣的文章
[洛谷P2698] [USACO12MAR]花盆Flowerpot
查看>>
骑士共存问题
查看>>
对于没有复现onWindowFocusChange方法的Activity子类,插入一个onWindowFocusChange方法
查看>>
ITIL(IT Infrastructure Library)介绍系列1(IT服务管理实践综述):
查看>>
【HLSDK系列】HL引擎入门篇
查看>>
计算机基础初识
查看>>
一个请求过程用同一个数据库连接对象在多线程下的问题
查看>>
mysql配置主从复制和常见问题
查看>>
Flex 弹性布局
查看>>
[笔记]何为Linux及其文件系统(五)
查看>>
C# MD5 加密
查看>>
Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)
查看>>
spring mvc 异常统一处理
查看>>
230. Kth Smallest Element in a BST
查看>>
154. Find Minimum in Rotated Sorted Array II
查看>>
POJ 1928 The Peanuts
查看>>
Instant Radiosity实现
查看>>
(转)C# Aop简单扫盲及ORM实体类属性拦截示例
查看>>
C#基础之字符串Stirng特性详解
查看>>
[网络流24题] 餐巾
查看>>