MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)
核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识。之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进步。同时在讲解这方面的知识时候,博主也在学习好算法相关的知识,每天进行两个实例的讲解,有兴趣的朋友们不妨了解一下,大家千万不好死记硬背。
一张截图

描述
核心作为重要的地位,就是因为它掌握了最核心的东西:数据,也就是说核心就是数据的处理中心。
析构方法(construct)
主要是创建核心对象、基础数据初始化。
1、网络连接管理器(scene connction manager)
处理当前场景的玩家连接。
2、网络连接回收管理器(recycle connction manager)
玩家网络连接回收,如果玩家连接断开则释放用于空闲连接。
3、地图(map)
地图数据,如格子上的数据等。
4、同步网络包队列(async packet)
队列让网络数据能够尽量安全、快速。
5、对象管理器(object manager)
场景中各种对象,如玩家、怪物、生长的资源等等。
6、对象初始化管理器(object init manager)
对象加入场景的时候,对象数据需要初始化,而用于初始化这些数据的管理器就是这个。
7、人物管理器(human manager)
主要处理玩家的相关数据。
8、怪物管理器(monster manager)
用于处理怪物相关的数据。
9、宠物管理器(pet manager)
宠物相关数据的处理。
10、物品盒管理器(item box manager)
游戏中的宝箱、掉落包等。
11、物品对象管理器(item object manager)
物品对象,一切物品对象数据管理。
12、操作平台管理器(platform manager)
特殊的平台数据处理,如物品的制作平台等等。
13、特殊对象管理器(special manager)
特殊的对象,如一个特效、陷阱等的管理。
14、交通工具管理器(bus manager)
举几个例子:马车、大雕等。
15、lua脚本接口(lua interface)
挂接脚本是为了可以频繁的改动的数据。
16、场景定时器(scene timer)
场景中的定时处理,如场景公告,特定的场景事件等。
17、脚本数据管理器(script file data manager)
脚本的文件数据的管理,一般将所有需要执行的脚本数据加入到内存中,避免再次读取耗费时间。
18、摊位数据管理器(stall info manager)
许多游戏都会有摆摊的功能,武侠世界/天龙八部中也有该功能,主要是处理摊位收费的数据。
19、储存管理器(store manager)
数据存储,场景的一些特殊数据处理,如城市的数据就需要保存一样。
20、区域管理器(area manager)
游戏场景分为若干个区域,区域分开是为了处理特殊的事件。
21、定时操作管理器(timer doing manager)
定时操作的一些处理。
22、坐骑管理器(horse manager)
坐骑也相当于一个特殊的对象存在场景中。
23、场景掉落位置管理器(scene drop position manager)
怪物的死亡往往带有物品的掉落,物品掉落的位置上一般存在相关的数据。
24、聊天管道(chat pipe)
场景的聊天专用处理器。
25、巡逻路径管理器(patrol path manager)
巡逻,一般用于怪物AI巡逻路径的管理。
26、网络数据包(packets)
1. 新的玩家(new player)
2. 新的玩家移动(new player move)
3. 新的玩家死亡(new player death)
4. 新的怪物(new monster)
5. 新的怪物移动(new monster move)
6. 新的怪物死亡(new monster death)
7. 新的宠物(new pet)
8. 新的宠物移动(new pet move)
9. 新的宠物死亡(new pet death)
10. 新的操作平台(new platform)
11. 新的特殊对象(new special)
12. 新的物品盒(new item box)
13. 新的物品对象(new item object)
14. 删除对象(delete object)
15. 新的交通工具移动(new bus move)
16. 新的交通工具(new bus)
17. 任务数据(mission data)
数据加载(load)
地图数据(map)、怪物数据(monster)、操作平台(platform)、生长点数据(grow point)、生长点步骤数据(grow point step)、区域数据(area)、摊位数据(stall info)、交通工具数据(bus)。
循环逻辑(tick)
主要负责场景网络数据处理。
心跳(heart beat)
1、 场景关闭逻辑
2、场景定时逻辑
网络连接管理器心跳、怪物管理器心跳、宠物管理器心跳、交通工具管理器心跳、物品盒管理器心跳、物品对象管理器心跳、特殊对象管理器心跳、聊天通道心跳、定时操作心跳、场景定时器逻辑、网络连接回收心跳。
消息处理(message handler)
缓存(cache)、发送(send)、移除(move)、接收(receive)。
场景关闭(close)
场景的关闭除了释放创建时的对象以外,还有后来加入的对象,所有的玩家将被移除、所有的数据将被保存。
算法(排序)
1、折半插入排序
折半插入算法与直接插入排序算法一样,通常也用于排序的元素个数较少的情况,果待排序的元素基本有序最好采用直接插入排序算法。与直接插入排序不同的是,折半插入减少了比较次数,但移动元素的复杂度还是没有改变。)
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h> /**
* 折半插入算法与直接插入排序算法一样,通常也用于排序的元素个数较少的情况,
* 如果待排序的元素基本有序最好采用直接插入排序算法。
* (与直接插入排序不同的是,折半插入减少了比较次数,但移动元素的复杂度还是没有改变。)
*/ void aprint(int32_t array[], int32_t count); int32_t main(int32_t argc, char** argv) {
int32_t array[] = {, , , , , , , , , };
int32_t temp;
int32_t i, j;
int32_t high, middle, low, count;
count = sizeof(array) / sizeof(array[]);
for (i = ; i < count; ++i) {
temp = array[i];
for (low = , high = i - ; high >= low;) {
middle = (low + high) / ;
temp < array[middle] ? high = middle - : low = middle + ;
}
for (j = i - ; j >= low; --j) array[j + ] = array[j];
array[low] = temp;
aprint(array, count);
}
return ;
} void aprint(int32_t array[], int32_t count) {
int32_t i;
for (i = ; i < count; ++i)
printf("%4d", array[i]);
printf("\n");
}

