晒黑了

没有评论

黑不溜秋

睡醒,首发

没有评论

20110417-055341.jpg

在做了一个很诡异的梦后,糊里糊涂的醒了,再也无法入睡,干脆拿起新入手的ipad,看有哪些感兴趣的免费应用还可以装,竟然有wordorese,好吧,安装,试用,于是就有了这篇不能算文章的博客,附带用ipad照的一张清晨,不算太清晰,摄像头是ipad2的软肋啊。

最近玩微博也有点上瘾,毕竟用手机发还是很方便,随时随地,随拍随发,冷落了自己的博客,也好,微博是一句就ok,而想发泄一大堆话的时候再用博客,两两分工,两不耽误。

(ZT)AS3 对象池 研究

没有评论

原文:

http://www.cnblogs.com/appleseed/archive/2010/01/27/1657691.html

http://www.taoshaw.com/taoshaw/article.asp?id=1913

http://www.richardlord.net/blog/object-pool-class

http://code.google.com/p/bigroom/wiki/ObjectPool

为什么使用对象池?

ok,我们先来看一个例子:假设游戏当中,玩家按下鼠标,那么游戏场景中出现一个美女A,代码是var A:美女A=new 美女A();addChild(A); 放开鼠标美女被清除,

代码是:A.dispose();A=null;如果某个玩家不停地点击鼠标,那么我们的代码将不停的NEW 美女A()而NEW 美女A()其实是很费时消耗系统性能这是问题就来了,假设NEW 美女A()消耗了2KB内存,玩家疯狂点一千次,那么我们的美女类就不断地创建,清除,创建,清除,那么我们的游戏内存直接增加1000*2kb,因为 FLASH是托管的GC清理资源,具体什么时候清理只有GC知道,那么我们的游戏的性能就………可是如果我们有了对象池那又是一种什么情况 呢?首先美女将被new 美女A() 然后美女A被放入到对象池中存放,当鼠标按下的时候我们将执行:ObjectPool. borrowObject():取得美女A,当鼠标按下我们执行 ObjectPool.returnObject():这样子美女又被放入到对象池中存起来了,执行一千次,由于使用对象池取得美女A和放入美女A中不涉 及到对象的创建和销毁,所以我们的游戏不会导致系统资源的增加。因为美女A被访到内存池中存储起来重复利用了。

了解对象池

对象池的工作原理:

对象池的工作原理的核心有两点:使用和缓存,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使 用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。

优点:能快速取出对象节省了NEW对象所产生的cpu,时间的消耗。能很好的控制内存的占用,使用时从对象池取出,使用完毕放回。中间不涉及到对象 销毁创建,所以内存占用是定量的。同时如果对象池提前

缺点:对象池同样消耗new同样对象所消耗的时间,对象池从创建到结束消耗定量的内存。对象池只适合大量的对象需要被重复创建使用销毁创建使用销毁 的情况。非提前初始化式内存池,缓存as值类型的对象如:Point反而产生更大的消耗。

要实现一个对象池,一般会涉及到以下的几个类:

目标对象(SomeObject)类

该类就是程序中频繁使用的对象。

对象池(ObjectPool)类

该类主要用于管理对象的借出和归还,并通知对象池完成相应的工作。它至少包含两个方法:

  borrowObject():用于从池中借出对象;

  returnObject():将对象归还到池中;

其他:

flash player中有两个开销比较大的操作:对象的创建(object creation)和垃圾回收(garbage collection)。如果我们把不需的对象存放到一个对象池,当需要同类型的对象时直接从对象池里面获取。这样可以减少“对象的创建”,垃圾回收机制 对象池里也不会工作,从而减少开销。

用法:
从ObjectPool中获取一个SomeClass的实例:

程 序代码
var obj:SomeClass = ObjectPool.getObject( SomeClass );

当你不 需要一个对象,把它存进对象池中:

