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

一张截图

描述

核心作为重要的地位,就是因为它掌握了最核心的东西:数据,也就是说核心就是数据的处理中心。

析构方法(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大型游戏设计与开发(服务器 游戏场景 核心详述)的更多相关文章

  1. MMORPG大型游戏设计与开发(游戏服务器 游戏场景 概述 updated)

    我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括 ...

  2. MMORPG大型游戏设计与开发(服务器 AI 概述)

    游戏世界中我们拥有许多对象,常见的就是角色自身以及怪物和NPC,我们可以见到怪物和NPC拥有许多的行为,比如说怪物常常见到敌对的玩家就会攻击一样,又如一些NPC来游戏世界中走来走去,又有些怪物和NPC ...

  3. MMORPG大型游戏设计与开发(服务器 游戏场景 动态场景与副本)

    场景的内容讲解到今天算是暂时划上一个句号了,接下来为大家讲解的是AI部分(大型AI),如果有兴趣的朋友不妨持续关注这些文章,大家一起学习和进步.动态场景和副本是场景中特殊的类型,副本在这里想必已经是无 ...

  4. MMORPG大型游戏设计与开发(概述)updated

    1.定义 MMORPG,是英文Massive(或Massively)Multiplayer Online Role-PlayingGame的缩写,即大型多人在线角色扮演游戏. 2.技术与知识 在这系列 ...

  5. MMORPG大型游戏设计与开发(客户端架构 part8 of vegine)

    脚本模块是游戏设计中争论比较多的话题,那是因为作为脚本本身所带来的利弊.其实这都无关紧要,取舍是人必须学会的一项技能,如果你不会取舍那么就让趋势给你一个满意的答复.自从魔兽世界以及传奇(世界)问世以来 ...

  6. MMORPG大型游戏设计与开发(服务器 游戏场景 地图和区域)

    地图的数据以及区域的信息是场景的重要组成部分,这些数据同时存在客户端和服务器,而且都是由编辑器生成的.那么保存的文件数据结构是怎样的?一张3D的场景地图又是怎样处理这些数据的?同时告诉大家这里同样只是 ...

  7. MMORPG大型游戏设计与开发(服务器 游戏场景 多线程)

    多线程在随着cpu发展应用的是越来越多,游戏场景因为其在服务器所占的数据量与逻辑复杂度的原因必须依赖于它.为什么场景要采用多线程?场景的线程是怎样的?场景的线程又是如何创建的?场景的线程又是怎样管理的 ...

  8. MMORPG大型游戏设计与开发(服务器 AI 事件)

    AI中的事件与场景中的事件大致相同,都是由特定的条件触发的.只不过AI的事件与其他事件不同的是,对于AI的事件往往是根据不同的AI类型,和动态的触发条件下才产生的.其实不管AI多么智能,它对应的触发条 ...

  9. MMORPG大型游戏设计与开发(服务器 AI 基础接口)

    一个模块都往往需要统一的接口支持,特别是对于非常大型的模块,基础结构的统一性非常重要,它往往决定了其扩展对象的通用性.昨天说了AI的基本概述以及组成,作为与场景模块中核心一样重要的地位,基础部分的设计 ...

随机推荐

  1. NIOS II 中直接调用Modelsim仿真

    STEP1:创建一个工程,实现并编译该工程,编写TestBench文件. STEP2:设置启动Modelsim的路径 选择Nios II菜单Tools->Options..,在弹出的界面中,选择 ...

  2. 响应式WEB设计的9项基本原则

    响 应式Web设计对于解决多类型屏幕问题来说是个不错方案,但从印刷的角度来看,其却存在着很多的困难.没有固定的页面尺寸.没有毫米或英寸,没有任何物理 限制,让人感到无从下手.随着建立网站可用的各种小工 ...

  3. 为input输入框添加圆角并去除阴影

    <input type="text" name="bianhao" value="" placeholder="请输入商品编 ...

  4. 从零开始学Python08作业源码:开发简单的FTP(仅供参考)

    服务器端:server_server.py #!usr/bin/env python # -*- coding:utf-8 -*- # auther:Mr.chen # 描述: import sock ...

  5. 初识UML类图--类之间关系

    前言 最近有打算学习一下设计模式,所以就去看了园子里面左潇龙大哥的设计模式文章,看完之后只有一个感觉,我啥时候也能写出来这么牛逼的文章啊,但是我这语文老师死的早的人还是算了,但是设计模式还是要学的,这 ...

  6. PHP流程控制之循环结构

    计算机程序最擅长的功能之一就是按规定的条件,重复执行某些操作.循环结构可以减少源程序重复书写的工作量,即在给定条件成立时,反复执行某程序段,直到条件不成立为止.给定的条件称为循环条件,反复执行的程序段 ...

  7. JavaScript基本语法(四)

    一.     JavaScript 函数 1.函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.我们可以将一些常用的代码封装成函数,待用到的时候就能直接调用使用.利用函数可以使代码的组织结构 ...

  8. 最大似然判别法和Bayes公式判别法

    最大似然判别法 Bayes公式判别法

  9. iOS模态弹出半透明视图控制器

    项目中需要实现点击按钮出现的视图全屏覆盖,呈半透明状态可以看到下面的视图? 解决方案: 绕了很多弯路原来可以使用模态弹出一个视图控制器 在iOS8之后只需要设置一个最新的属性 SecondViewCo ...

  10. Objective-C 快速入门--基础(五)

    1.什么是属性?属性会帮我们做哪些事情?请详细说明. (1)①属性是Objective-C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现:②能在一定程度上简化程序代码,并 ...