2、希尔排序
希尔排序算法可以使较小的元素很快向前移动,当待排序元素基本有序时,再使用直接插入排序处理,时间效率会高很多。希尔排序主要用在数据量在5000以下并且速度要求不太高的场景。
#include <stdlib.h>
#include <inttypes.h>
#include <stdio.h> /**
* 希尔排序算法可以使较小的元素很快向前移动,当待排序元素基本有序时,再使用直接插入排序处理,
* 时间效率会高很多。希尔排序主要用在数据量在5000以下并且速度要求不太高的场景。
*/ //排序函数,每次调用shellinsert,delta是存放增量的数组
void shellsort(int32_t array[], int32_t length, int32_t delta[], int32_t m);
//对数组中的元素进行一趟希尔排序,inc是增量
void shellinsert(int32_t array[], int32_t length, int32_t inc);
//数组打印函数
void displayarray(int32_t array[], int32_t length); int32_t main(int32_t argc, char *argv[]) {
//int32_t array[] = {22, 33, 55, 3, 6, 77, 18, 89, 32};
int32_t array[] = {, , , , , , , , , };
int32_t delta[] = {, , };
int32_t m = ;
int32_t length = sizeof(array) / sizeof(array[]);
shellsort(array, length, delta, m);
printf("result: ");
displayarray(array, length);
return ;
} void shellsort(int32_t array[], int32_t length, int32_t delta[], int32_t m) {
int32_t i;
for (i = ; i < m; ++i) { //进行m次希尔插入排序
shellinsert(array, length, delta[i]);
printf("the %d times sort: ", i + );
displayarray(array, length);
}
} void shellinsert(int32_t array[], int32_t length, int32_t inc) {
int32_t i, j, temp;
for (i = inc; i < length; ++i) { //将距离为inc的元素作为一个子序进行排序
if (array[i] < array[i - inc]) { //如果前者小于后者,则需要移动元素
temp = array[i];
for (j = i - inc; j >= && temp < array[j]; j = j - inc)
array[j + inc] = array[j];
array[j + inc] = temp;
}
}
} void displayarray(int32_t array[], int32_t length) {
int32_t i;
for (i = ; i < length; ++i)
printf("%4d", array[i]);
printf("\n");
}

