日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Away3D 的实体收集器Bug

發布時間:2025/4/5 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。