程序代码
ObjectPool.disposeObject( obj );
/*
* Author: Richard Lord
* Copyright (c) Big Room Ventures Ltd. 2008
* Version: 1.0.0
*
* Licence Agreement
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/

package uk.co.bigroom.utils
{
import flash.utils.Dictionary;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;

/**
* Manages objects by retaining disposed objects and returning them when a new object
* is requested, to avoid unecessary object creation and disposal and so avoid
* unnecessary object creation and garbage collection.
*/
public class ObjectPool
{
private static var pools:Dictionary = new Dictionary();

private static function getPool( type:Class ):Array
{
return type in pools ? pools[type] : pools[type] = new Array();
}

/**
* Get an object of the specified type. If such an object exists in the pool then
* it will be returned. If such an object doesn't exist, a new one will be created.
*
* @param type The type of object required.
* @param parameters If there are no instances of the object in the pool, a new one
* will be created and these parameters will be passed to the object constrictor.
* Because you can't know if a new object will be created, you can't rely on these
* parameters being used. They are here to enable pooling of objects that require
* parameters in their constructor.
*/
public static function getObject( type:Class, ...parameters ):*
{
var pool:Array = getPool( type );
if( pool.length > 0 )
{
return pool.pop();
}
else
{
return construct( type, parameters );
}
}

/**
* Return an object to the pool for retention and later reuse. Note that the object
* still exists, so you need to clean up any event listeners etc. on the object so
* that the events stop occuring.
*
* @param object The object to return to the object pool.
* @param type The type of the object. If you don't indicate the object type then the
* object is inspected to find its type. This is a little slower than specifying the
* type yourself.
*/
public static function disposeObject( object:*, type:Class = null ):void
{
if( !type )
{
var typeName:String = getQualifiedClassName( object );
type = getDefinitionByName( typeName ) as Class;
}
var pool:Array = getPool( type );
pool.push( object );
}
}
}

优化 Adobe Flash 平台的性能:对象池
package
{
import flash.display.Sprite;

public final class SpritePool
{
private static var MAX_VALUE:uint;
private static var GROWTH_VALUE:uint;
private static var counter:uint;
private static var pool:Vector.;
private static var currentSprite:Sprite;

public static function initialize( maxPoolSize:uint, growthValue:uint ):void
{
MAX_VALUE = maxPoolSize;
GROWTH_VALUE = growthValue;
counter = maxPoolSize;
var i:uint = maxPoolSize;
pool = new Vector.(MAX_VALUE);
while( --i > -1 )
pool[i] = new Sprite();
}

public static function getSprite():Sprite
{
if ( counter > 0 )
return currentSprite = pool[--counter];
var i:uint = GROWTH_VALUE;
while( --i > -1 )
pool.unshift ( new Sprite() );
counter = GROWTH_VALUE;
return getSprite();
}

public static function disposeSprite(disposedSprite:Sprite):void
{
pool[counter++] = disposedSprite;
}
}
}

package
{
import flash.display.Sprite;
import flash.events.MouseEvent;

public class SpritePoolTest extends Sprite
{
private const MAX_SPRITES:uint = 100;
private const GROWTH_VALUE:uint = MAX_SPRITES >> 1;
private const MAX_NUM:uint = 10;

private var container:Sprite;

public function SpritePoolTest()
{
SpritePool.initialize ( MAX_SPRITES, GROWTH_VALUE );
var currentSprite:Sprite;
container = SpritePool.getSprite();
addChild ( container );
for ( var i:int = 0; i< MAX_NUM; i++ )
{
for ( var j:int = 0; j< MAX_NUM; j++ )
{
currentSprite = SpritePool.getSprite();
currentSprite.graphics.beginFill ( 0x990000 );
currentSprite.graphics.drawCircle ( 10, 10, 10 );
currentSprite.x = j * (currentSprite.width + 5);
currentSprite.y = i * (currentSprite.width + 5);
container.addChild ( currentSprite );
}
}
stage.addEventListener ( MouseEvent.CLICK, removeDots );
}

private function removeDots(e:MouseEvent):void
{
while (container.numChildren > 0 )
SpritePool.disposeSprite (container.removeChildAt(0) as Sprite );
}
}
}

转帖:如果你不明白爱情——短短一篇文章竟然说透了爱情的本质。

没有评论

原来爱情本质是这样