总结
本次讲解的场景只是以理论和武侠世界/天龙八部为原型的一个基础概念,其中有许多不足的地方还需不断的纠正,而且对于最新的大型游戏中有些已经做了较大的改变,我会适当结合最新的大型游戏进行一定的解析。算法作为程序比较重要的部分,我们应该了解一下,但不应该死记硬背。
MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)的更多相关文章
- MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)
我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...
- MMORPG大型游戏设计与开发(服务器 AI 概述)
游戏世界中我们拥有许多对象,常见的就是角色自身以及怪物和NPC,我们可以见到怪物和NPC拥有许多的行为,比如说怪物常常见到敌对的玩家就会攻击一样,又如一些NPC来游戏世界中走来走去,又有些怪物和NPC ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 动态场景与副本)
场景的内容讲解到今天算是暂时划上一个句号了,接下来为大家讲解的是AI部分(大型AI),如果有兴趣的朋友不妨持续关注这些文章,大家一起学习和进步.动态场景和副本是场景中特殊的类型,副本在这里想必已经是无 ...
- MMORPG大型游戏设计与开发(概述)updated
1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...
- MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)
脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 地图和区域)
地图的数据以及区域的信息是场景的重要组成部分,这些数据同时存在客户端和服务器,而且都是由编辑器生成的.那么保存的文件数据结构是怎样的?一张3D的场景地图又是怎样处理这些数据的?同时告诉大家这里同样只是 ...
- MMORPG大型游戏设计与开发(服务器 游戏场景 多线程)
多线程在随着cpu发展应用的是越来越多,游戏场景因为其在服务器所占的数据量与逻辑复杂度的原因必须依赖于它.为什么场景要采用多线程?场景的线程是怎样的?场景的线程又是如何创建的?场景的线程又是怎样管理的 ...
- MMORPG大型游戏设计与开发(服务器 AI 事件)
AI中的事件与场景中的事件大致相同,都是由特定的条件触发的.只不过AI的事件与其他事件不同的是,对于AI的事件往往是根据不同的AI类型,和动态的触发条件下才产生的.其实不管AI多么智能,它对应的触发条 ...
- MMORPG大型游戏设计与开发(服务器 AI 基础接口)
一个模块都往往需要统一的接口支持,特别是对于非常大型的模块,基础结构的统一性非常重要,它往往决定了其扩展对象的通用性.昨天说了AI的基本概述以及组成,作为与场景模块中核心一样重要的地位,基础部分的设计 ...
随机推荐
- 如何在windows下的Python开发工具IDLE里安装其他模块?
以安装Httplib2模块为例 1 下载模块 到 “https://code.google.com/p/httplib2/” 下载一款适合你的压缩包“httplib2-0.4.0.zip” 2 解压下 ...
- 从零开始学 Java - CentOS 安装 JDK
我来总结一下吧 昨天我写了一篇从零开始学 Java - 我放弃了 .NET ?,在园子里突然引起了强烈的讨论,有期待我能持续更新的.有鼓励支持的.有相同经历的.也有同一个学校的师兄弟(我们相认了).当 ...
- html5 video
先简要概述一下video标签: video:嵌入视频到页面中 1. 声明video标签 单个视频的时候使用src: <video src="http://v2v.cc/~j/theor ...
- IOS开发札记(2015-08-20)
View显示数据借助Model的一个比较好的理由也是因为:有时候从服务器获取的数据相同的value可能对应不同的key(服务端多人协作开发时经常会出现这种情况) 这里盗图描述一下使用Model的好处 ...
- iOS面试题总结(一)
面试题总结 1.#import 跟#include.@class有什么区别?#import<> 跟 #import""又什么区别? include和#import都能完 ...
- 如何设置TextView控件的背景透明度和字体透明度
如何设置TextView控件的背景透明度和字体透明度 设计师给的标注都是类似这样的: 字号:26 颜色:#000000 透明度:80% 其实,程序上只要需要一个色值就OK了,那么这个色值我如何计算呢? ...
- xCode5 在ios7模拟器中出现__cxa_throw _pthread_exit错误
xCode5 在ios7模拟器中出现__cxa_throw _pthread_exit错误 2013年10月28日 ⁄ 综合 ⁄ 共 233字 ⁄ 字号 小 中 大 ⁄ 评论关闭 在项目中用模拟器 ...
- ImageView的ScaleType属性
ImageView的ScaleType各种值代表的意义: CENTER:不进行任何缩放,将图片放在容器中间 CENTER_CROP:如果图片长宽都大于等于容器长宽,则图片不缩放,否则按固定长宽比缩放, ...
- RedHat 4下无resize2fs命令
在Red Hat Enterprise Linux AS release 4上进行LVM扩展分区时,发现RedHat 4下没有resize2fs,不过可以用ext2online替换resize2fs. ...
- postfix与sendmail冲突
在Linux服务器(CentOS release 6.6)上配置好了sendmail后,测试发送邮件时发现有问题,检查sendmail服务的状态,发现其处于"sendmail dead bu ...