【问题标题】:What's the optimal way to get the absolute difference between two angles in degrees (AS3)?获得两个角度(AS3)之间绝对差的最佳方法是什么?
【发布时间】:2014-09-27 23:54:51
【问题描述】:

我正在开发一个 2.5D 游戏引擎,其中角色可以以任意角度移动,但需要以最接近他们实际移动角度的预先绘制的“旋转”加载动画。他们的实际动作可能会以某种方式作弊。 由于它们随机改变方向,这意味着每次它们旋转时,我们都需要搜索一个向量,其中“旋转”——精灵表——可用。

当我旋转整个相机时,这会成为一个大问题,因为我们需要将所需的旋转与每个角色、房屋等的 4、8、12 或 16 个可用旋转进行比较,屏幕上最多 256 个时间。最繁重的代码是获取每个已知旋转和请求的旋转之间的差异。也就是说,如果 AI 请求 346º 的旋转,我们会迭代让我们假设这个角色旋转 12 次,然后看到他们有一个 330º 的预绘制图纸和一个 0º 的图纸。阻塞的代码是一个非常简单的函数,可以查看这两个角度中的哪一个更接近 346º。这听起来很傻,但确实如此——因为我必须在 12 个预先绘制的旋转中的每一个、256 个字符中的每一个、每一帧上运行它。

目前,对于每个已知的旋转,我都会将其与请求的旋转(角色运动的方向)进行检查,并查看哪个比较最接近。这是我用来获得差异的功能,我正在寻找一种让它更快的方法,因为由于某种原因它是一个巨大的猪,完全不成比例。显然 abs 和 min 很慢。我知道我可以使用辅助变量,但这似乎并不是减慢它的原因。我们可以假设通过的度数已经在 0-360 的范围内,但我们无法猜测它们的顺序:

public static function AngleDifference(a:Number,b:Number):Number {
        var dif:Number = Math.abs(a-b);
        return (Math.min(dif,360-dif));
    }

我想知道以某种方式包装它是否会更快,四舍五入到预设的哈希表,甚至是某种疯狂的位数学。它基本上是排序功能的一部分...

【问题讨论】:

    标签: actionscript-3 modulo


    【解决方案1】:

    以内存为代价的最快方法将是一个大的二维查找表。如果您的输入是 25 和 180,您将转到第一个查找表中的位置 25,然后转到第二个嵌套查找表中的 180,因此返回 table[25][180]。总空间使用量为 360^2 = 129600 个元素,32 位整数(我认为)约 506 kB 或短整数约 253 kB。

    在混合 short 和 int 时注意静默的加宽和收窄原始转换。

    【讨论】:

    • 另外,我不确定您正在编辑的语言,但如果它是 Java 之类的任何语言,请确保您使用的是整数原语的等价物,而不是完整的 Integer 对象,即会导致严重的严重减速。
    • 它是 AS3,入站值是浮点数。将它们转换为 int 实际上可能比地板或四舍五入要慢。一个巨大的查找表似乎是不可能的......我正在考虑缓存经常使用的组合作为最后的手段,但是 360º 旋转也没有多大意义......
    • @joshstrike 也许它们是浮点数的事实导致计算需要很多时间。你用的是什么硬件?尝试将它们转换为 int 并查看它是否总体上节省时间,因为整数运算应该更快。还有为什么查找表是不可能的?硬件是否存在严重的内存限制?
    • @joshstrike 是的,我认为缓存不是一个好主意,不会有太多的时间局部性参考,所以会有很多颠簸,它可能会减慢速度到头顶
    • 并非所有手机都有 fpu,因此浮点运算必须在软件中完成,这相当于大幅减速。改变你的程序,尽可能多地尝试使用整数,从头到尾。看看有没有帮助。我仍然认为查找表是您最好的选择,查找表超级快,您不会比它们快多少。
    【解决方案2】:

    由于这是 AS3,因此在使用 Math.abs 和 Math.min 函数时,强制转换为 int 会使事情变得更糟,因为它们需要 Number。

    使用浮点数时绕过这些函数的速度提高了 20%。归功于 user305179,在那之后,使函数期望并返回 int 而不是 Number (并使用按位

    根据 Scout 的说法,这在游戏环境中总共快 40-50%:

    public static function AngleDifference(a:int,b:int):int {
        __dif = a>b ? a-b : b-a;
        return (__dif<180?__dif:360-__dif);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2022-09-22
      相关资源
      最近更新 更多