• [Unreal 게시판] Blueprint에서 garbage collection을 강제로 시행하기2016.06.07 PM 01:48

게시물 주소 FONT글자 작게하기 글자 키우기

Question>

세이브 로드 공부중인데 위젯쪽에서 자꾸 에러가 납니다.
그래서 포럼을 뒤져보니 끔찍한 말이 나오네요...

요컨데 위젯을 한번 생성하면 게임을 끄지 않는 한 사라지지 않고 메모리를 잡고 놔주지 않는다는 소립니다.
보통 remove from viewport를 많이 쓸텐데, 이걸 써도 위젯은 '파괴되지 않습니다'

만약 100개의 액터가 있고 각 액터의 머리 위에 체력 게이지가 '위젯'으로 뜨고,
해당 위젯은 액터의 beginPlay 등에서 CreateWidget 으로 만든 것이라면,
다음 스테이지로 넘어가서 새로운 적들이 100놈 등장하면 실제 위젯은 200개가 존재하게 됩니다!!
(저의 경우에는 세이브 로드할 때 위젯이 늘어나더군요. 위젯을 가진 액터는 사라졌는데
위젯만 남아있으니 당연히 에러가 날 수 밖에요...무시하고 안 부르면 되기야 됩니다만 메모리는 늘어납니다...)

위젯이 무거울 경우 모바일 환경에서는 치명적인 문제가 될 수 있겠네요...
이를 막으려면 위젯을 각각 하나씩 만들어 쓸 게 아니라 일정량 만큼 만들고 돌려쓰기를 하거나 해야 할 것 같습니다.
최소량만 생성해서 쓰고, 안 쓰는 놈거 뺏아서 쓰고, 필요할 때만 최대치를 조금씩 늘려서 쓴다거나 말이죠.

혹시 다른 해결방법 있으신 분?
그리고 위젯대신 다른 걸 쓰시는 분이 있으시면 공유좀 해주세요 굽신굽신...


참고:
https://answers.unrealengine.com/questions/119841/what-is-the-proper-way-to-create-and-destroy-umg-w.html
https://forums.unrealengine.com/showthread.php?56117-How-to-destroy-UMG-widget

위젯을 생성할 때 필요한 만큼만 생성하고, 참조가 없는 위젯을 사용하도록 짜 보았습니다.
일단은 잘 되네요. 가비지 콜렉팅으로 지울 수 있다고 하시는데 아직 블루프린트만 쓰고있어서 ㅠㅠ

-------------------------------------------------------------

Answer>
Blueprint에서 'Remove From Viewport'로 widget을 제거하더라도
바로 제거되지는 않고요. 일정시간이 지나거나, memory를 정리해야할 상황이 왔을 때,
garbage collection을 통해서 제거됩니다.


하지만,
상황에 따라서 강제로 garbage collection을 시행해야 할 필요가 있는 경우에
강제로 시행하게 할 수도 있습니다.^^


https://docs.unrealengine.com/latest/INT/BlueprintAPI/Utilities/Platform/CollectGarbage/index.html


Blueprint node에서 'Utilities > Platform > Collect Garbage'를 선택하시면,
'Collect Garbage'라는 Blueprint node를 배치할 수 있는데요.
이걸 이용하시면, 강제로 garbage collection 처리할 수 있습니다.


만약에 widget 제거 후에 'Collect Garbage'를 시행했는데도 제거된 widget이 남아있다면,
다른 곳에서 참조하고 있거나 UMG에 bug가 있다고 간주할 수 있습니다.


일단은 어느쪽인 지를 모르기 때문에...^^;;;;;;;
양쪽 모두 가능하다고 생각하시면서 간단한 logic으로
실험을 좀 하시고 Epic에 알리셨으면 하네요.







Tag:
안기훈, Keehoon Ahn, 언리얼, Unreal, UDK, iPhone, iPad, app, 앱, iOS
댓글 : 0 개
친구글 비밀글 댓글 쓰기