Direct3d – 代码结构

我正在学习directx,他们教我们有一个GraphicsLayer类,它是与direct3d库连接的类。 这样,这个类完全独立于其他类(我的游戏类),这意味着将渲染器更改为OpenGL不需要太多的努力,只需更改graphicLayer即可。

这个类有它的LoadAssets,Paint方法,但我有一个问题,他们告诉我们加载这个类中的所有资产。 这意味着所有这些方法将在loadAssets方法中:

D3DXCreateTextureFromFileEx(g_pD3DDevice,"tiles.png",0,0,1,0,D3DFMT_UNKNOWN,D3DPOOL_DEFAULT,D3DX_FILTER_NONE,D3DX_FILTER_NONE,NULL,NULL,NULL,&texTiles); // And more resources to load //... 

您看到的texTiles是在graphicLayer.h中声明的LPDIRECT3DTEXTURE9实例。

所以我的问题是,你如何管理所有的资源? 我是否必须在.h中声明所有的游戏纹理,即使我不使用它们? 你将如何只加载场景中的资源,并以代码结构的方式绘制它们?

有关编程的有趣之处在于有无数的方法来做事情。 给10个程序员一个问题,你会得到10个完全不同的解决scheme。 只是因为你被告知这样做,并不意味着这是唯一的方法。

在你的代码中对资源的文件名进行硬编码通常是一个糟糕的devise,因为它使得渲染器不够灵活,并且阻止了游戏引擎和游戏内容的分离(想象你正在和一个graphics艺术家一起工作,只要他们想要添加一个新的纹理)。

通常,当您在游戏中加载地图时,您在某种文件中拥有该地图。 所以你把这个文件传给你的graphics引擎来加载它。 该文件通常包含在该地图中使用的资产文件的列表。 因此,graphics引擎将在分析地图文件时加载这些资源。

为了安全记忆和减less初始加载时间,引擎还可以按需加载某些资产。 一个例子就是一个在地图上产生的敌人。 引擎可以等待加载敌人的几何形状和纹理,直到被生成,并在敌人被移除时释放内存。

在我参与的一个游戏项目中,我们通过ResourceManager类管理所有资产。 这个类会caching所有加载的资源。 所以当你需要任何地方的纹理xyz时,你可以调用ResourceManager.getTexture(“xyz.png”)。 当它是第一个调用时,它从磁盘加载该纹理。 在随后的调用中,它将返回一个caching副本。 资源管理器会自动释放一分钟内没有请求的所有caching资产,除非那些设置了“never drop”标志的资产(对于不经常使用的资产,但在使用时对时间要求严格)。