Actionscript 3 计算战争迷雾的最快方法是什么?
我的FogOfWar类中有以下函数,它计算团队是否可以看到传递给参数的位置:Actionscript 3 计算战争迷雾的最快方法是什么?,actionscript-3,optimization,Actionscript 3,Optimization,我的FogOfWar类中有以下函数,它计算团队是否可以看到传递给参数的位置: package mwoke { public class FogOfWar { public var game:Game; public var team:int; private var cache:Vector.<CachePos> = new Vector.<CachePos>(); private var chars
package mwoke {
public class FogOfWar {
public var game:Game;
public var team:int;
private var cache:Vector.<CachePos> = new Vector.<CachePos>();
private var chars:Vector.<Character> = new Vector.<Character>();
public function FogOfWar($game:Game, $team:int) {
game = $game;
team = $team;
}
public function think():void {
cache.length = 0;
chars.length = 0;
var ent:Character;
for(var i:int = 0; i < game.entities.length;++i) {
if(game.entities[i] == null) continue;
if(!(game.entities[i] is Character)) continue;
ent = Character(game.entities[i]);
if(ent.team != team) continue;
if(ent.vision <= 0.0) continue;
chars.push(ent);
}
}
public function canSee(x:Number, y:Number):Boolean {
if(x < game.minX) return false;
if(y < game.minY) return false;
if(x >= game.maxX) return false;
if(y >= game.maxY) return false;
for each(var v:CachePos in cache) {
if(v.x == x && v.y == y) {
return v.result;
}
}
var res:Boolean = false;
for each(var ent:Character in chars) {
if(Game.distance(x, y, ent.x, ent.y) < ent.vision) {
res = true;
break;
}
}
var tmp:CachePos = new CachePos();
tmp.x = x;
tmp.y = y;
tmp.result = res;
cache.push(tmp);
return res;
}
}
}
internal class CachePos {
public var x:Number;
public var y:Number;
public var result:Boolean;
}
package-mwoke{
公共级雾航{
公共var博弈:博弈;
公共var团队:int;
私有变量缓存:向量。=新向量。();
私有变量字符:向量。=新向量。();
公共函数FogOfWar($game:game,$team:int){
game=$game;
团队=$team;
}
公共功能思考():无效{
cache.length=0;
字符长度=0;
变量:字符;
对于(变量i:int=0;i=game.maxY)返回false;
对于每个(变量v:缓存中的缓存位置){
如果(v.x==x&&v.y==y){
返回v.result;
}
}
var-res:Boolean=false;
对于每个(变量:字符中的字符){
if(游戏距离(x,y,ent.x,ent.y)
我的问题是,游戏中只有3个角色,每秒只能运行4000次,这并不算太多
我可以实现一个缓存,这样它可以缓存大多数公共位置,但是,我还可以做些什么来优化它?如果您的角色有一个可视半径,您可以维护一个数据结构,该结构会随着友好角色的移动而更新,这表明地图的哪些部分是可见的 然后,检查某个位置是否可见与检查地图上该位置的数据结构值一样快 编辑:
您还可以使用平方距离而不是绝对距离,这样可以避免调用(有些昂贵)
Math.sqrt
函数。基本上,做一个Game.DistanceSquared
检查。如何维护一个对象列表,将角色位置和查看半径表示为精灵上的圆(这不是显示列表的一部分),每次有人移动时,他们的圈都会被角色或中间类更新。这样你就不必每次都重复循环
当你想知道一个点是否在FOW范围内时,你可以在所有圆圈的精灵上做一个命中测试。额外的优势是你甚至可以使用数据来绘制FOW
警告;虽然我认为使用内部函数应该更快(比如命中测试)我没有测试过它,所以它可能不会更好。使用它的诀窍是不将它包括在显示列表中,一旦你将fow精灵添加到显示列表中,你会看到性能下降。关于Game.distance方法,它足够快吗?它是
Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
,并且它是使用优化器内联的。我曾考虑将所有字符存储在一个向量中,因此它不需要遍历所有实体。更新代码后,我更喜欢1d缓存数组,而不是2d缓存数组,因为它节省了更多内存。think函数在游戏的每一帧中调用。那么,它需要每帧生成整个世界