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