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