Performance 以最快的方式找到两点之间的距离
此代码使用距离公式计算两点之间的距离,Math.sqrt((x1-x2)^2+(y1-y2)^2)。我的第一个点有Performance 以最快的方式找到两点之间的距离,performance,flash,actionscript-3,math,distance,Performance,Flash,Actionscript 3,Math,Distance,此代码使用距离公式计算两点之间的距离,Math.sqrt((x1-x2)^2+(y1-y2)^2)。我的第一个点有mmx和mmy协调,第二个点有ox和oy协调。我的问题很简单,有没有更快的计算方法 private function dist(mmx:int, mmy:int, ox:int, oy:int):Number{ return Math.sqrt((mmx-ox)*(mmx-ox)+(mmy-oy)*(mmy-oy)); } 这是我的代码,谢谢你的帮助 public functi
mmx
和mmy
协调,第二个点有ox
和oy
协调。我的问题很简单,有没有更快的计算方法
private function dist(mmx:int, mmy:int, ox:int, oy:int):Number{
return Math.sqrt((mmx-ox)*(mmx-ox)+(mmy-oy)*(mmy-oy));
}
这是我的代码,谢谢你的帮助
public function moveIT(Xmouse, Ymouse):void{
f = Point.distance( new Point( Xmouse, Ymouse ), new Point( mainSP.x, mainSP.y ) );// distance between mouse and instance
distancePro = Point.distance( pointO, new Point( mainSP.x, mainSP.y ) );// distance from start point
if ( f < strtSen ){ // move forward
tt.stop(); tt.reset(); // delay timer on destination
mF = true; mB = false;
ag = Math.atan2((Ymouse - mainSP.y),(Xmouse - mainSP.x)); // move-forward angle, between mouse and instance
}
if (mF){ /// shoot loop
if (f > 5){// 5 pixel
mainSP.x -= Math.round( (400 /f) + .5 ) * Math.cos(ag);
mainSP.y -= Math.round( (400 /f) + .5 ) * Math.sin(ag);
}
if ( distancePro > backSen ){// (backSen = max distance)
mF = false;
tt.start();// delay timer on destination
}
}
if (mB){ /// return loop
if ( distancePro < 24 ){// back angle re-calculation
agBACK = Math.atan2((y1 - mainSP.y),(x1 - mainSP.x));
}
mainSP.x += (Math.cos(agBACK) * rturnSpeed);
mainSP.y += (Math.sin(agBACK) * rturnSpeed);
if ( distancePro < 4 ){ // fix position to start point (x1,y1)
mB = false;
mainSP.x = x1; mainSP.y = y1;
}
}
}
private function scTimer(evt:TimerEvent):void {// timer
tt.stop();
agBACK = Math.atan2((y1 - mainSP.y),(x1 - mainSP.x));// move-back angle between start point and instance
mB = true;
}
公共函数moveIT(Xmouse,Ymouse):无效{
f=点距离(新点(Xmouse,Ymouse),新点(mainSP.x,mainSP.y));//鼠标和实例之间的距离
distancePro=Point.distance(pointO,新点(mainSP.x,mainSP.y));//距起点的距离
如果(f5){//5像素
mainSP.x-=数学圆整((400/f)+.5)*数学圆整(ag);
主SP.y-=数学圆整((400/f)+.5)*数学正弦(ag);
}
如果(distancePro>backSen){/(backSen=最大距离)
mF=假;
tt.start();//目标上的延迟计时器
}
}
if(mB){///返回循环
如果(distancePro<24){//后角重新计算
agBACK=数学atan2((y1-mainSP.y),(x1-mainSP.x));
}
mainSP.x+=(数学cos(agBACK)*rturnSpeed);
mainSP.y+=(数学sin(agBACK)*rturnSpeed);
if(distancePro<4){//将位置固定到起点(x1,y1)
mB=假;
主SP.x=x1;主SP.y=y1;
}
}
}
专用函数scTimer(evt:TimerEvent):void{//timer
tt.stop();
agBACK=Math.atan2((y1-mainSP.y),(x1-mainSP.x));//向后移动起点和实例之间的角度
mB=真;
}
另外:pointO=新点(x1,y1)代码>设置起点。我不能使用mouseX和mouseY,因为父类调用应用程序的方式,所以我可以将x和y传递给我的循环。使用
它将在本机代码中执行,这通常比解释代码快
如果您在三维空间中,请使用
如果您正在执行碰撞检测,比较向量(2D或3D)的大小是非常常见的,并且由于使用sqrt
功能,这可能会占用大量资源。相反,如果您比较,它的性能会更好。我认为,如果您在线调用函数而不是进行实际的函数调用,这是最快的方法
f = Math.sqrt((Xmouse-mainSP.x)*(Xmouse-mainSP.x)+(Ymouse-mainSP.y)*(Ymouse-mainSP.y));
distancePro = Math.sqrt((x1-mainSP.x)*(x1-mainSP.x)+(y1-mainSP.y)*(y1-mainSP.y));
使用Point.distance
可读性更高,但速度要慢好几倍。如果你想要速度,你需要直接内联你的数学。调用一个静态函数有点贵。通过执行以下操作,可以节省该开销:
private var sqrtFunc = Math.sqrt;
private function dist(mmx:int, mmy:int, ox:int, oy:int):Number{
return sqrtFunc((mmx-ox)*(mmx-ox)+(mmy-oy)*(mmy-oy));
}
我有一个同样简单的问题:您是否确定此代码的速度是一个问题?。。好的,我只是想知道是否还有其他方法。例如,一个特殊的数学公式或对数字的位计算。我的应用程序就像一个实时的交互式显示,包含大量的实例。我需要好的速度,当然。但俗话说“过早优化是万恶之源”。不要试图优化一段代码,除非您已经确定它在整个运行时中占了很大一部分。例如,如果这只占运行时间的1%,那就没有意义了。@OliCharlesworth,我完全同意你的观点,但是在这种情况下,重要的是要充分了解API,不要重新发明轮子。你确定这一点吗?我对这两种情况进行了快速计时,而你的计时结果比OP慢了4倍。@KataxEmperorKatax:你是否验证了这一点?我希望有人告诉我他们是这样做的,因为当我测试它时,我发现这个答案比你试图优化的答案慢了4倍。@BrianGenisio--如果你对我的函数有任何优化的想法,请让我知道……:@我没有更好的主意了。我认为你原来的功能是最有效的。但是我测量了调用这两个函数的时间,每次调用10000次。在调试模式下,它比Point.distance
快4倍,在发布模式下,它比Point.distance
快10倍@Brian Genisio,当您进行基准测试时,是否包含Point
对象的实例化?创建许多新对象将对基准测试产生不利影响,通常对于大型数据集,一些对象可以重用。你测试过这个吗?我已经对此进行了测试,似乎通过这种方式通过变量引用增加了大约15%的开销。您能给出一个代码示例来证明静态函数比通过变量解析函数更昂贵吗?更重要的是,你能举个例子证明你说的是真的吗?我很抱歉这么难挑战,但这是我在这条线上看到的第二个答案,实际上比OP要求的要快。我用一些旧版本的flash player测试了它。它可能在某个时候发生了变化。我很快会再次测试它并在这里发布。
private var sqrtFunc = Math.sqrt;
private function dist(mmx:int, mmy:int, ox:int, oy:int):Number{
return sqrtFunc((mmx-ox)*(mmx-ox)+(mmy-oy)*(mmy-oy));
}