读书人

Work种:分时处理[转自天地会]

发布时间: 2012-10-16 09:57:37 作者: rapoo

Work类:分时处理[转自天地会]

Q:Work类用于干什么?
A:分时处理一个需要很长时间才能完成的数组队列

Q:能具体点吗?
A:比如 判断几千个任务 可接受 可完成 等高耗操作的处理

Q:还有呢?
A:……我在给自己找茬是不……

Q:用Work类有什么好处?
A:把复杂业务分时处理,这样用户在游戏的时候就不会因为业务需求产生一顿一顿的感觉。增强用户体验

Q:能再举个例子吗?
A:刚进游戏 渲染场景中几百个人物的时候 如果同时渲染 那性能消耗是非常大的

Q:源码呢?
A:

package com.utils{        import flash.display.Stage;        import flash.events.Event;        import flash.utils.Dictionary;        import flash.utils.getTimer;        /**         *          * @author whh         * 依赖 stage          * 注意:依赖 stage 如果没有bindStage 程序将报错         * 依赖 stage         * 依赖 stage         * 依赖 stage         * 依赖 stage         */        public class Work        {                public static var instance:Work = new Work();                                /**                 * 看这里看这里 这个程序执行 依赖stage 所以先执行bindStage方法 再做其他操作 只需要执行一次                  * 注意:依赖stage 如果没有执行此操作 程序将报错                  * @param stage                 *                  */                                public static function bindStage(stage:Stage):void{                        instance.bindStage(stage);                }                                /**                 *                   * @param id                 * @param datas                 * @param handler                 * handler        example:                 *                 public function workHandler(data:*):void{                 *                         //todo                 *                 }                 */                                public static function addTask(id:String,datas:Array,handler:Function):void{                        instance.addTask(id,datas,handler);                }                                public static function removeTask(id:String):void{                        instance.removeTask(id);                }                                /**                 * stage 用于监听Event.ENTER_FRAME事件;                 */                                private var stage:Stage;                                private var dict:Dictionary;                                private var eachTime:int;                                private var taskCount:int;                                public function Work()                {                        dict = new Dictionary();                }                                /**                 * @param stage                 *                  */                                public function bindStage(stage:Stage):void{                        this.stage = stage;                }                                /**                 * 添加任务                  * 注意:依赖stage 如果没有bindStage 程序将报错                  * @param id                 * @param datas                 * @param handler                 *                  */                                public function addTask(id:String,datas:Array,handler:Function):void{                        var task:WorkSpace                        var len:int;                                                len = datas ? datas.length : 0;                        if(!len){                                return;                        }                                                task = dict[id];                        if(!task){                                task = new WorkSpace(id);                                dict[id] = task;                                taskCount++;                                eachTime = (1000/stage.frameRate*calcTime)/taskCount;                        }                                                task.datas = datas;                        task.handler = handler;                        task.index = 0;                        task.len = len;                        stage.addEventListener(Event.ENTER_FRAME,enterFrameHandler);                }                                /**                 *为什么是0.618? 随便写的呗~ 黄金比例啊                 *还有0.382 让给flashplayer去做渲染                 *我是不是太仁慈了 具体这个值应该多少靠谱 嗯 兄弟 你们自己配~                 */                                private var calcTime:Number = 0.618;                                /**                 * 移除任务                 * 注意:依赖stage 如果没有bindStage 程序将报错                  * @param id                 *                  */                                public function removeTask(id:String):void{                        if(dict[id]){                                taskCount --;                                dict[id] = null;                                delete dict[id];                        }                                                if(taskCount<=0){                                taskCount = 0;                                stage.removeEventListener(Event.ENTER_FRAME,enterFrameHandler);                        }else{                                eachTime = (1000/stage.frameRate*calcTime)/taskCount;                        }                }                                /**                 * completeList 用于记录哪些任务已经完成完毕了                  */                                private var completeList:Array = [];                /**                 * 执行任务                  * @param event                 *                  */                                private function enterFrameHandler(event:Event):void{                        var t:int;                        for each(var task:WorkSpace in dict){                                t = getTimer();                                while((getTimer()-t)<eachTime){                                        if(task.doFunction()){                                                completeList.push(task.id);                                                break;                                        }                                }                        }                        while(completeList.length){                                removeTask(completeList.pop());                        }                }                        }}class WorkSpace{        public function WorkSpace(id:String){                this.id = id;        }                public var id:String;        public var datas:Array;        public var len:int;        public var index:int;        public var handler:Function;                public function doFunction():Boolean{                handler(datas[index]);                return ++index>=len;        }}

?

Q:这么长谁爱看啊
A:……

Q:怎么用啊?
A:

package{        import com.utils.Work;                import flash.display.Sprite;                public class Test extends Sprite        {                public function Test()                {                        //首先 要绑定stage!!!!这个是必须的                        Work.bindStage(stage);                                                var arr:Array = [100,100,100,100,100,100,100,100,100,100,100,100,100];                        //然后就是执行操作                        Work.addTask("task",arr,dotest);                        //如果操作中途不想继续执行了                        //Work.removeTask("task");                }                                private function dotest(data:*):void{                        var i:int = 0;                        while(data>0){                                i+=data--;                        }                        trace(i)                }        }}

?

?

Q:必须绑定stage吗?
A:必须!!!!一定!!!!!我要stage!!!!Work.bindStage(stage)!!! 只需要执行一次哦 亲!

Q:能用在A*吗?
A:思想可以用在上面 如果真要用 需要自己做一些修改 嗯。 因为A*的数组不定长

Q:具体什么思想?
A:嗯 就是代码的enterFrameHandler部分.

Q:开源的目的是什么?
A:技术分享 共同讨论

读书人网 >Web前端

热点推荐