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