使用公共静态字段,良好的编程习惯/快速?

Arm*_*ich 5 java performance

我正在用Java编写一个大型游戏,我正在尝试优化代码,但也要保持代码整洁有序.现在我不确定是否应该使用具有许多实例使用的几个变量的单个类的公共静态字段.

例如,类摄像机具有x和y位置,用于定义用户正在查看的地图的哪个部分以及需要绘制到屏幕的内容.目前我正在使用5万个单位进行基准测试,我有以下选项来绘制它们.

1:在每个单元中存储对摄像机实例的引用,并在绘制时调用getX()和getY():

public void paint()   
{   
   paint(x - camera.getX(), y - camera.getY());  
}  
Run Code Online (Sandbox Code Playgroud)

2:在绘制时,将摄像机的坐标作为每个单元的参数提供:

public void paint(int cameraX, int cameraY)  
{   
   paint(x - cameraX, y - cameraY);  
}
Run Code Online (Sandbox Code Playgroud)

3:使摄像机类的x和y变量保持静态:

public void paint()   
{   
   paint(x - Camera.x, y - Camera.y);  
}
Run Code Online (Sandbox Code Playgroud)

我感兴趣的是通常被视为最佳解决方案,如果它影响性能.也许有更多方法可以做到这一点我还没有想到呢?

谢谢!

Win*_*ert 3

我建议您创建一个 Painter 类并执行以下操作:

public void paint(Painter painter)  
{   
   painter.draw(x, y, unit_sprite);
}
Run Code Online (Sandbox Code Playgroud)

这样,单位就不必担心摄像机的存在。至于如何运作,与该单位无关。该单元只需要知道如何在全局坐标方案上绘制自己,画家就会理解它与实际屏幕坐标的关系。

为什么这是个好主意?

  • 减少代码,每个单元不必担心翻译到正确的坐标系。所有这些代码都只存在于一个位置。
  • 易于改变。例如,假设您决定实现缩放功能。如果每个单位都做自己的翻译,那就很痛苦了。但是,如果所有逻辑都在画家中,您可以修改画家来负责重新缩放图像并确定正确的偏移量。
  • 依赖性减少,这些单元不知道相机是什么,它们更简单,因为它们不担心它。

关于您提出的解决方案:

  1. 在对象上存储对相机的引用假设只有一个相机。如果您实现分割视图之类的东西怎么办?这可能不太可能,但通过存储参考,您几乎不必要地将自己锁定在一个视角中。
  2. 拆分变量的问题在于,从逻辑上讲,这两部分是一项。这使得弄清楚发生了什么变得有点困难,如果有一天您需要更多参数,则会导致问题,并且还会向设备提供它实际上不需要的信息。
  3. 这会遇到与#1 相同的问题,它将你锁定在一个到处使用的单一摄像头中。该单位不应该负责定义相机的使用方式。

关于性能:

差异几乎没有。我不确定哪种方法会在性能之战中获胜,但我可以告诉您,如果您遇到性能问题,它们会出现在其他地方(我猜在实际的位图传输功能中)。通过将与偏移相关的所有代码组合到一个位置,我提出的方法将使实现优化变得更容易。例如,常见的优化是不绘制屏幕外的东西。如果您有 20 个函数都计算偏移量并调用绘图函数,则必须转到每个函数并更改它们。如果您使用画家,那么您可以简单地更改画家类以忽略在可见区域之外绘制的请求,然后就完成了。

一般而言,关于静态变量:

我认为静态变量(和单例)是全局变量,因此实际上从不使用它们。让它们保持静态将我与特定的决定联系起来。我不够聪明,无法预先做出所有正确的决定,因此我需要灵活的代码。

一些准则:

  1. 如果您发现自己需要访问对象内部的数据(即 x,y 值),请考虑是否应该告诉该对象通过调用方法来执行某些操作。即告诉不要问。
  2. 如果一个对象(如 Painter)仅用于对象的特定任务,那么它应该是参数而不是成员变量。