我正在用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)
我感兴趣的是通常被视为最佳解决方案,如果它影响性能.也许有更多方法可以做到这一点我还没有想到呢?
谢谢!
我建议您创建一个 Painter 类并执行以下操作:
public void paint(Painter painter)
{
painter.draw(x, y, unit_sprite);
}
Run Code Online (Sandbox Code Playgroud)
这样,单位就不必担心摄像机的存在。至于如何运作,与该单位无关。该单元只需要知道如何在全局坐标方案上绘制自己,画家就会理解它与实际屏幕坐标的关系。
为什么这是个好主意?
关于您提出的解决方案:
关于性能:
差异几乎没有。我不确定哪种方法会在性能之战中获胜,但我可以告诉您,如果您遇到性能问题,它们会出现在其他地方(我猜在实际的位图传输功能中)。通过将与偏移相关的所有代码组合到一个位置,我提出的方法将使实现优化变得更容易。例如,常见的优化是不绘制屏幕外的东西。如果您有 20 个函数都计算偏移量并调用绘图函数,则必须转到每个函数并更改它们。如果您使用画家,那么您可以简单地更改画家类以忽略在可见区域之外绘制的请求,然后就完成了。
一般而言,关于静态变量:
我认为静态变量(和单例)是全局变量,因此实际上从不使用它们。让它们保持静态将我与特定的决定联系起来。我不够聪明,无法预先做出所有正确的决定,因此我需要灵活的代码。
一些准则: