在游戏中使用'Number'类而不是原语?

时间:2014-04-23 18:50:01

标签: java performance numbers lwjgl primitive

现在,我正在java+LWJGL开发一个沉重的2D游戏(好吧,当我说“沉重的2D游戏”时,它看起来很有趣,但相信我,我会使用很多资源),好吧,假设我有TOC(TOC在巴西,可能用英语... OCD?),所以我必须写,因为我将使用第三方,API 。比如,我有一个用于LWJGL的API(一个用于OpenGL API的API,lol),以及许多其他API类。而且,在这些API中,在构造函数中,我从不使用原语(仅构造函数,我仍然使用基元的字段),但是而是使用Number类(所以我可以调用使用Integer,Float,Double和我想要的任何方法。然后,在构造函数中,我使用number.doubleValue()number.intValue()翻译数字,具体取决于我想要的内容。

那么,这可以显着影响我游戏的性能吗?到目前为止,在早期 - 中期开发阶段,我的表现仍然可以,但我担心它会导致我后期重写大部分代码。哦,抱歉我的英语不好,这不是我的主要语言。

1 个答案:

答案 0 :(得分:1)

除非你真的需要盒子基元,否则不要使用盒装原语。一个很好的理由可能是

  • 您需要未定义状态的表示(使用null
  • 你把它们放进Object - 接受类(List,Set,Map,...)并且想要避免装箱(通过一直使用盒装值)

任何与性能相关的事情都必须首先进行基准测试,否则你会发现自己优化了一段程序,没有花费可测量的时间,甚至也没有"悲观化"它。 Java中的低级优化非常困难,因此您最好将注意力集中在清晰度和可读性上,这样您就可以测量速度,识别瓶颈并在之后优化它们。

关于盒装原语,恕我直言最大的性能影响并非来自对象创建,而是来自间接(创建发生一次,重复缓存未命中代价很高)。

我不同意关于"花哨的OOP东西"的dognose。类提供的所有内容都可以在没有装箱的情况下使用,使用盒装原语是OOP方法无法做到的痛苦(意外的NullPointerException,非工作转换等等,恕我直言太糟糕了)