简单优化下AOI模块
前言
当游戏开启活动让大量玩家聚集在指定地图范围内时,给服务器和客户端带来最直接的麻烦就是:
- 服务器带宽占用率高
假设同屏有1000个玩家,那么任意一个玩家移动一次需要同步其他999个玩家。这导致服务器消息数量指数级增长,带宽承受压力极高。
- 客户端渲染卡顿
因为同屏人数越多,客户端需要渲染的模型就越多。这样在一些普通的硬件设备下会直接导致卡顿、发热。
思路
除了升级硬件,还可以在以下两个方面进行优化:
简单优化下AOI模块
当游戏开启活动让大量玩家聚集在指定地图范围内时,给服务器和客户端带来最直接的麻烦就是:
假设同屏有1000个玩家,那么任意一个玩家移动一次需要同步其他999个玩家。这导致服务器消息数量指数级增长,带宽承受压力极高。
因为同屏人数越多,客户端需要渲染的模型就越多。这样在一些普通的硬件设备下会直接导致卡顿、发热。
除了升级硬件,还可以在以下两个方面进行优化:
一个粗略的任务系统
为了让游戏的内容丰富起来,同时也能辅助构建游戏世界所处的环境和世界观等等,所以准备简单的开发一个任务系统。
e.g.
支线任务 - 砍人买瓜
「前去长安城购买甘甜可口的西瓜」
奖励:载具*1、武器*1
我:“哥们儿,这瓜多少钱一斤呐”
瓜摊老板:“两块钱一斤”
我:“给我挑一个”
瓜摊老板:“行,这个怎么样?”
这瓜保熟吗?]不买了]行为树一般应用于游戏内物体的 AI 决策,以树的形式控制物体接下来的动作。比如: 血量太少 -> 吃药、攻击距离不够 -> 移动等等。
最近在摸索小游戏开发,有一些联机型的功能需要机器人参与,所以需要实现一下游戏 AI。综合一下实现方案基本是以下两种:
FSM 也是最开始采用的方案,实现起来简单粗暴。缺点是整个逻辑非常臃肿很难模块化,后面再对 AI 进行更新和维护比较恶心,很容易因为漏改、错改导致不可用。
行为树是由一系列节点构成的,每个节点对应一个动作,自上而下执行且每个节点都会返回执行状态。
在网络游戏中,通信协议是其中必不可少的组成部分。一个通信协议的大小、结构将与服务器负载及客户端延迟息息相关。
游戏的通信协议,一般需要考虑 2 个部分:
网络传输协议
数据交换格式
之前在学习数据结构与算法 - AStar(A*)等寻路算法的过程中提到过网格地图时由类似0是可移动节点、1是障碍节点的网格组成的一张地图,这些地图信息是怎样生成出来的呢?
地图编辑器是一种所见即所得的游戏地图制作工具,它辅助设计和输出地图数据,包括创建、编辑、存储和管理游戏地图数据。
只考虑 2D 地图,一般来说有两种方式:
AST(Abstract syntax tree)抽象语法树,用于表示编程语言源代码的一种抽象语法的结构,树的每个节点都对应源代码中的一个结构。
计算机如何生成 AST 结构?一般来说顺序如下:
扫描源代码,生成标记(token)
解析 tokens,构造 AST 结构
Tire 树又称单词查找树、前缀树,是一种哈希树变种的树形结构。核心思想是空间换时间,利用字符串的公共前缀来提高查询效率,常常被应用字符统计、检索等场景,比如搜索引擎的词频统计和提示等
前缀树的存储原理很简单,即合并字符串相同的字符前缀进行存储。
比如,存储dog、cat、doing三个字符串的树结构:
AOI(Area Of Interest)翻译过来称为“感兴趣的区域”,用于计算玩家与玩家(或其他 Entity)之间彼此进入、离开、移动视野的算法。通俗的解释比如,玩家离开某个地图时,计算出需要通知的其他玩家。
AOI 模块是多人联机游戏服务器中很重要的功能模块之一,AOI 模块的“好”与“坏”会很大程度上影响服务器的性能。
当一个玩家进入场景后,首先要计算出场景中的其他所有玩家并放进对象集合(又称观察者集合),之后该玩家的进入、移动、离开或其他行为都将会一一通知该集合内的玩家,并且每个玩家都需要维护这样一个对象集合。
Watchers 观察者集合,即能够看到我的其他玩家或实体。
需要注意的是,该对象集合内的玩家列表会随着玩家的行为发生变化,在玩家离开场景后清空对象集合。
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true