【问题标题】:Haxe memory issue with iterators in FlxState.update functionFlxState.update 函数中迭代器的 Haxe 内存问题
【发布时间】:2015-07-08 07:36:17
【问题描述】:

每当我在更新循环中使用迭代器时,都会遇到内存泄漏问题。 例如,这里:

class Manager extends FlxState {
  public var array: Array<Int>;
  override public function create():Void {
    array = new Array();
  }

  public override function update() {
    super.update();
    /////////////////////////////////////////////////////
    //
    // ISSUE IS HERE
    // If for(item in array) line is present there's a memory
    // issue.
    //
    /////////////////////////////////////////////////////
    for(item in array) var noop:Int = 0 /* Do nothing */;
  }
}

运行此程序时,我将获得持续不断的内存增长。这是它在 HaxeFlixel 的调试器中的样子:

但是,如果我使用这样的简单循环进行迭代:

for(i in (0...array.length)) var noop:Int = 0;

会好的:

为什么会发生这种情况,我做错了什么?

谢谢。

【问题讨论】:

    标签: haxe haxeflixel


    【解决方案1】:

    这是因为迭代器正在为迭代器分配内存。

    一段时间后,内存被垃圾收集器收集。

    我用 1000 个数组做了压力测试

    class Manager extends FlxState {
      public var arrays: Array<Array<Int>>;
      override public function create():Void {
        arrays = new Array();
        for (i in (0...1000)) arrays.push(new Array());
      }
    
      public override function update() {
        super.update();
        for (array in arrays)
          for (i in array)
            var noop:Int = 0;
      }
    }
    

    最终内存被收集:

    【讨论】:

    • 你为什么不直接使用for (array in arrays)for (i in array)
    • 你为什么要创建一个不在循环中使用的变量?如果你在循环外声明它,你可以重用变量noob
    • 嗨,刚刚更新了我的代码并删除了 iterator() (结果仍然相同)。将noop 移到外面也没有任何区别。
    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    相关资源
    最近更新 更多