|
下面是我琢磨了一段时间写的东东,没有写完,也写不下去了,脑子里头已经有框架和概念了,但是比较抽象,都是逻辑层面的东西
贴这里抛砖引玉吧,这方面的东西听少,欢迎讨论和指教
越多越好,如果没有人回复,那就太凄惨了 [em4]
谁能和我一起来完成它?[em24]
-----------------------------
游戏资源管理
内容是程序设计方法,并非具体实现。
面向游戏程序优化,非其它软件优化。
主要示例、考虑出发点基于3D MMORPG,方法同样适用其它游戏。
冯。诺伊曼体系计算机中有两种基本资源:1,存储 2,计算。
优化目的:轻量/高效/快速
优化原则:资源占用越少越好
终极目标:不需要Loading画面、流畅运行的游戏软件
一,存储资源优化
---------------------------------------
|
|
|
|
|
|
|
|
|
|
---------------------------------------
概念:
‘可能有用资源’、‘不可用资源’、‘可用资源’、‘垃圾资源’
基本资源:
使用策略:
游戏资源管理器:
资源划分粒度:
对于资源管理器来说,被提交的装载资源请求可以是一张贴图或者一套皮肤或者是一整套人物数据,里面包括了他的所有动作的骨骼动画,所有表情的Mesh动画
文件,所有可能使用的贴图等。
资源优先级:
替代品的诞生:
二,计算资源优化
性能评测:作用是标尺,衡量出瓶颈处,找到优化的关键。
预处理:对于实时程序来说,预处理减少了资源消耗而且一劳永逸,事实上根本没有理由不去采用这种方法。原则就是:能够在我们的编辑器中处理的东西,就不要在玩家机器上处理。
调度器:计算资源的分配管理
例如我们的MMORPG游戏世界里头有一种叫做‘好心人’的NPC,他们散布于游戏世界的各处,帮助玩家进行游戏,充当和平使者。当然,如果让他们更像玩家在进行游戏时‘偶尔碰到的好心人’的话,我们的游戏设计者可能考虑让这些‘好心人’在游戏世界中自由散步,或许还不时说几句话,做点儿‘帮助老大妈过马路’这样的好事儿。
一直到这里,这个想法都很完美,可是如果老板认为游戏世界里这样的‘好心人’应该多一些,以达到玩家‘容易上手’的目的。例如他说要1000个,那会怎么样?我想可能诞生这样的代码:
CGame::Update()
{
...
for( int i(0);i<1000;i++ )
m_KindMan.Update();
...
}
我们假设 CKindMan::Update() 函数作为好心人的状态更新函数,里头可能包含简单的FSM和AI处理,但是有1000个的话,对游戏来说也未免是个负担。因为‘仁慈的好心人’对于Server的CPU,只是个负担,他们不会提供任何好的建议给CPU以减轻负担。
但是我们知道这样的好心人在游戏的中的作用似乎并不如‘拥有人性化AI的妖艳的女招待’吸引人,没必要在他们身上花费太多资源。而且,他们在游戏中偶尔发呆的话,也不会引起玩家太多怀疑,至少不会让玩家觉得server当机了。那么我们可以考虑把代码写成这样:
int CGame::m_nLastPos; //初始值为0整数
int f=10; //更新跨距,以游戏循环记。决定了更新频度。(f>= 2)
CGame::Update()
{
...
for( int i=0;i<1000/f;i++ )
m_KindMan[m_nLastPos+i*f].Update();
( m_nLastPos == f ) ? m_nLastPos = 0 : m_nLastPos += 1;
...
}
就这么简单,我们没必要每个游戏循环更新所有的‘好心人’这样就只用1/f的计算资源消耗。反之对于吸引人的‘拥有人性化AI的妖艳的女招待’NPC,我们知道我们不能这样做,或者只能让f值不大得离谱,因为她不能看起来就像块木头或者贴在墙上的画。
此方法扩展开来就是没有必要在每个游戏循环中更新所有对象。尤其是当你的游戏中有上万个东西需要在游戏循环里头更新状态的话(别告诉我你们用有几十块CPU,几十G内存的IBM服务器运行游戏 。
那调度器用来做什么呢?她可以是个根据游戏世界状态进行统一调度分配计算资源的管理者,例如在游戏负载小的时候提高那些NPC的更新频度,让他们‘活跃’起来,在Server负载很大的时候,调整频度,避免玩家看新式幻灯片。
算法优化:游戏是仿真世界,无需真实科学计算。
关于这方面的资料很多了,不再罗嗦。
三,程序设计者永远不是万能的。
结论:结合游戏的设计进行优化才是最恰当的。
如果一个优化策略是:人物处于游戏的(非战斗)城市场景内时,程序不装载游戏中人物的各种攻击动作、各种被攻击效果,出于让游戏跑得快点儿得念头,想必没有程序员会表示异议。
但是如果游戏设计者认为每个黑色星期五和每个21号的周日(他们有奇怪的想法的话也并不奇怪)都可以在城市内进行自由PK的话(或者设计者想在游戏世界中的终极魔头来到这个城市的时候,城市内的人必须能够自保),那么我们也不必立刻否决此项优化策略——这只是个特例,或许你只需在代码内增加几行,就可以做到两全其美。
以上例子同时说明了,特殊和一般的道理。我们只需去集中经历优化80%频繁使用的代码。
而且要记住:放之四海皆准的完美优化方案是永远不存在的。
[end] |
|