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[] = {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");
}

總結

  本次講解的場景只是以理論和武俠世界/天龍八部為原型的一個基礎概念,其中有許多不足的地方還需不斷的糾正,而且對於最新的大型游戲中有些已經做了較大的改變,我會適當結合最新的大型游戲進行一定的解析。算法作為程序比較重要的部分,我們應該了解一下,但不應該死記硬背。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM