• [Unreal 게시판] SynchronousLoad()와 garbage collection2014.11.03 PM 01:55

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

Question>

질문1:
재현법

1, Asset 로드시에 SynchronousLoad 을써서 Asset 을 로딩후
(UDataAsset 을 상속 받은 아무Asset 을 로딩합니다 저같은경우에는 2~3개의 에셋을 로딩하였습니다.)

2, 레벨변경
(OpenLevel 과 ProcessServerTravel을 사용함.)

을 하면 FStreamableManager::StreamableItems리스트안에 타겟들이 전부 NULL 로 셋팅이 됩니다.
리스트는 지워지지 않구요.

디버깅을 해보니 OnPreGarbageCollect 관련 함수들을 타는데.
안에 타겟들은 NULL 로 셋팅이 되고 리스트의 아이템들은 지워지지 가 않습니다.

레벨변경후에 같은 Asset 을 로딩 하려고 할시에 리스트에는 있으나,
타겟이 NULL 로 셋팅이 되어 새로 로딩을 하지않고, 기존에 리스트에서 아이템을 가져오지만,
해당 타겟을 NULL 로 리턴되는 현상이 발생 했습니다.

가비지 콜렉터의 대상이 되었다면, 리스트들도 사라지는게 맞지 않나 생각해 봅니다.
아니면 가비지 콜렉터의 예비대상이 되었다면 타겟은 지워지지 않아야 하는게 아닌가 생각 되고요.

이는 제가 사용법을 잘 몰르는건지 아니면 버그 인지 확실치 않아 고수님들에게 물어 보려합니다.

SynchronousLoad 을 사용하지 않고 LoadObject 이것을 사용하면 되나,
이것보다는 스트리밍의 효과를 보고싶어 SynchronousLoad 을 사용하고 싶어서 올려 봅니다. ㅠㅠ
버그인가요 ?? ㅠㅠ


질문2:
FStreamableManager::OnPreGarbageCollect 함수 안에서는 타겟만 NULL 로 지정을 해주고
FStreamableManager::OnPostGarbageCollect() 안에서는 Removecurrent() 함수를 사용하고 있으나
이터레이터 루프도중 아이템삭제시에 오류가 생기지 않나요 ?
예를 들면 1234 리스트안에 내용이 채워져 있다면 2번째에서 2를 삭제했다면 134 가 되는 이런 ? 것들말이죠 ..
고수님들 도와주세요 .. ㅠㅠ

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

Answer>

답변1:
새로 loading하면 StreamableItems 전체를 다른 걸로 대입하고,
이전 것은 일정 시간이 지나면 garbage collector가 알아서 제거해 줍니다.
( 이 때, 이전 것이 가지고 있는 item들도 같이 다 제거되고요. )

명시적으로 지우고 싶으신 거 같은데..^^;;;;
UObject으로 만든 객체는 기본적으로 '명시적 삭제'를 허용하지 않습니다.

제가 하는 게 있어서, 세밀하게 파고 들지는 못하겠는데요.^^;;;;;;
일단, 제가 보기에는 bug가 아니라고 판단됩니다.



답변2:
'[ue4 root]\Engine\Source\Runtime\Core\Public\Containers\Set.h'를 열어 보시면,
아래 내용을 확인할 수 있습니다.

class TIterator : public TBaseIterator
{
friend class TSet;

public:
(..생략..)

FORCEINLINE void RemoveCurrent()
{
Set.Remove(TBaseIterator::GetId());
}

private:
TSet& Set;
}

위 내용을 보시면,
RemoveCurrent()는 TIterator의 Set의 요소를 제거할 뿐,
iterator 자신을 제거하지 않습니다.

만약에
질문하신대로 iterator loop 중간에 iterator를 삭제한다면,
당연히 error가 발생합니다.^^;;;;;;;

하지만,
RemoveCurrent()에는 iterator를 삭제하는 기능이 없기 때문에,
iterator loop 중간에 RemoveCurrent()를 호출해도 error는 발생할 수가 없습니다.^^;;;;;
( set과 list를 혼동하고 계신 거 같습니다.^^;;;;;;; )

따라서,
FStreamableManager::OnPostGarbageCollect()에서 iterator loop
중간에 RemoveCurrent() 함수를 사용하더라도, 오류가 발생하지 않습니다~ ^^







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