关于无限LOD地形的构想
前叙
----
从没好好写过一篇文章,现在也来好好写写
首先:具备了单个地形块Lod四叉裁减的能力就可以考虑做无限大地图和地形块的动态内存管理能力了
但是首要条件是现搞定单个地形块的四叉裁减,这个很基本也很是前提条件
无限地图的实现构想如下:
多个Tile的四叉剪裁
------------------
角色在移动的过程中,自身包括周围的一共9个Tile都是在可视范围内的,9个tile以外视锥看不到
视锥只和相交的Tile去做四叉剪裁,最多能看到四个Tile的内容,再分别进行可见Tile的剪裁
剪裁以后可见的Block送入到管线里面去渲染,四叉剪裁范围比较固定最多四个257x257的Tile,
范围很小,剪裁效率很高
正题部分 — 关于无限地图的构想
------------------------------
首先是客户端
地图可以是无限大的,把整个游戏的外景地图叫做世界地图吧
世界地图不论有多大,都可以拆分成块成一个个的Tile
Tile无缝拼接
------------
世界地图只做一张大的高度图,alpha混合纹理,光照图,并由美工去按tile的大小去分割这些图
这样分割出来的图自然是无缝衔接的,每个Tile也有了自己配套的高度图,混合纹理,光照了
而且整个世界源图是一张,美工也很容易处理和修改,最大的好处是解决接缝问题和动态加载问题
动态内存管理的基本思想:游戏的人物一般长时间一般再某个局部区域内活动,
游戏中只加载那些经常访问的Tile,不经常访问的Tile不加载
具体实现 -队列
---------------
把参加剪裁的地形放入到队列中去,最新参加裁减的放到head,队列中已存在的就直接排到head,
不存在就新建tile,然后排到head,过去剪裁的排后直到end出队列并释放
队列放入最近访问到的Tile首指针,长度可根据需要去定义,不能过小,或过大
过大内存好用太大,过小导致加载释放频繁,我想设置成36足够了
有一种情况很特别:就是人物从地图的一头一直跑向另一头,一定会不停的加载和释放
这是无法避免的,所以,要对加载和剪裁进行测试并优化
需要保证间隔时间内不断创建和释放的257的地形而"不卡"
也就是保证客户端带的起就行,一个257x257的Tile加载并裁减时间很短暂,其实问题不大
这个方法不一定很好,也可以采用dxsdk example contextStream技术(我还不会,也只了解- -!)
或是动态辅助GC线程的管理,有很多种策略,方法不是唯一的,只要适合自己就行。
服务器端无限地图
------------------
目前只有个模糊的构想:
因为还没开始做服务器端的东西,我想客户端搞定后,把IOCP的服务器加上来
我想登录服务器应该有用户的Session,这个Session关联与角色相关的一切信息,
包括所见的tile,并做游戏规则的检测,任务流程等等,
服务器端而不需要保存block的信息,只有所有的tile信息,和tile里面的场景包围盒信息
不需要包含细致的东西,这样不仅可以大大节约内存,而且执行效率也高,
服务器只做规则引擎,而不做渲染,还记得传奇纯外挂给我们留下了深刻的印象,只运行外挂就可以练级,
里面也有人物的地图,而且移动的地图就好像是个卫星定位图一样,根本没有细节部分,人物就是一个点
我想服务器的地图做成那样一个2D的东西就足够了,甚至需不需要做都无所谓,也就是网络监控友好点吧。
好了,就写这么多了,有些部分也还只是个构想未实现,一定有很多不健全的地方,我现在要去一一实现。
在做的过程中一定能有更好的思路。
本人业余人士,只是水平有限, 单枪匹马, 只是激情无限,有什么不对或更好的建议还望指正!