Away3D 的实体收集器Bug
最近在改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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php fpm安装curl后,nginx
- 下一篇: myeclipse tomcat内存溢出