📄 framemanager.cpp
字号:
//--------------------------------------------------
// Desc: Frame Manager
// Author: artsylee/2006.12.7
//--------------------------------------------------
#include "../stdafx.h"
#include "FrameManager.h"
#include "Log.h"
CFrameManager::CFrameManager()
{
m_CurHandle = BASEHANDLE;
m_UpdateTime = 0;
}
CFrameManager::~CFrameManager()
{
DestroyAll();
}
//---------------------------------------------------
// 加载Frame组到管理器
//---------------------------------------------------
FrameHandle CFrameManager::LoadFrame(const char *szFilename, MemoryMode mode /* = MM_AUTO */)
{
if(szFilename == NULL || szFilename[0] == 0)
{
return INVALID_HANDLE;
}
FrameHandle hFrm = QueryHandle(szFilename);
if(hFrm == INVALID_HANDLE)
{
CFrames * pFrame = new CFrames;
if(!pFrame->LoadFrame(szFilename))
{
delete (pFrame);
return INVALID_HANDLE;
}
pFrame->SetMemMode(mode);
hFrm = CreateHandle();
m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
}
return hFrm;
}
//---------------------------------------------------
// 加载Frame组的描述到管理器
//---------------------------------------------------
FrameHandle CFrameManager::LoadFrameDesc(const char *szFilename)
{
if(szFilename == NULL || szFilename[0] == 0)
{
return INVALID_HANDLE;
}
FrameHandle hFrm = QueryHandle(szFilename);
if(hFrm == INVALID_HANDLE)
{
CFrames * pFrame = new CFrames;
if(!pFrame->LoadFrameDesc(szFilename))
{
delete (pFrame);
return INVALID_HANDLE;
}
hFrm = CreateHandle();
m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
}
return hFrm;
}
//---------------------------------------------------
// 插入共享Frame组 (未加载后的也可以,最好使用MM_KEEPINMEMORY)
//---------------------------------------------------
FrameHandle CFrameManager::InsertFrame(CFrames *pFrame, MemoryMode mode /* = MM_AUTO */)
{
if(pFrame == NULL)
{
return INVALID_HANDLE;
}
pFrame->SetMemMode(mode);
FrameHandle hFrm = CreateHandle();
m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
return hFrm;
}
//---------------------------------------------------
// 指定句柄方式
//---------------------------------------------------
bool CFrameManager::LoadFrame(FrameHandle hFrm, const char *szFilename, MemoryMode mode /* = MM_AUTO */)
{
if(szFilename == NULL || szFilename[0] == 0 || hFrm>BASEHANDLE)
{
WriteLog(INFO_ERROR, "Invalidate parameter!");
return false;
}
if(m_FrameMap.find(hFrm) != m_FrameMap.end())
{
WriteLog(INFO_WARNING, "Frames Handle has been used![%s]", szFilename);
return false;
}
CFrames * pFrame = new CFrames;
if(!pFrame->LoadFrame(szFilename))
{
delete (pFrame);
return false;
}
pFrame->SetMemMode(mode);
m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
return true;
}
//---------------------------------------------------
// 指定句柄方式
//---------------------------------------------------
bool CFrameManager::LoadFrameDesc(FrameHandle hFrm, const char *szFilename)
{
if(szFilename == NULL || szFilename[0] == 0 || hFrm>BASEHANDLE)
{
WriteLog(INFO_ERROR, "Invalidate parameter!");
return false;
}
if(m_FrameMap.find(hFrm) != m_FrameMap.end())
{
WriteLog(INFO_WARNING, "Frames Handle has been used![%s]", szFilename);
return false;
}
CFrames * pFrame = new CFrames;
if(!pFrame->LoadFrameDesc(szFilename))
{
delete (pFrame);
return false;
}
m_FrameMap.insert(std::map<FrameHandle, CFrames*>::value_type(hFrm, pFrame));
return true;
}
//---------------------------------------------------
// 批加载
//---------------------------------------------------
bool CFrameManager::BatchLoad(const char *szIniFile)
{
if(szIniFile == NULL || szIniFile[0] == 0)
{
return false;
}
FILE * fp = fopen(szIniFile, "r");
if(!fp)
{
WriteLog(INFO_ERROR, "Can't open file[%s]!", szIniFile);
return false;
}
int nHandle, nInMem, nDesc;
char *TOKEN = " \t\n\r";
char *temp, szTemp[256];
char *szFilename;
while(!feof(fp))
{
fgets(szTemp, 256, fp);
if(szTemp[0] != '#')
{
szTemp[0] = 0;
continue;
}
temp = szTemp;
++temp;
nHandle = atoi(strtok(temp, TOKEN));
nInMem = atoi(strtok(0, TOKEN));
nDesc = atoi(strtok(0, TOKEN));
szFilename = strtok(0, TOKEN);
if(nInMem)
{
LoadFrame(nHandle, szFilename, MM_KEEPINMEMORY);
}
else
{
if(nDesc) LoadFrameDesc(nHandle, szFilename);
else LoadFrame(nHandle, szFilename);
}
}
fclose(fp);
return true;
}
//---------------------------------------------------
// 释放纹理组
//---------------------------------------------------
void CFrameManager::ReleaseFrame(FrameHandle frmHandle)
{
if(frmHandle==INVALID_HANDLE)
return;
std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.find(frmHandle);
if(itor != m_FrameMap.end())
{
if((*itor).second->Release()<=0)
{
delete ((*itor).second);
m_FrameMap.erase(itor);
return;
}
}
}
//---------------------------------------------------
// 删除纹理组
//---------------------------------------------------
void CFrameManager::DestroyFrame(FrameHandle frmHandle)
{
if(frmHandle==INVALID_HANDLE)
return;
std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.find(frmHandle);
if(itor != m_FrameMap.end())
{
delete ((*itor).second);
m_FrameMap.erase(itor);
return;
}
}
//---------------------------------------------------
// 删除全部纹理组
//---------------------------------------------------
void CFrameManager::DestroyAll(void)
{
std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.begin();
while(itor!=m_FrameMap.end())
{
// 调用析构函数Destroy释放m_TextureVec
delete ((*itor).second);
itor++;
}
m_FrameMap.clear();
}
//---------------------------------------------------
// 获取索引纹理
//---------------------------------------------------
CTexture* CFrameManager::GetTexture(FrameHandle frmHandle, DWORD index)
{
if(frmHandle==INVALID_HANDLE)
return NULL;
std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.find(frmHandle);
if(itor != m_FrameMap.end())
{
(*itor).second->SetLastAccess(::timeGetTime());
return (*itor).second->GetTexture(index);
}
return NULL;
}
//---------------------------------------------------
// 获取纹理组
//---------------------------------------------------
CFrames* CFrameManager::GetFrame(FrameHandle frmHandle)
{
if(frmHandle==INVALID_HANDLE)
return NULL;
std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.find(frmHandle);
if(itor != m_FrameMap.end())
{
(*itor).second->SetLastAccess(::timeGetTime());
return (*itor).second;
}
return NULL;
}
//---------------------------------------------------
// 自动管理纹理组
//---------------------------------------------------
void CFrameManager::Update(void)
{
DWORD tm = ::timeGetTime();
if(tm - m_UpdateTime>UPDATETIME)
{
std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.begin();
while(itor != m_FrameMap.end())
{
if((tm-(*itor).second->GetLastAccess())>MAXEXIST
&& !((*itor).second->IsRelease())
&& (*itor).second->GetMemMode()==MM_AUTO)
{
(*itor).second->AutoRemove();
}
itor++;
}
m_UpdateTime = tm;
}
}
//---------------------------------------------------
// 创建唯一的共享句柄(5000+)
//---------------------------------------------------
FrameHandle CFrameManager::CreateHandle(void)
{
m_CurHandle++;
while(m_FrameMap.end() != m_FrameMap.find(m_CurHandle))
{
m_CurHandle++;
}
if(m_CurHandle==INVALID_HANDLE)
{
m_CurHandle = BASEHANDLE;
}
return m_CurHandle;
}
//---------------------------------------------------
// 查询共享句柄(5000+)
// 5000以下不参与共享
//---------------------------------------------------
FrameHandle CFrameManager::QueryHandle(const char *szFilename)
{
std::map<FrameHandle, CFrames*>::iterator itor = m_FrameMap.begin();
while(itor!=m_FrameMap.end())
{
if((*itor).second->GetName() == szFilename && (*itor).first>BASEHANDLE)
{
(*itor).second->AddRef();
return (*itor).first;
}
itor++;
}
return INVALID_HANDLE;
}
//---------------------------------------------------
// copy right 2006 Artsylee(2006_12_8)
//---------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -