编程效率



我有一个或多或少完成的Java游戏。敌人从屏幕顶部产生,你在屏幕底部与你的单位战斗。游戏消耗了大量的CPU,我认为这部分是因为每次敌人出生时,它都有一个线程。当它死亡时,敌人的内存空间不会被移除,线程也不会被破坏。我想问的是,删除敌人会提高效率吗?如果会,怎么做?另外,你们还有其他提高效率的方法吗?

您需要的是一个探查器。

你需要排除程序运行缓慢的猜测。您可能会浪费大量时间清理线程分配,结果却发现它根本不是性能瓶颈。

Java中有不同的profiler,您最终使用的profiler可能取决于您的编程环境。就我个人而言,我使用Netbeans IDE进行开发,它附带了一个很好的分析器,我会推荐它。如果您使用EclipseIDE进行开发,则有VisualVM,有关更多选项,请参阅以下问题:

https://stackoverflow.com/questions/2713940/eclipse-java-profiler

嗯,游戏通常不会使用这些方法开发!

你需要做的第一件事是去掉你创建和销毁的所有线程,在游戏中,我们通常只有一个活动线程。我知道,使用多核CPU的全部功能很好,但这是为专家准备的。作为一名独立开发者,我知道我的游戏需要运行的性能,所以我只使用线程来阻止调用。比如等待网络数据包到达。

现在知道你只需要一个活跃的线程,下面是游戏通常做的!

  • 检查用户输入
  • 更新场景
  • 渲染帧

游戏一次又一次地在同一个循环中循环。请注意,许多显示器不会以高于60Hz的频率刷新,如果它们刷新了,我不知道有谁能真正注意到这一点!因此,游戏渲染速度超过60fps只是浪费处理能力。检查用户输入和更新场景也是如此。如果用户没有从游戏中获得任何新的数据,他就无法做出响应;所以检查输入并没有什么区别!"更新场景"部分也是如此。如果用户没有做任何新的事情,我们也不会画任何东西,为什么我们关心世界上发生了什么?我们可以让所有的更改堆积起来,然后在一次大更新中应用它们。这里我说的是fps限制,它通常在所有游戏中实现,以防止计算能力滥用。无论是CPU还是GPU,计算过多都会导致更高的功耗,这对手机或笔记本电脑用户来说都没有很好的回报!

你提到你的游戏中有一些人工智能。你们可以猜到,任何和游戏互动的东西都有两个明显的步骤!

  1. 观察游戏状态
  2. 采取行动

我们可以用think()的方法把整件事打包。考虑到这些think调用不会消耗太多时间,我们可以为游戏中所有非人类思维的事情调用它们,而进行这些调用的最佳位置是检查用户输入。至少他们可以被认为是用户,除非电脑是为他们考虑的,他们注定会被一个熟练的玩家打败!这些所谓的人工智能代理是否需要通信并不重要。让他们随心所欲地交谈,但只能在他们观察比赛的时候。

正如Tim所建议的那样,使用评测器是一件很好的事情,可以找到游戏的瓶颈所在。但它可能总是有用的。有时你会发现你的代码中有一部分出现了问题,尽管它已经实现了。在这种情况下,不要害怕!如果你陷入这种情况,你可以每两三帧做一次;没什么大不了的!只要最后检查一下游戏是否运行得完美。

最后一点:记住你正在开发一款游戏。如果出于某种原因,你不需要像在物理模拟中那样计算力和速度,那么一个简单的sin函数就可以了!这些技巧有时比实际验证的方法要好。在游戏中,用户喜欢看到最好的结果,但几乎没有人关心是否一切都像牛顿所说的那样实现!

最新更新