Project

Resource Manager 구성(1)

RuNaPi 2022. 6. 28. 15:41

ResourceManager 

필요한것

- 리소스 로드 / 언로드

- 리소스 매니저 컨테이너에 키 값에 해당하는 리소스가 없을 경우 리소스를 로드

- 리소스를 매니저한테 받아 올때 참조 카운트 증가

- 리소스를 참조하던 오브젝트를 제거시 해당 오브젝트에서 사용하던 리소스 참조 카운트 감소

- 리소스의 참조 카운트가 0이 되면 릴리즈(COM 객체들 릴리즈)

 

추후 필요 및 고려

- 메모리 연속성

- Comptr

 

ResourceBase

- 그래픽스 엔진에서 관리할 리소스(Mesh, Shader 등등)들의 Base

 

int m_RefCnt = 0;

void AddRef();
bool ReleaseRef();

virtual void Release() abstract;

 

- 참조 카운트로 리소스 매니저에서 로드/언로드

 

m_RefCnt--;

if (m_RefCnt == 0)
{
#ifdef _DEBUG
	assert(m_RefCnt >= 0);
#endif
	Release();
	return true;
}

return false;

 

- 리소스 참조시에 레퍼런스 카운트 값 증가

 

template<class ResourceType>
ResourceType* REngine::GraphicResourceManager::Load(const char* fileName)
{
	std::type_info resourceType = typeid(ResourceType);

	ResourceBase* resource;

	if (resourceType == typeid(Mesh))
	{
		resource = LoadMesh(fileName);
	}
	else if (resourceType == typeid(Material))
	{
		resource = LoadMaterial(fileName);
	}
	else if (resourceType == typeid(Texture))
	{
		resource = LoadShader(fileName);
	}
	else if (resourceType == typeid(Shader))
	{
		resource = LoadTexture(fileName);
	}
	else
	{
#ifdef _DEBUG
		OutputDebugString(_T("Load unexpected type file.\n"));
#endif // _DEBUG
		return nullptr;
	}

	resource->AddRef();
	return reinterpret_cast<ResourceType*>(resource);
}

 

- 참조 카운트가 0이 되면 리소스를 릴리즈 후 참값 반환

 

void REngine::GraphicResourceManager::ReleaseResource(ResourceBase* resource)
{
	if (resource->ReleaseRef())
	{
		// 리소스 STL에서 노드 삭제
	}
}

 

- 리소스 매니저의 STL에서 해당 노드 삭제

'Project' 카테고리의 다른 글

ResourceManager 구성(2)  (0) 2022.06.29