【问题标题】:android game - how to store game elements so gc wont fireandroid游戏-如何存储游戏元素以使gc不会触发
【发布时间】:2011-06-07 15:00:15
【问题描述】:

我正在开发一款安卓游戏,我有一个关于在不触发垃圾收集器的情况下存储游戏元素的问题。

我的游戏需要一个集合,其中游戏元素根据 x、y 位置存储(所有游戏元素都有 x、y、宽度和高度)。然后每帧调用该集合以根据 cameraX、cameraY、camera 宽度和高度检索元素(用户可以在游戏中滚动)。

例子:

 function draw() {
   tmp = collection.getElements(tmp,cameraX,cameraY,cameraWidth,cameraHeight);
     for(int i = 0; i < tmp.size(); i++) {
        tmp.get(i).draw();
     } 
  }

我目前正在使用 Vector 类来表示集合元素,但 gc 每隔几分钟就会触发一次。我预先完成所有分配。我还修改了 getElements 函数以接受另外 1 个参数 - 一个临时向量(预先分配),其中填充了元素然后返回。

  • 使用哪个类来存储游戏元素以使 gc 不会触发(如果可能,我宁愿永远不要)?
  • 我还在运行时将元素添加到集合中,我是否也必须预先分配它们?

谢谢,

问候 J.

【问题讨论】:

    标签: android garbage-collection arraylist


    【解决方案1】:
    1. 如果你有一个对象的引用,GC 不会收集它们。因此,如果您在游戏期间不创建对象(并释放它们),您的 GC 将永远不会释放内存
    2. 是否需要预先创建元素取决于元素的类型。如果它们必须从文件系统读取数据,您应该在引导/加载序列之前加载它们。如果它们很简单,您可以在第一次需要它们时进行操作

    【讨论】:

    • GC 必须运行以确定是否有引用,所以#1 的逻辑是有缺陷的。 (当然,如果没有新的分配,它完全有可能永远不会运行。)
    • @delnan 是的,但它不会导致实际释放一些内存时出现的卡顿,对吧?
    • GC 周期的真正瓶颈是停止运行以确定可达性,而不是实际释放内存(对于复制 GC,它稍微重要一些,但仍然不是减速的主要原因)。
    • 我注意到下面的代码触发了 gc,任何想法如何绕过它? while (running) { try { c = holder.lockCanvas(null); synchronized (holder) { // 渲染 } } finally { // 在 finally 中执行此操作,这样如果在上述过程中抛出异常 // 我们不会让 Surface 处于不一致状态 // if (c != null) { holder.unlockCanvasAndPost(c); } } }
    • @Delnan 你有资源吗?因为到目前为止我的经验是 GC 在释放内存时会产生延迟,尤其是大量内存,并且在它只是运行而不释放任何东西时永远不会产生任何延迟。
    【解决方案2】:

    现在每隔几分钟可能不值得担心的问题,当它触发时,您是否有明显的帧速率下降?另一种选择是在您方便的时候调用 System.gc()。

    【讨论】:

    • System.gc() 只是一个it would be nice if you do it now 但它不是立即运行 GC 的实际调用
    • 我已经设法调整了代码,使其每 10 分钟或更长时间被调用一次,但这很明显。但是真的不知道为什么要调用它(代码总是一样的,没有触发任何新内容)..是因为Vector还是模拟器? logcats 说 GC_FOR_MALLOC 在 180 毫秒内释放了 X 个对象 / X 个字节..
    • @WarrenFaith,感谢您指出我不知道。
    • @jarnej,这是硬件还是模拟器上的 180 毫秒?模拟器很慢,你的真实世界性能应该更好。您是否在跟踪垃圾收集之间的帧数?我很想知道结果是 1 个对象/帧还是什么。
    • 在模拟器上..我使用了 ddms 并看到了分配是我的错:P 我已经修复了它,现在测试它是否会再次发生火灾
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多