2

以下运行时错误:

输出太长,但这是主要思想:

“ > 范围外错误”

" > [File_fla::MainTimeline~[O] Object[A] Object[A] *[A] *[A]] {} ()"

对每个 abc 字节码重复上一行:pushscope、减法、乘法和 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 ),因为添加上面的注释行可以解决它。

编辑:这张图片显示了一个轻微的代码变体和一个调试模式 swf 的反编译(由 Daniel 在评论中指出)
http://imageshack.us/a/img853/4057/stackoverflowdecompile.jpg

如果问题的根源定位正确,问题就变成了为什么连续'dup'调用的函数进入无限循环导致堆栈溢出?

4

1 回答 1

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 的 distance()方法更快

有点离题,记住Object有点慢,你不应该在你的情况下使用它。Bellow是一个非常基本的测试:

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
于 2012-12-08T00:57:22.177 回答