我曾开发过 Java 手机游戏……避免 GC 对象的最佳方法(反过来shall在某一点或另一点触发 GC,并且shall杀死你的游戏的性能)只是为了避免首先在你的主游戏循环中创建它们。
没有“干净”的方法来处理这个问题,我首先举一个例子......
通常,屏幕上有 4 个球,分别位于 (50,25)、(70,32)、(16,18)、(98,73)。好吧,这是你的抽象(为了这个例子而简化):
n = 4;
int[] { 50, 25, 70, 32, 16, 18, 98, 73 }
你“弹出”第二个球消失了,你的 int[] 变成:
n = 3
int[] { 50, 25, 98, 73, 16, 18, 98, 73 }
(注意我们甚至不关心“清理”第四个球(98,73),我们只是记录剩下的球数)。
遗憾的是,手动跟踪物体。这就是当前在移动设备上运行的大多数表现良好的 Java 游戏的实现方式。
现在对于字符串,我会这样做:
- 在游戏初始化时,使用预绘制绘制文本(...) 只有一次您保存在 a 中的数字 0 到 9
BufferedImage[10]
array.
- 游戏初始化时,预绘制一次“你的分数是: ”
- if the “你的分数是: ”确实需要重新绘制(因为,比如说,它是透明的),然后从预存储中重新绘制它
BufferedImage
- 循环计算分数的数字并在“你的分数是: ”,手动将每个数字一一对应(通过每次从您的计算机中复制相应的数字(0 到 9))
BufferedImage[10]
您预先存储它们的位置。
这为您提供了两全其美的效果:您可以重用绘制文本(...)font 并且您在主循环期间创建了零个对象(因为您also回避了呼叫绘制文本(...)其本身may很可能会蹩脚地产生,好吧,不必要的废话)。
这样做的另一个“好处”“零物体创建平局得分”仔细的图像缓存和字体重用并不是真的“手动对象分配/释放”,这实际上只是仔细的缓存。
这不是“干净”,也不是“良好实践”,但这就是顶级手机游戏(比如 Uniwar)的做法。
而且速度很快。真快。比...快anything涉及对象的创建。
P.S:其实如果你仔细看一些手机游戏,你会发现很多时候字体实际上不是系统/Java字体,而是专门为每个游戏制作的像素完美字体(这里我只是给你举了一个如何缓存系统字体的例子) /Java 字体,但显然您也可以缓存/重用像素完美/位图字体)。