以下运行时错误:
输出太长但这是主要想法:
“>外部范围错误”
“> [File_fla :: MainTimeline~ [O] Object [A] Object [A] * [A] * [A]] {}()”
为每个abc字节码重复上一行:pushscope,subtract,multiply和convert_d等。
“> VerifyError:错误#1023:发生堆栈溢出。”
代码:
import flash.geom.Point;
function d(p1:Object, p2:Object):Number
{
var dx:Number = p2.x - p1.x;
var dy:Number = p2.y - p1.y;
// problem here as adding this line solves it -> (dx *= 1;)
dy *= dy;
dy += dx;
return dy;
}
var pt1:Point = new Point(0, 0);
var pt2:Point = new Point(1, 0);
d(pt1, pt2);
我对解决错误不感兴趣,
但要知道它为什么会发生:来自知识渊博的用户的解释。
推测:我猜测它可能与流水线操作中的数据危害有关(在准备好之前使用dy),因为添加上面的注释行可以解决它。
编辑:此图显示swfs的反编译为轻微的代码变体和调试模式swf(在评论中由Daniel精确定位)
http://imageshack.us/a/img853/4057/stackoverflowdecompile.jpg
如果问题的来源位置正确,问题就变成为什么连续'dup'调用的函数进入无限循环导致堆栈溢出?
答案 0 :(得分:0)
dy *= dy;
看起来像是在尝试dy(dy = dy*dy;
)。
如果您正在编写一个方形距离函数,则此部分看起来很奇怪:dy += dx;
。
我会这样写:
function d(p1:Point, p2:Point):Number
{
var dx:Number = p2.x - p1.x;
var dy:Number = p2.y - p1.y;
return dx*dx+dy*dy;
}
我没有测试它是否比使用Point's distance()方法
更快有点偏离主题,请记住Object
有点慢,你不应该在你的情况下使用它。贝娄是一个非常基本的测试:
import flash.utils.*;
import flash.geom.Point;
function d(p1:Point, p2:Point):Number
{
var dx:Number = p2.x - p1.x;
var dy:Number = p2.y - p1.y;
return dx*dx+dy*dy;
}
function d2(p1:Point, p2:Point):Number
{
var d:Point = p2.subtract(p1);
return d.x*d.x+d.y*d.y;
}
var p1:Point = new Point();
var p2:Point = new Point(1,0);
var runs:int = 1000000;
var now:int = getTimer();
for(var i:int = 0; i < runs; i++){
d(p1,p2);
}
trace(getTimer() - now + " ms");//99ms distanceSquared using typed objects (untyped is~160ms)
now = getTimer();
for(i = 0; i < runs; i++){
d2(p1,p2);
}
trace(getTimer() - now + " ms");//689ms distanceSquared using subract and getters - slow
now = getTimer();
for(i = 0; i < runs; i++){
Point.distance(p1,p2);
}
trace(getTimer() - now + " ms");//468ms native static method