【你和一个人越亲密,会越多看到他的疲惫】

  你爱上一个人,因为她脱俗的气质,因为他运筹帷幄的魄力。我们常常像崇拜明星一样,钟情于一个人。那时候觉得Ta很有力量,似乎能拯救你,能带你进入想要的生活。这种最初的崇拜,却往往会把我们带进阴沟。请注意,无论一个人是花魁、总统、财阀还是行业大拿,只要你成为Ta亲密的人儿,你会更多看到他不为人知、不善伪装的一面。
  她工作的时候光鲜亮丽,但可能私下里非常邋遢、懒惰,常常疲倦得大脑短路;他看起来魅力十足,是社交大人。但可能回到家就疲惫的只会睡觉;他在圈子里是有名的攻坚人才,但在你的身边却十分软弱,事业上的一点失利都会令他心情烦躁,极易发脾气……如果你一直迷恋着Ta闪耀的部分,当你发现,他呈现给你的更多是疲惫的话,那你注定失望,而且是彻底的失望。
这种失望摔下来很疼,而且很有杀伤力。所以我们常看到一个男子疯狂追求一个女孩,但在得到后就弃如敝履;一个女孩迷恋一个优秀的男子,拥有他后却发现不是自己要的幸福……所以有人说婚姻是爱情的坟墓,就是因为他们没有意识到这一点——刚谈恋爱时,我们往往会像“打了鸡血”一样,拼上精力去让对方爱上自己,所以那时候表现出的“努力”常会随着两个人关系的稳定而逐渐软下来。这时候,不是Ta的爱减弱了,而是你们的默契增加了,Ta不必再强撑着装有精神给你看了——疲惫常常是一个人最安全时,所表达出来的常态,再耀眼的人,也需要暗淡来休憩。如果Ta对你黯淡,说明Ta真的信任你,不要再要求Ta也像对外界时一样“强撑精力”的对你。
  我们都有体验,我们自己也常常感到无力,常常在车上瞌睡,常常不想说话,不是嘛?
  你若只爱Ta的精彩,那你还不爱Ta.假若你也尊重Ta的疲惫,就像尊重自己的。我想你就会获得长久的爱情。走入更精彩的人生,而非落入坟墓。

【能两个人一起共享的事,少之又少】

  这个世界上能两个人一起共享的事情,非常少。你可以数数,看电影、压马路、双人电玩游戏、烛光晚餐、游乐园……稍微有点经验的人都知道,这些事只有在刚谈恋爱时才常常做,慢慢的,你们就不需要这些事来连接你们了,因为它们浪费时间还费钱。即使你们在一起做这些事,内心体验也常常不同。一起看电影,其实是各看各的,彼此都有自己的理解;压马路,也是各看各的风景,即使打闹嬉戏,也就15分钟,就会累了,然后继续走路,看自己的风景;一起吃饭,味道也是自己才知道,你觉得好吃,他可能觉得不好吃……
  所以两个人在一起,能做最多的事,就是陪伴。我干我的,你干你的,我们只是在一个空间里而已,你知道有另一个人坐在那儿,你就感到很踏实,而已你看那些已经进入稳定爱情的两个人,他们很相爱。但他们下班回家一起吃一顿饭后,还是一人一台电脑,他打游戏,她逛淘宝——有2-3小时的晚间黄金时间,他们都是独享的——这就是所谓的“个人空间”,虽然那2-3个小时,他们都在自己的世界里,但不同的是,身边伴着另一个人——这就是爱情,最常态的爱情。
  我们刚爱上一个人,那时的爱情并不是爱情的常态,而是爱情的初始亢奋态。如果你认定爱情就一直是这样了,那你是看错爱的本质。你每天还在变化呢,为什么爱情就不会变化?14—30岁是你的亢奋态,30—70岁才是你的常态。其实比比时间就知道,哪个是你的常态。爱情也是一样。
  很多放弃爱情的,对婚姻失望的,甚至离婚的,都是因为要求爱情一直亢奋,不接受它的常态。
  你还要求什么呢?有个人愿意用很多的时间和你呆在一起,即使他是看着自己的书,玩着自己的游戏,但这就是爱情。你也可以看自己的书,玩自己的游戏。悦纳了这样彼此相伴又相对独立的空间,你们才能有机会拥有未来N年精彩的瞬间。

