获取游戏中对象的位置

时间:2010-09-11 11:38:08

标签: java getter-setter

我最近开始制作简单的2D游戏,并遇到了两难 - 使用或不使用getter和setter方法来处理对象的x和y位置。如果我不使用方法,但是直接访问变量会更加清晰,而且对对象的许多方法调用会损害性能。此外,获取和设置位置仍然很简单,所以这里真的不需要封装吗?或者我们是否应该始终坚持使用getter和setter方法的惯例?

4 个答案:

答案 0 :(得分:5)

坚持惯例总是更好。此外,JIT将简化操作,以便直接访问字段,而不是遍历所有方法堆栈。

它被称为方法内联。


  

Java VM的Java 2版本在运行时自动内联简单方法。在未优化的Java VM中,每次调用新方法时,都会创建一个新的堆栈帧。创建新的堆栈帧需要额外的资源以及堆栈的一些重新映射,最终结果是创建新的堆栈帧会产生很小的开销。

     

方法内联通过减少程序调用的方法调用次数来提高性能。 Java VM内联代码内联返回常量或仅访问内部字段的方法。


资源:

关于同一主题:

答案 1 :(得分:4)

你不应该有getter和setter,也不应该公开属性。

相反,你有像.updatePosition(),. draw(),. moveTo(),. collideWith()等方法,所以你不需要直接从外面获取或设置值。

有一些罕见的情况,你真的想直接从外部获取/设置值,但这些实例很少见,而且往往表明设计不好(尽管有效用途)

答案 2 :(得分:3)

我会使用getter / setter。为什么?

  1. 封装是。也许你会改变以后存储位置的方式(例如笛卡尔到极地?)。 Getters / setters将允许您执行适当的转换。
  2. Setters将允许您的对象强制执行条件(例如,x> 0且<10?)
  3. 另一个原因(虽然可能不适合您当前的需求)是许多Java框架以常规setX / getX格式为setter / getter使用反射和内省类。通过实现这些方法,您的类可立即在各种框架中重用。

    在知道问题之前不要担心性能问题。过早的优化会让你头疼太多。

答案 3 :(得分:1)

Stendhal中,我们确实使用了getter / setter。我们每回合处理大约60,000个可移动物体。根据我在Stendhal的经验,简单的方法根本没有任何可衡量的性能影响。为了找到各种问题,我们做了一些简单的分析,并在过去几个月中大幅提升了性能。

我们的主要瓶颈是寻路(特别是与其他可移动物体的碰撞检测)。有一个问题就是在每次可能的碰撞检查中创建一个新的Pair对象,或者在要求实体的位置和大小时创建一个新的Rectangle对象。

在Profiler中很容易发现这些东西(参见gamedev上的Profiling server side game loop in java)。

游戏循环逻辑部分之外滞后的其他常见原因是客户端/服务器通信和数据库访问。