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 | 
|---|