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:技术分享 共同讨论

你可能感兴趣的:(处理)