1. 前言
话说有一段时间没有更新了,这段时间好好玩了一下,也抽空写了一点程序,把八叉树场景管理写了,也优化了一点资源加载的一些内容。之前对DirectX的好些地方还是没有弄清楚,现在对这些地方至少有了更多的了解。发一下今天完成的八叉树场景管理,里面的模型用的是DirectX示例的老虎,这儿看不太清楚--;
今天主要说说我的引擎中的模型,特效,贴图的实现,至少把大概的意思说清楚。如果还有不懂的地方可以跟我联系。
2. 模型、特效、贴图的资源复用
大家也可以看到了,上面那张图上的老虎不止一个,当同一个模型的数目多到一定程度(比如说10000个),就要考虑一定的优化了,如果每次都傻傻的从文件中把模型读取出来,保存为一个ID3DXMesh,那不仅加载的时间慢的令人无法忍受,而且耗费的内存同样巨大。在WuguiEngine中,我使用了一个比较简单的方法来解决这个问题。
设计模式的中心思想就是对修改关闭,对扩展开放,中心思想就是“变化”,但是很不好意思的说,我对D3D一知半解,在很多时候甚至不清楚“变化”将出现在什么地方,所以我使用的方法,很简单,现在用起来很清晰,但是如果对之后的扩展支持不好或者有更好的架构方法还望大家指点。本系列文章的宗旨就是抛砖引玉。
我使用了一个简单的Map来完成这些内容下面给出资源管理器(ResourceManager)的定义
1: class GraphicsDevice;
2:
3: //资源的类型
4: enum ResourceType
5: {
6: RTTexture = 0,
7: RTMesh = 1,
8: RTEffect = 2,
9: };
10:
11: //一个资源的描述
12: //由ResourceType,Void*类型的指针pResource,引用次数useCount组成
13: typedef struct StructRes
14: {
15: public:
16: StructRes(void* pRes, ResourceType type)
17: {
18: pResource = pRes;
19: useCount = 1;
20: resourceType = type;
21: }
22: ResourceType resourceType;
23: void* pResource;
24: int useCount;
25: } StructRes;
26:
27: //资源管理器
28: class ResourceManager
29: {
30: public:
31: static ResourceManager* GetInstance();
32:
33: //根据文件名获取资源文件
34: void* GetD3DResource(string filename,
35: GraphicsDevice* pDevice,
36: ResourceType type);
37:
38: //根据文件名卸载资源文件
39: void DisposeD3DResource(string filename);
40: protected:
41: ResourceManager();
42:
43: map<string, StructRes*> resourceTable;
44: static ResourceManager* pInstance;
45: };