文章目录
【第一章】游戏中地形管理概念的基础
1)什么是地形,为什么要有地形管理
- 什么是地形?
terrain - 山川河流平原沼泽
- 为什么要有地形管理?
1)用数据描述地形信息
2)组织高度,阻挡信息数据结构
3)提供高效定位访问机制
4)为上层模块提供定位服务(最重要的服务,换句话说服务器地形更多的是承载一个校验的功能,精度不必像客户端那么精密
)
2)地形管理角度的游戏发展史概述(在服务器怎么描述地形数据?)
2D游戏
- 2D游戏
1)视角锁死
2)建筑不可进入,没有多层信息 - 2.客户端
2D地形贴图 - 3.服务器
1)Grid网格(客户端的地图在服务器就是二维数组,也叫Grid网格,没有高度信息,只有二维网格)
2)无高度信息,只有阻挡信息
2.5D游戏
- 2.5D游戏
1)视角不固定
2)建筑不可进入,没有多层信息 - 2.客户端
3D地形场景 - 3.服务器
1)2D Grid网格
2)无高度信息,只有阻挡信息
3D游戏
-
3D游戏
1)开放视角
2)建筑可以自由进入
3)自由跳跃,自由轻功移动,可见即可达 -
2.客户端
3D地形 -
3.服务器
3D地形
【第二章】服务器端地形管理实践
1)服务器2D地形是以Grid Mask 网格,也就是二维数组实现的
- 格子解释
1)二维数组
2)(x,y)二元组即可描述对象位置
3)用Mask标记格子属性
1)是否可以行走(可进入)
2)是否是水面
3)是否是沼泽
4)ect...
- 格子大小(一般来说是以
50cm
为一个单位)
1)格子太大,对于客户端来说不精准,锯齿形太大,在一些边缘的地方容易穿帮
2)格子太小,对于服务器额外的计算压力太大
2)服务器3D地形实现 – Grid Layer 网格
- 背景
一开始是用的Grid Layer网格这种技术来做的,相当于把GRID网格扩展了一下,GRID网格只有一层 - 简介
1)由二维数组变成三维数组(新增layer一层)
2)Grid Mask网格的扩展
3)(x,y,z,layer)三元组描述对象位置
4)可以保留mask特性
- 缺点
描述复杂网格建筑不准确,比如螺旋上升的建筑
- 遇到的问题
复杂地形描述不了
3)3D地形实现 – Polygon Mesh(多边形网格)
- 定义(大部分客户端引擎采用这个)
1)多边形网格
2)精度高,描述能力强
3)数据量大,数据结构复杂,代码实现复杂
4)不支持特定地形标记
- 其他
有些服务器采用客户端比如虚幻对应的引擎,比如说PHYSX 、HAVOK这样的引擎,当服务器要和客户端以一样的频率、一样的帧率去跑,这个引擎计算的时候,要把整个世界里面所有对象都导进来,它本身是个黑盒再进行计算,会导致整个服务器的承载会变得非常差
,服务器要承载的玩家上限比较大,这样导致优化效果比较差
4)3D地形实现 – Voxel(体素,在像素PIXEL的基础上增加了高度信息)
1)体素网格
2)描述能力强
3)服务器随机访问性能较高
4)数据结构简单,代码可维护性强
- 使用举例
MINECRAFT
5)基于Voxel的3D场景建模以及碰撞算法
1)先检测是否这个地形是否能行走(mask判断)
2)检测高度差是否能容纳