最近在改Away3D源码的时候遇到个很郁闷的问题,发现创建的Mesh 释放不掉。

分析源码发现 EntityListItemPool 类中逻辑Bug在getItem()函数中发现_poolSize 对象池大小如果够用的情况下 它采用的方式是复用EntityListItem

那么假设我删除了场景上有10个对象我全部删除了然后我再创建9个 这时候总有1个对象是被缓存着的。一直要等到我创建第10个对象他才会被释放掉。

没辙了跑到 看看对象销毁流程吧。

对象被销毁时会调用 Scene3D 的 unregisterEntity函数,这个函数只是删除了Scene3D 和 显示对象的引用。但是EntityListItemPool中还是存在实例引用

看了看收集器 每次都要经过 Scene3D 的 traversePartitions函数。

那我先在unregisterEntity函数调用的时候做一次记录把要删除的显示对象添加到一个列表中。

private var _unregisterEntityList:Vector.<Entity> = new Vector.<Entity>;
  /**
   * When an entity is removed from the scene, or from one of its children, remove it from its former partition tree.
   * @private
   */
  arcane function unregisterEntity(entity : Entity) : void
  {
   _unregisterEntityList.push(entity);
   entity.implicitPartition.removeEntity(entity);   
  }

这样在下一帧执行渲染的时候我就知道要释放掉哪些对象了。然后修改traversePartitions函数.

public function traversePartitions(traverser : PartitionTraverser) : void
  {
   var i : uint;
   var len : uint = _partitions.length;
   if(traverser is EntityCollector)
   {
    while(_unregisterEntityList.length)
    {
     var _entity:Entity = _unregisterEntityList.shift();
     (traverser as EntityCollector).entityListItemPool.unmap(_entity);
     (traverser as EntityCollector).renderableListItemPool.unmap(_entity);
    }
   }
   traverser.scene = this;

while (i < len)
    _partitions[i++].traverse(traverser);
  }

每次在新的一轮收集前把上一帧要清楚掉的对象全部干掉。

然后跑到entityListItemPool 类里添加一段代码:

public function unmap(mesh:Entity) : void
  {
   var _mesh:Mesh = mesh as Mesh;
   for(var j:int =0;j<_mesh.numSubMesh;j++)
   {
    for(var i:int = 0; i < _pool.length; i++)
    {
     if((_pool[i].renderable is SubMesh) && (_pool[i].renderable as SubMesh).parentMesh && (_pool[i].renderable as SubMesh).parentMesh == _mesh)
     {
      (_pool[i].renderable as SubMesh).parentMesh = null;
      _pool.splice(i,1);
      _poolSize --;
      continue;
     }
    }
   }
  }

这样保证了对象的释放。OK 这下好了

测试下了一下没有问题全部乖乖的垃圾回收了。

转载于:https://www.cnblogs.com/ch06src/p/3874428.html

Away3D 的实体收集器Bug相关推荐

  1. GC算法与GC收集器

    Java相比于C++这样语言,除了跨平台的特性外,最突出的特点就是垃圾回收机制.C++的开发人员还需要手动分配和回收内存,但JVM直接承担起了垃圾回收的重任,开发人员可以专注于业务开发,不需要再去关心 ...

  2. 深入理解java虚拟机gc_jvm GC收集器与内存分配(深入理解java虚拟机第三章)

    jvm GC收集器与内存分配(深入理解java虚拟机第三章) 本篇是<深入理解java虚拟机第三章>的笔记记录. 一 为什么要关注GC和内存分配? 需要排查各种内存溢出.内存泄漏问题时,或 ...

  3. JVM垃圾回收器之Shenandoah收集器

    Shenandoah,第一款不由Oracle(包括以前的Sun)公司的虚拟机团队所领导开发的HotSpot垃圾收集器,这个项目的目标 是实现一种能在任何堆内存大小下都可以把垃圾收集的停顿时间限制在十毫 ...

  4. php 去除实体,php – 如何在学说中正确关闭实体管理器

    我在Doctrine2脚本中遇到了内存泄漏问题,这个问题通常是由一段代码消除内存问题造成的. 在我知道你可以(并且应该)清除实体管理器之前,每20次迭代我做了以下事情: if ($this->u ...

  5. JVM---垃圾收集器(万字详解)

    垃圾收集器万字详解 垃圾回收器 垃圾收集器万字详解 前言 垃圾收集器说明与发展史 垃圾收集器简要说明 垃圾收集器发展史 垃圾收集器的分类 衡量垃圾收集器性能的指标 不同的垃圾收集器概述 7款经典的垃圾 ...

  6. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...

    本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程?   java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 ...

  7. Serial,Parallel,CMS,G1四大GC收集器特点小结

    2019独角兽企业重金招聘Python工程师标准>>> 1.Serial收集器 一个单线程的收集器,在进行垃圾收集时候,必须暂停其他所有的工作线程直到它收集结束. 特点:CPU利用率 ...

  8. Java GC收集器配置说明

    根据Java GC收集器具体分类,我们可以看出JVM根据需求不同提供了三种选择:串行收集器.并行收集器.并发收集器. 串行收集器只适用于小数据量的情况,我们主要了解一下并行收集器和并发收集器.默认情况 ...

  9. JVM汇总--类加载/收集器

    2019独角兽企业重金招聘Python工程师标准>>> 类加载: 自定义类加载器的核心在于对字节码文件的获取即重写 findClass 方法, 如果是加密的字节码则需要在该类中对文件 ...

最新文章

  1. appfog下用客户端管理你的mongodb、mysql(类似)
  2. python输入hello*3_Python3基础(一) Hello World
  3. JAVA:this的使用
  4. BODY background=自适应大小_自适应(电脑/平板/手机)网页,自适应网页设计练习总结...
  5. 三、糖醋鲤鱼(Sweet and sour carp)
  6. CentOS7 下DNS的搭建
  7. solaris10下允许root通过telnet远程登录
  8. 【物理应用】基于matlab GUI功率谱估计【含Matlab源码 329期】
  9. 更新!2021智能仓储物流之最全AGV企业供应商名录
  10. eclipse快捷键介绍
  11. #EDA(电子设计自动化)
  12. 虚拟机无法ping通物理机解决方案
  13. 【文献译文】OFDM Receiver Using Deep Learning: Redundancy Issues
  14. 飞书接入ChatGPT - 将ChatGPT集成到飞书机器人,直接拉满效率
  15. seqkit根据基因id_基因家族分析保姆级教程(分子进化)-生信小白自学之路
  16. Android架构分析之硬件抽象层(HAL)
  17. PE系统下安装windows server 2003
  18. Hadoop Shell 命令 与 WordCount
  19. 仓库无线覆盖解决方案
  20. iPad密码输错20次导致设备被上锁解锁方法

热门文章

  1. 图解用RadASM开发一个同时编辑多个文档的编辑器
  2. CodeMirror的使用方法
  3. maven 工程mybatis自动生成实体类
  4. ASP.NET MVC下的异步Action的定义和执行原理
  5. node.js Web应用框架Express入门指南
  6. Silverlight Curve Animation / 曲线动画
  7. centos安装python3_在CentOS8 上安装Python3
  8. ecs服务器网站文件放在哪里,云服务器ecs文件放哪里
  9. 【控制】蚁群算法(ACO,Ant Colony Optimization)及 Matlab 实现
  10. 1.4 满足和优化指标-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授