【问题标题】:More efficient way to check mouse bounds检查鼠标边界的更有效方法
【发布时间】:2014-10-13 15:09:34
【问题描述】:

我目前正在使用此代码检查鼠标的 x 和 y 坐标,看看它是否与我的任何按钮重合。

    if (e.getY() > 204 && e.getY() < 280) {
        if (e.getX() > 190 && e.getX() < 525) {
            selected = 1;
        }
    } else if (e.getY() > 322 && e.getY() < 397) {
        if (e.getX() > 231 && e.getX() < 481) {
            selected = 2;
        }
    } else if (e.getY() > 439 && e.getY() < 512) {
        if (e.getX() > 271 && e.getX() < 442) {
            selected = 3;
        }
    } else if (e.getY() > 560 && e.getY() < 634) {
        if (e.getX() > 282 && e.getX() < 425) {
            selected = 4;
        }
    } else {
        selected = 0;
    }

它可以 100% 工作,但它似乎会减慢我的程序速度。有没有更有效的方法来检查我的鼠标是否在我的 4 个按钮之一上?

谢谢

【问题讨论】:

  • 除非getX()getY() 很慢,否则我认为这段代码不会减慢任何速度。
  • 我建议您查看k-d tree 的分区逻辑,尽管只有四个按钮可能并不会产生太大的影响。正如@JeanLogeart 所说,这真的不应该减慢任何速度,除非每次鼠标更新都会多次调用 lotget.() 真的很慢。您可以通过仅在条件句之前调用一次 getX()getY() 并将它们存储到本地来稍微提高性能,而不是每次调用它们最多 8 次(大多数情况下)。
  • 你如何处理这个结果?如果您在事件调度程序线程中处理此结果,这可能会使您的程序响应缓慢并显得滞后。
  • 您使用的是 SWT 还是什么?在 SWT 中,您有 this
  • 您看到了多少减速?多久调用一次此方法(实际而不是预期),getX 和 getY 的快/慢?

标签: java performance


【解决方案1】:

该代码中唯一慢的部分可能是getX()getY() 方法。 if 逻辑不应该让你的程序减慢太多。

尝试使用变量而不是调用函数:

final int x = e.getX();
final int y = e.getY();
// + same logic

【讨论】:

  • 据我了解,这使您的代码更具可读性而不是更快...stackoverflow.com/questions/25433460/…
  • 我试试这个,看看它是否能解决问题。如果这不能解决它可能是程序中其他地方的问题
  • @wrongAnswer 即使调用的 getter 只是一个简单的“返回成员”,如果您至少使用两次,使用局部变量也不会减慢速度(即使 getter 是内联的,它仍然间接跳转,而局部变量基本上是空闲的;它分配在堆栈上,即 cached 内存,速度非常快)。
【解决方案2】:

您应该使用像private void updateMouse() 这样的私有方法,您可以在需要时调用它,然后将局部变量用于存储getter 方法int x = e.getX()int y = e.getY() 在方法中,这样它就会在您调用时更新方法updateMousegetX()getY()的位置,还可以节省调用getX()getY()所需的效率。

然后把你的代码放进去,像这样:

private void updateMouse() 
{ 
    int x = e.getX(); 
    int y = e.getY()

    **** your if statement here
}

现在您将能够在特定时间运行它,例如每 10 帧,而不仅仅是连续运行。 这应该可以让您节省一点效率。

(对不起,我的英语不好)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多