【爱情的现实=表达+情感+财产+责任】

  一个人说“来,咱们做男女朋友吧”或者“我爱你”,和你确定了关系,Ta只给了你10%的爱情;Ta把你带入自己的人际圈子、家庭,这是对你的情感认可,此时Ta给了你30%的爱情;如果Ta告诉你Ta的真实月收入,并把自己的账户和你联名,用你的钱也给你钱用,这时可以说Ta给了你60%的爱情;当Ta小到买菜,购买电器,大到职业规划、人生计划都把你考虑在内时(注意,这种考虑是行为上的,而非口头上的),才能说,他给了你接近100%的爱情。为什么是接近?因为留点余地,就总有变得更好的空间。
  请注意,这四个部分组成爱情,缺一不可,而且一层比一层比重更大,但都必须建立在前面一层的基础上。如果一个男人和你确认关系,然后给你钱用,却没有把你带入圈子,他很可能只是像和你玩玩。虽然他给你钱,但因为没有给你圈子,所以根据这个公式,他依然只给你10(百分号)的爱情。
  如果你总抱怨爱情抛弃了你,或者世上没有真爱。拜托你重新认识一下爱情的现实吧!
  如果你不在相恋前,认识到这些现实都是爱情的必然,很可能你会成为很轻易的“分手者”,也会对爱情失去信心。
  最后,我们再来修正一下爱情的定义:因为爱,你可以忍耐它许多无情的地方,这才叫爱情。
  圣经上无比精准的说:“爱是恒久忍耐”——忍耐疲惫,忍耐无聊,忍耐独处,忍耐现实——忍耐并不是压抑,而是因为懂得所以悦纳——我们都是为了快乐才去忍耐的,当你发现爱情的现实才是你寻找伴侣真正的目标时,相信你一定会拥有比想象的好100倍的爱情。

那些花儿

没有评论

桃花虽然都枯萎,还可以爱上玫瑰。把力气花在回忆上太浪费,是谁先放弃谁无所谓,曾经演出太完美,只是你半途而废。-品冠《桃花》

Because of you

2 评论

拖着疲惫的身体回到家,已经12点了,脑子却还活跃着跳跃着,无法入睡。这一两个月来,总是这样,即使加班加到凌晨3.4点,躺在床上也还需要很久才能入睡,当然睡眠质量也不会高了。 没办法,工作需要,为了赶项目,在年前都要这么一直忙下去,既然选择了做这个项目,做事不能虎头蛇尾,那就要坚持下去。

最近一段日子,不知怎么了,朋友,亲人都在跟我提该谈恋爱了之类的种种,甚至有直接要给我介绍女朋友的,在这么一个快节奏的环境下,我选择了逃避,真的真的没有这份精力和时间,现在最想做的就是做好自己的工作,劳逸结合,休息好。仅此而已。也许以后我回想这一两年,能用上“充实而又踏实的活着”这样的标签吧,知足了。

最重要的是,因为我有你们,我亲爱的朋友们,我不孤单。

奥巴马换房记

2 评论

奥巴马是我买的一条小蜥蜴的名字,因为它又黑又瘦,所以给它起名奥巴马。

奥巴马刚买回来的时候十分温顺,放在手里都很安静,可是近段日子,它变的脾气暴躁起来,每天晚上都能听到奥巴马挠宠物盒的声音。我知道它是在不满自己的住房条件,将心比心我要是一个人住在不足5平方的小屋子里,也会憋出一身气来。
更多

2010年岁末

1 评论

岁末了,明天就有三天假期,今天本来准备加班到7点,没想老友Cecilia打来电话,原来她休假了,在家无聊透顶,LL又加班,不能陪她。她还没来过五道口,我说那就来吧正好发工资,我请你吃饭,随便挑地。于是不到6点就跑了,五道口商厦里人可真多,我们竟然去了“小月月”去的巴贝拉 哈哈哈。不过也是排了号等了20分钟才有位置。

吃完饭,顺便取出50个游戏币在顶层的电玩世界玩了两个多小时,赛车,摩托,打地鼠,甚至小孩子玩的弹弹兔,我俩都尝试了,我竟然没有蹦过她,捂脸泪奔~最令人郁闷的是夹娃娃夹了很多次,一个也没有夹上来过,好吧,都留到明年吧。 在回来的地铁上和Cecilia感叹时间如梭,春节LL和她就要一起回我们老家领证咯,明年估计就要做准妈妈,她可只比我大8天而已嘛。你们这些人啊 都不等等我 一个个都急着结婚!
更多

1 / 212