,读取文件的时候就直接使用的文件名,如果具有一个完整的文件系统,不仅可以从硬盘中,还可以从内存中,压缩文件中,而且还可以在多个位置按先后顺序查找。StructRes*就是之前提过的结构体了。
ResourceManager最重要的方法是GetD3DResource
1: void* ResourceManager::GetD3DResource(string filename, GraphicsDevice* pDevice,
2: ResourceType type)
3: {
4: ResTable::iterator pResult = resourceTable.find(filename);
5:
6: //如果找到了对应的资源(已加载)
7: if (pResult != resourceTable.end())
8: {
9: (*pResult).second->useCount ++;
10: return (*pResult).second->pResource;
11: }
12: ..........
ResTable就是resourceTable的类型,stl的类型写起来太长了,就用typedef处理了一下。
从第4行开始就是查找资源, 首先看看这个文件名所对应的资源是否存在,如果存在,就返回,代码都是调用的基本stl的函数,如果看不太明白可以翻翻stl的帮助文件。
1: //如果没有找到对应的资源
2: else
3: {
4: //如果是需要载入贴图
5: if (type == ResourceType::RTTexture)
6: {
7: IDirect3DTexture9* pTexture;
8:
9: //从filename中创建Texture
10: LPSTR str = UtilityTools::ConvertStringLPSTR(&filename);
11: if (D3DXCreateTextureFromFileExA(pDevice->GetLPDIRECT3DDEVICE9(),
12: str,
13: D3DX_DEFAULT, //width
14: D3DX_DEFAULT, //height
15: D3DX_DEFAULT, //levels
16: 0, //usage
17: D3DFMT_UNKNOWN, //format
18: D3DPOOL_MANAGED, //pool
19: D3DX_DEFAULT,
20: D3DX_DEFAULT,
21: 0,
22: NULL,
23: NULL,
24: &pTexture) != D3D_OK)
25:
26: {
27: throw "Exception To Create Texture";
28: }
29: delete str;
30:
31: //在Table中加入这个Resource
32: StructRes* pRes = new StructRes(pTexture, type);
33: resourceTable.insert(make_pair(filename, pRes));
34:
35: return pTexture;
36: }
37: else if (type == ResourceType::RTMesh)
38: {
39: .......
40: }
41: else if (type == ResourceType::RTEffect)
42: {
43: .......
44: }
接着上面的代码,如果对应文件名的资源没有存在,则根据资源的类型进行加载,调用API函数。
这段代码应该还是比较好理解的,这里就不说了。
贴一段用的时候的代码,以Texture为例,比如需要获取一份IDirect3DTexture9*(pTexture)的资源。
1: ResourceManager* pResourceMgr = ResourceManager::GetInstance();
2:
3: pTexture = (IDirect3DTexture9*)(pResourceMgr->
4: GetD3DResource(_filename, device,ResourceType::RTTexture));
另外还有一个地方就是资源的释放,在StructRes中有一个useCount, 当被引用一次+1,被释放一次-1,最后一个出门的人就关灯锁门了。
3. 模型
之前将了一下资源复用,以贴图为例。贴图的内容相对比较简单,只需要保存一个引用IDirect3DTexture9*类型的指针就好了,但是模型就不一样,模型涉及到很多操作,比如说获取mesh的 |