關於DestoryComponent崩潰問題

           前段時間寫了一個方便配置各種特效,音效的StaticMeshActor的工具,其中生成特效時候使用到了SpawnEmitterAtLocation函數,在處理一些永久特效延遲一定時間銷燬時候使用了DestoryComponent函數,因爲這個暴露出來了一個問題。程序會有一定機率崩潰在DestoryComponent函數裏面,但是也不是必現的,這時候就有些蛋疼了。

          後來發現其實這裏是有一個誤區的,先看SpawnEmitterAtLocation的函數原型,

static UParticleSystemComponent* SpawnEmitterAtLocation(const UObject* WorldContextObject, class UParticleSystem* EmitterTemplate, FVector Location, FRotator Rotation = FRotator::ZeroRotator, bool bAutoDestroy = true)

這個函數的最後一個參數bAutoDestroy是有默認值的,默認爲true。@param bAutoDestroy - Whether the component will automatically be destroyed when the particle system completes playing or whether it can be reactivated。也就是說它默認爲如果粒子特效播放完畢,就會自動銷燬。這時候我們認爲它銷燬了,但是其實如果沒有經過GC的話,它那塊存儲空間依然存在,仍然可以通過指針繼續正常調用它,這就給了我們一個誤區,誤以爲其實最後一個參數bAutoDestroy是沒有實際作用的。

           暴露出來這個問題其實也是因爲在使用時候誤把一個有生存週期的粒子當成永久粒子使用了,然後如果在定時器回調過去銷燬這個粒子時候,經過了GC的話,它就會因爲內存問題直接崩潰,假如沒有經過GC,就不會有任何問題,這是給我們造成一個誤區的基本。左後再給大家簡單解釋下虛幻4的GC。

          GC就是指垃圾回收系統,虛幻4引擎使用反射系統(機制)去實現垃圾回收。關於垃圾回收,你不用進行手動的去銷燬你的UObjects類對象,一般來講GC的時間是不定時的,大概1分鐘一次左右,當然也可以通過手動強制調用。

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章