gpt4 book ai didi

java - 安卓 : Updating thread causes GC to run a ton

转载 作者:行者123 更新时间:2023-12-02 07:53:31 25 4
gpt4 key购买 nike

我正在 Android 中编写一个有点复杂的游戏引擎。

目前我有一个用于更新子系统的线程。

update方法内部是根据当前游戏状态更新游戏逻辑的方法。

游戏状态有一个场景,已更新。场景由根节点组成,形成一个简单的场景图结构。

根是具有也会更新的子级的节点,依此类推。

无论如何,这一切都很好,而且效果很好,直到我在我的 Logcat 中得到一百万个这样的东西:03-29 09:23:22.866: D/dalvikvm(18554): GC_CONCURRENT freed 511K, 52% free 2773K/5767K,外接77K/587K,暂停2ms+3ms

我已将泄漏的原因隔离为更新循环,因为当我注释掉更新子系统的方法时,没有 GC 消息。此外,我已经对更新循环进行了深入的评论,直到根节点的子节点更新时 GC 才会疯狂运行。

(GameLgoic)
public void onUpdate(float deltaTime)
{
if (gameState != null)
gameState.onUpdate(deltaTime);
}
(GameState)
public void onUpdate(float deltaTime)
{
scene.onUpdate(deltaTime);
}
(Scene)
public void onUpdate(float deltaTime)
{
root.onUpdate(deltaTime);
}
(SceneNode)
public void onUpdate(float deltaTime)
{
for (int i = 0; i < children.size(); ++i)
{
children.get(i).onUpdate(deltaTime); // Memory leak runs crazily here
}
}

如果我注释掉children.get(i).onUpdate(deltaTime) 就没有泄漏!我的心好乱。谢谢大家。

最佳答案

当我为 Android 制作游戏时,我遇到了类似的问题。摆脱这种情况的唯一方法是编写嵌入式 C 风格的代码。因此,如果您想要一个循环,请尽可能重复使用计数变量以及边界变量,如下所示:

int i;
int max
void loop(){
max = bla.size();
for(i=0; i<max; i++){ ... }
}

这同样适用于你接触到的所有其他东西。因此,您可能会考虑保留对不再需要的对象的引用,并在以后回收它们。

实现这些更改对我的游戏产生的影响真是太疯狂了。帧速率加倍,大大减少延迟等等。

您应该查看 DDMS 工具,该工具由 eclipse Android SDK 提供。您可以使用它来跟踪分配情况,以避免这些问题。

此外,您应该考虑删除所有迭代器,因为每次跳入循环时都会分配它们并且无法回收它们。因此,最好手动循环并多次遍历列表(循环中的 get(x)),而不是长期等待垃圾收集器。

关于java - 安卓 : Updating thread causes GC to run a ton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9926438/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com