MMORGP大型游戏设计与开发(服务器 游戏场景 核心详述)

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

一张截图

描述

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

析构方法(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[] = {33, 23, 15, 78, 88, 99, 198, 188, 133, 33};
  int32_t temp;
  int32_t i, j;
  int32_t high, middle, low, count;
  count = sizeof(array) / sizeof(array[0]);
  for (i = 1; i < count; ++i) {
    temp = array[i];
    for (low = 0, high = i - 1; high >= low;) {
      middle = (low + high) / 2;
      temp < array[middle] ? high = middle - 1 : low = middle + 1;
    }
    for (j = i - 1; j >= low; --j) array[j + 1] = array[j];
    array[low] = temp;
    aprint(array, count);
  }
  return 0;
}

void aprint(int32_t array[], int32_t count) {
  int32_t i;
  for (i = 0; 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[] = {33, 23, 15, 78, 88, 99, 198, 188, 133, 33};
  int32_t delta[] = {4, 2, 1};
  int32_t m = 3;
  int32_t length = sizeof(array) / sizeof(array[0]);
  shellsort(array, length, delta, m);
  printf("result: ");
  displayarray(array, length);
  return 0;
}

void shellsort(int32_t array[], int32_t length, int32_t delta[], int32_t m) {
  int32_t i;
  for (i = 0; i < m; ++i) { //进行m次希尔插入排序
    shellinsert(array, length, delta[i]);
    printf("the %d times sort: ", i + 1);
    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 >= 0 && 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 = 0; i < length; ++i)
    printf("%4d", array[i]);
  printf("\n");
}

总结

本次讲解的场景只是以理论和武侠世界/天龙八部为原型的一个基础概念,其中有许多不足的地方还需不断的纠正,而且对于最新的大型游戏中有些已经做了较大的改变,我会适当结合最新的大型游戏进行一定的解析。算法作为程序比较重要的部分,我们应该了解一下,但不应该死记硬背。

时间: 2024-10-19 21:52:15

MMORGP大型游戏设计与开发(服务器 游戏场景 核心详述)的相关文章

MMORGP大型游戏设计与开发(游戏服务器 游戏场景 概述)

我们在玩游戏的时候,我们进入游戏后第一眼往往都是看到游戏世界中的场景,当然除了个别例外,因为那些游戏将游戏场景隐藏了起来,如文字游戏中的地点一样.既然我们接触了游戏世界的核心,那么作为核心的场景又包括哪些内容呢? 一张截图 场景组成 这里以天龙八部/武侠世界作为参考,其组成主要为核心.事件.区域.聊天管道.搜索机.寻路器.副本.掉落. 核心 每个系统都有自己的核心部分,核心一般作为整体的控制的作用,在场景中数据逻辑的处理便放在核心部分,比如场景中的所有对象以及每个对象的数据,网络的同步等等. 事

MMORGP大型游戏设计与开发(客户端架构 part9 of vegine)

时间在人们的生活中是多么重要的东西,如果打乱了时间,不知道这个时间会成什么样子.在客户端中,自然也有时间模块,因为不同的时间可能会处理不同的事情,特别是在追求高度自由化的同时,时间也成为了一个很重要的核心.没有时间,游戏世界将失去平衡,没有时间的游戏,会让人觉得乏味而单调.好了,我不用再强调时间多重要,想必大家已经明白了.比如游戏中的时辰变化,天气变化,这个是有时间的吗,答案是肯定的.在此次设计中,时间的接口中又提供了哪些方法呢? CODE 模块time 文件system.h /** * PAP

MMORGP大型游戏设计与开发(客户端架构 part1 of vegine)

重写有些核心接口的时候,其实遇到了许多的问题,甚至一度的想过要放弃,但是最终还是坚持了下来.在客户端提供的这些接口中,可以清晰的看到客户端所依赖的各种模块的支持,以及各自之间的一些关联.下面只是介绍了vengine(微引擎)接口的基础模块框架,所谓的接口即对象设计中常见的Interface,为一个框架提供了清晰的规范支持. VEGINE FRAMEWORK 功能实现 该接口已全部实现,具体的实例只需要继承接口封装即可.上图只为简单的模块介绍,其实每个接口都有每个接口其特别的用处,这一点会在接下的

MMORGP大型游戏设计与开发(客户端架构)

首先为所有等待的朋友说一声歉意,实在让大家等的太久.客户端的设计本来就是一个大的工程,而且工作的关系,也没有太多时间在这方面做研究.不过在私下有空的时间,我还是继续着这方面的研究,很遗憾没有用期望的ogre+cegui最新的版本作为开发,这方面原因是新的版本资料实在不多,对于没有什么经验的人来说实在是一大难事,所以最终选择了同天龙八部/武侠世界版本接近的源码作为开发.好了,废话不多说,今天好介绍的是客户端的基本构架,天龙八部/武侠世界的设计模式. CLIENT 功能实现 本次功能实现了vengi

MMORGP大型游戏设计与开发(客户端架构 part14 of vegine)

渲染在客户端中具有着至关重要的地位,试想我们玩游戏的第一感觉是什么就会明白了,良好的画面效果对客户端来说是多么的迫切.没有学习过opengl或是direct3d这些渲染API的朋友们也不必担心,而学习过这些接口的朋友们现在可以安心了,没有必要为了一个小小的渲染弄的头疼.因为渲染引擎可以帮你解决大部分你所能想到的渲染效果,这也正是渲染引擎所诞生的直接原因,那就是为了便利. CODE /** * PAP Engine ( -- ) * $Id system.h * @link-- for the c

MMORGP大型游戏设计与开发(客户端架构 part6 of vegine)

客户端的变量模块部分主要是将一些常用可变的值集中管理,如窗口的大小,是否开启音乐,音量的大小等等.这些变量通常会应该到客户端的操作,一般来说变量改变的时候会调用一个回调进行处理.下面我们就看看该模块的常用方法吧. CODE 文件system.h /** * PAP Engine ( -- ) * $Id system.h * @link -- for the canonical source repository * @copyright Copyright (c) 2013-2014 viti

MMORGP大型游戏设计与开发(客户端架构 part4 of vegine)

昨天是七夕,祝大家都过的快乐,希望这句迟到的问候不会造成大家心中的困扰.这一节讲到了前端比较重要的模块,性能以及调试异常模块.一个应用的性能往往是最核心的部分,就像人身体的各个器官一样,一小部分也不能马虎,否则你得到的只是你想象不到的苦果.在这里,我们封装了性能采集,调试输出.变量打印,以及异常收集.希望大家会对这方面有所了解与进步. 结构 CODE ax模块,文件profile.h /** * PAP Engine ( -- ) * $Id profile.h * @link -- for t

MMORGP大型游戏设计与开发(客户端架构 part11 of vegine)

从早年的无声电影到现在的逼真3D大片,人类在科技上可谓是一再突破.不知道有没有人经历过那无声的日子,没有声音的世界,咱们的耳朵也就失去了它本有的用途了.在游戏世界中,声音元素成了必不可少的一部分,一个没有声音的游戏现在可谓是太少见了,而且存活下来的希望自然不高.当前在游戏中,特别是3D游戏中,声音分为3D音效和平面音效.3D音效中主要是指环境音效,比如说某个地方的流水发出的声音,某片树林里充满的鸟叫声.平面音效即咱们感官的普通音效,背景音乐,自身的技能.UI声音. CODE 模块sound 文件

MMORGP大型游戏设计与开发(客户端架构 part7 of vegine)

我在讲述某个东西的时候总喜欢从简单的入手,然后从互相关联的地方联合讲解,因为时间关系所以没能讲的十分详细,这点引以为憾,希望得到大家的谅解.这一节讲述的是微引擎(vengine)比较简单的一个模块,那便是鼠标指针的模块,方法也提供的不多,相信大多数熟悉VC的朋友们已经掌握了这方面的知识,我也就不在此班门弄虎了. CODE 文件system.h /** * PAP Engine ( -- ) * $Id system.h * @link -- for the canonical source re

MMORGP大型游戏设计与开发(客户端架构 part3 of vegine)

无论在何处在什么地方,我们都或多或少的接触到数学知识.特别是在客户端中,从打开界面的那一刻起就有太多与数学扯上的关联,如打开窗口的大小,窗口的位置,窗口里面的元件对象,以及UI的坐标等等.而在进入游戏之后,不仅有这些坐标,还有了世界的坐标,以及场景坐标,还有粒子对象的各种属性值.但为什么要扩展ogre的数学库呢?就让我们看看有哪些类型的吧. CODE 文件math/base.h /** * PAP Engine ( -- ) * $Id math.h * @link -- for the can