如何避免Java游戏中垃圾回收的延迟?(最佳做法)

如何避免Java游戏中垃圾回收的延迟?(最佳做法),第1张

如何避免Java游戏中垃圾回收的延迟?(最佳做法)

我对Java的手机游戏合作......以避免GC’ing对象(这反过来,最好的办法 在一个点触发GC或其他和
杀死你的游戏的perfs)仅仅是为了避免在主游戏创建它们首先循环。

没有“干净”的方法可以解决这个问题,我先举一个例子。

通常,您在屏幕上有4个球,分别为(50,25),(70,32),(16,18),(98,73)。好吧,这是您的抽象(为方便起见,将其简化):

n = 4;int[] { 50, 25, 70, 32, 16, 18, 98, 73 }

您“d出”消失的第二个球,您的int []变为:

n = 3int[] { 50, 25, 98, 73, 16, 18, 98, 73 }

(请注意,我们什至根本不关心“清洁”第四个球(98,73),我们只是跟踪剩下的球的数量)。

不幸的是,手动跟踪对象。这是在移动设备上最新的性能良好的Java游戏中完成的。

现在,对于字符串,这是我要做的:

  • 在游戏初始化时, 仅在 将数字0到9保存在数组中之后 使用 drawText(…)进行 预绘制。 __
    BufferedImage[10]
  • 在游戏初始化时,预先绘制一次 “您的分数是:”
  • 如果 “您的分数是:” 确实需要重绘(因为它是透明的),则从您的预存中重绘
    BufferedImage
  • 循环以计算分数的位数,并在 “您的分数为:”之后 ,将每个数字手动一个接一个地添加(每次从您
    BufferedImage[10]
    预先存储的位置复制对应的数字(0到9))。

这让您 两全其美 :您可以重用 drawtext(…) 字体,并且在主循环中创建了完全为零的对象(因为您 回避了对
drawtext(…) 的调用,这本身很 可能 是糟糕地产生不必要的废话)。

这个 “零对象创建绘图分数”的 另一个“好处” 是,仔细的图像缓存和字体的重用并不是真正的 “手动对象分配/重新分配” ,而是真正的仔细缓存。

这不是“干净的”,也不是“好的做法”,但这是在一流的手机游戏(例如Uniwar)中的实现方式。

而且速度很快。快点 比涉及对象创建的 任何事物 都要快。

PS:实际上,如果您仔细看一些手机游戏,您会发现字体实际上不是系统/
Java字体,而是专门为每个游戏制作的像素完美字体(在这里,我仅向您提供了有关如何缓存系统的示例/
Java字体,但显然您也可以缓存/重复使用像素完美/位图字体)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4929121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-12

发表评论

登录后才能评论

评论列表(0条)

保存