深入理解lock()与unlock()

之前有很多人质疑lock的效率,那到底lock有没有作用,今天做了个测试。

首先说明,lock只对setPixel、setPixel32有效,其他位图的API没有区别。

测试

下面测试循环一千万次 setPixel32()

oldTime = getTimer();
bmp1.lock();
for (var i:int = 0; i < 10000000; i++)
	bmp1.setPixel32(100, 100,0xffcc0000);
trace("锁了:", getTimer() - oldTime);
bmp1.unlock();

oldTime = getTimer();
for (var j:int = 0; j < 10000000; j++)
	bmp1.setPixel32(100, 100,0xffcc0000);
trace("没锁:", getTimer() - oldTime);

输出:

继续阅读 »

SDK4.1-4.5describeType()对Embed解释的bug及4.6的未知标签

测试代码:

记得加上编译参数:–keep-as3-metadata+=Embed

package com.cityShop.assets
{
	import flash.utils.describeType;
	/**
	 * ...
	 * @author Cenfee
	 */
	public class AssetsManager
	{
		[Embed(source = "../../../../assets/renderer/map/tiles/red_tile.png")]
		public var Building1:Class;

		public function AssetsManager()
		{
			trace(describeType(this));
		}

	}

}

继续阅读 »

Alternativa3D 8.27 的尝试

A3D8.27出来一段时间了,这个版本,最吸引人的是它终于支持阴影和反射了,并且支持双层透明。今天花了点时间,尝试了一番这个新版本,还是感到A3D还有一段路要走。

1. 所谓的阴影,仅仅是方向光,并且要使用特定的材质(StandardMaterial),这种材质需要你提供漫反射和正常的图片材质。包括反射也一样。

2.双层透明是支持了,但是3层就出现很多问题了。

3.3dsMax里的还是不能使用镜像,否则解释不了。(这个功能不能用想必每个搞3dsMax的人都不爽)

4.没有特定编辑器。

继续阅读 »

【翻译】隐藏的对象的内存分配

【翻译】http://jacksondunstan.com/articles/1279

最近在进行内存分析,我发现了在AS3中一些不为人知的途径而造成的内存分配。我并非从分配的过程中分析,而是从垃圾回收时候。曾经使用一个Flash分析器,仅仅是看到CPU不断地在扫描、覆盖、回收一大块内存。没错,那就是GC在工作。这篇文章就是讲如何防止这些隐藏的对象的内存分配,这些微妙的错误可能会造成很大的问题。

首先,连接字符串也会分配内存。这些看起来没什么的可能会是性能的杀手。

// 分配两个字符串
var fullName:String = person.first + " " + person.last;

// 分配N各字符串
for (var i:int = 0; i < N; ++i)
{
    trace("person #" + i);
}

接下来是Vector3D和Matrix3D类。不幸的是,这些核心内置的3D辅助类某些操作会使得它完成地重新分配内存。

继续阅读 »

对象池的弊端及优化

这几天关于对象池的呼声非常高,都源于这篇文章:http://bbs.9ria.com/thread-114544-1-1.html

其实对象池并不适用于大多情况,并且使用不当,反而得到相反的结果,内存,CPU消耗更大。

为什么呢?

首先明确下,对象池是什么?

对象池就是大量对象的集合。(你可以用数组保存它们)

(黑色就是已经符合被移除条件的,非活动的;白色代表正在使用中的,活动的)

继续阅读 »