Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 计算战争迷雾的最快方法是什么?_Actionscript 3_Optimization - Fatal编程技术网

Actionscript 3 计算战争迷雾的最快方法是什么?

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

我的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: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函数在游戏的每一帧中调用。那么,它需要每帧生成整个世界