MMORPG服务器场景中的aoi算法思考
最近在做一个移动平台上的MMORPG项目,负责服务器的工作,第一次做这种类型的游戏服务器的开发,准备工作时必须的,综合网上的资料和自己的想法,总结了一下AOI的实现方式,从以下三个方面来谈谈。水平有限,本文提出的实现方式可能会很笨拙,但是应付一般的场景还是可以的。
1、关于怪物主动攻击玩家的检测
如果场景内有N个怪物,M个玩家,则进行一次检测需要计算N*M次玩家和怪物之间的距离,这种方法很笨。一种新的方式是:首先对游戏的场景进行一下划分,如下图,将场景划分成若干个格子,每个网格拥有唯一编号gridId,白色星代表当前玩家的位置,红色网格代表玩家所在的网格区域黄色的为8个临近区域,服务器为每个网格对象维护两个列表:monsterList和playerList,这两个列表记录了在当前网格中的怪物和玩家。
当玩家进入场景后,将玩家当前所在的网格id(curGridId)设置为红色网格的gridId,将周围的8个黄色网格的gridId放入玩家的adjacentGridList中。具体的怪物攻击检测流程:
这样处理的好处有:
(1) 只有当玩家移动时才会进行怪物主动攻击玩家的检测。避免了不必要的检测;
(2) 减少了计算怪物和玩家距离的次数,如一开始所述,如果场景内有N个怪物,M个玩家,则进行一次检测需要计算N*M次距离。该方法首先在场景更新线程中判断玩家是否从网格g1进入网格g2,判断时会与周围8个格子的中心点计算,最差的情况是计算8次,但是此处也可以优化,如果知道玩家的移动向量,则只进行一次计算就可以确定玩家是否跨越了格子。怪物攻击玩家检测线程中,只计算玩家当前所在的格子中的怪物与玩家的距离,计算次数为(假设每个格子中怪物和玩家平均分布):(N/格子数量)*(M/格子数量)。
2、怪物移动控制
游戏中会单独启动一个线程(T_MonsterMove)去执行怪物移动的操作,该线程属于定时线程,以1秒或更短的频率根据怪物的类型更新怪物的位置。并将移动后怪物的坐标信息发送给客户端,T_MonsterMove线程并不需要和主逻辑线程进行同步操作,因为T_MonsterMove线程中移动的怪物都是处于服务器托管的,怪物主动攻击线程检测到玩家进入怪物攻击范围后,会将该怪物从服务器托管列表中移除,交由客户端托管。
3、怪物和玩家移动等信息的广播范围
在游戏中,我们把格子的大小定义为玩家360度视野的范围。adjacentGridList保存的是玩家相邻的8个格子id和curGridId保存的是当前玩家所在的格子的id。以玩家移动信息为例,只需要将消息发送给这9个格子中的玩家即可。将信息发送给相邻的8个格子的玩家可以避免玩家突然闪进视野的情况发生。
MMORPG服务器场景中的aoi算法思考的更多相关文章
- 游戏中的AOI(Area of Interest)算法
游戏中的AOI(Area of Interest)算法 游戏的AOI算法应该算作游戏的基础核心了,许多逻辑都是因为AOI进出事件驱动的,许多网络同步数据也是因为AOI进出事件产生的.因此,良好的AOI ...
- [转]MMORPG服务器架构
MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...
- MMORPG服务器架构
MMORPG服务器架构 一.摘要 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构2.网络游戏网络层,包括网络协议,IO模型,网络框架,消息编码等.3.网络游戏的场景管理,A ...
- 网络游戏MMORPG服务器架构
转载于:http://justdo2008.iteye.com/blog/1936795 1.网络游戏MMORPG整体服务器框架,包括早期,中期,当前的一些主流架构 .关键词 网络协议 网络IO 消息 ...
- 分布式数据库中的Paxos 算法
分布式数据库中的Paxos 算法 http://baike.baidu.com/link?url=ChmfvtXRZQl7X1VmRU6ypsmZ4b4MbQX1pelw_VenRLnFpq7rMvY ...
- 京东云罗玉杰:OpenResty 在直播场景中的应用
2019 年 3 月 23 日,OpenResty 社区联合又拍云,举办 OpenResty × Open Talk 全国巡回沙龙·北京站,京东云技术专家罗玉杰在活动上做了< OpenResty ...
- 在WebGL场景中管理多个卡牌对象的实验
这篇文章讨论如何在基于Babylon.js的WebGL场景中,实现多个简单卡牌类对象的显示.选择.分组.排序,同时建立一套实用的3D场景代码框架.由于作者美工能力有限,所以示例场景视觉效果可能欠佳,本 ...
- 简述C#中IO的应用 RabbitMQ安装笔记 一次线上问题引发的对于C#中相等判断的思考 ef和mysql使用(一) ASP.NET/MVC/Core的HTTP请求流程
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
- 超大地图MMORPG的场景管理
目前在做一个超大地图MMORPG的场景管理部分,客户端通过动态预读解决了超大图量的动态加载,但是在做人物行走的时候遇到了一些问题: 一张地图上的PLAYER和NPC等是存放在一个list中的,地图超大 ...
随机推荐
- 怎样删掉vc++ 对话框中的蓝色虚线框
选择"格式"--"切换辅助线"或者是快捷键alt+o , g
- [LeetCode] 347. Top K Frequent Elements 前K个高频元素
Given a non-empty array of integers, return the k most frequent elements. Example 1: Input: nums = [ ...
- html头部中各式各样的meta
在写网页的过程中,第一步就是创建一个html文档.如下是最简单的 html5 文档. <!DOCTYPE html> <html lang="en"> &l ...
- 雅礼集训 2017 Day4 编码(2-sat)
题意 题目链接:https://loj.ac/problem/6036 思路 首先,有前缀关系的串不能同时存在,不难看出这是一个 2-sat 问题.先假设所有串都带问号,那么每一个字符串,我们可以 ...
- 前端三大主流框架的对比React、Vue、Angular
前端三大主流框架的对比React.Vue.Angular React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站, 并于 2013年 5 月开源.React 拥有较高的 ...
- python做一个简易图片下载工具
代码有点乱,先这样 # -*- coding:utf-8 -*- #__author__ :kusy #__content__:文件说明 #__date__:2018/11/01 11:01 impo ...
- 明解C语言 入门篇 第五章答案
练习5-1 /* 依次把1.2.3.4.5 赋值给数组的每个元素并显示(使用for语句) */ #include <stdio.h> int main(void) { int i; ]; ...
- AngularJS简介与四大特征
1.1 AngularJS简介 AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购.是一款优秀的前端JS框架,已经被用于Google的多款产品当中.A ...
- lua中,两种json和table互转方法的效率比较
lua中json和table的互转,是我们在平时开发过程中经常用到的.比如: 在用lua编写的服务器中,如果客户端发送json格式的数据,那么在lua处理业务逻辑的时候,必然需要转换成lua自己的数据 ...
- Xamarin vs React Native vs Ionic vs NativeScript: Cross-platform Mobile Frameworks Comparison
CONTENTS Reading time: 14 minutes Cross-platform mobile development has long been a viable alternati ...