AE-go_GameServer 是一个开源永恒之塔的模拟服务器项目(服务器端).
抱着之前对游戏数据缓存的问题看了一下对应的Player Cache相关的模块逻辑.
首先要了解一下java 几个特殊的References
网上有很多这类文章:http://blog.csdn.net/xtyyumi301/archive/2008/10/04/3015493.aspx
AE中用了两种引用类型 Weak reference(弱引用)和Soft reference(软引用),
简单的说下以上两种reference的区别:
一旦gc发现对象是weak reference可达就会把它放到ReferenceQueue中,然后等下次gc时回收它;
当对象是Soft reference可达时,gc可能会向操作系统申请更多内存,而不是直接回收它,当实在没辙了才回收它。像cache系统,最适合用Soft reference。
其中player Cache使用的是Soft refernece.
接下来就是player Cache的结构:
load
PlayerServic
有一个全局的Cache的容器,保存所有在游戏运行中的player对象==CacheMap<Integer,Player>playerCache
PlayerServic.getPlayer()//方法根据playerID和Account(账号信息)填充Player对象并保存到缓存,
对应的在玩家选择角色进入游戏前AionConnection会关联ActivePlayer,这样每个通讯连击都知道为谁服务.
以上都在CM_ENTER_WORLD协议中进行
update
PlayerService.playerLoggedIn()//设置相关的在线状态,并注册定时任务用于更新回写player的数据
+Player.onLoggedIn()//向自己的Controller(控制器)添加数据定时回写任务,
ThreadPoolManager//线程池定时任务管理器
退出处理
PlayerServic.playerLoggedOut()
+player.getController().delete();//控制器delete操作会停止所有相关的定时任务(包括数据定时同步的回写)
+CreatureController.cancelAllTasks()//取消所有定时任务
一下是简单的结构类图,仅供参考
这个缓存结构最有意思的地方在于,使用了java reference其他类型Soft reference(我们通常使用的是strong references),把缓存的回收交给虚拟机去做,不用自己手动清理,从而提高效率.其实很多缓存工具也有用到类似原理.hibernate中就有.
但是在其他模块需要拿到Player对象的时候是在World.findPlayer(int
objectId)这个接口获取.
有两个容器,FastMap allObjects和PlayerContainer allPlayers.
player同时保存在这两个容器中.还有
PlayerContainer//容器中保存了id,player和name,player的映射关系
对这样的设计 表示有质疑,多个容器存放相通的对象,要维护多个容器中引用的正确性比较麻烦.事实上AE也这样做了,登录的时候要清除之前容器所保存的对象,关联新对象引用
等等可能我之前的想法是错误的,playerCache只是用来管理refernece,而world中的 allObjects和allPlayers才是真在和业务相关的容器!
- 大小: 21.1 KB
分享到:
相关推荐
GameServer97d-Source
He encuentrado esa source ayer.Por lo que he visto es un plugin de upgrade para el gameserver season 2 VTM hasta season 5.
ACTeam -GameServer97d_AcTeam_muonline_Free!_science1st_gameserver_源码.zip
网络传输 Gameserver GameClient
一个UO网络游戏服务端,用C++写的~~希望大家喜欢!
SteamCMD-AutoUpdate-Any-Gameserver:Windows SteamCMD,用于自动更新和安装任何游戏服务器的Steam cmd设置,可配置许多有用的功能。 此批处理脚本将使您的游戏服务器自动更新更新间隔,并宣布服务器正在关闭以进行...
S3GP_Philips_GameServer
用于Node.js的Game Server框架安装Linux,macOS#用您希望的游戏命名方式替换my-gameserver。NODE_ENV = development npm install mage --bootstrap --prefix my-gameserver cd my-gameser Game Server Framework ...
项目docker-gameserver-eco 在Docker中运行专用Eco GameServer的文件为了运行,请导航到您已提取docker-compose和Dockerfile的文件夹中,将名为“ EcoServer.zip”的EcoServer-Files的当前压缩版本添加到该文件夹...
在游戏服务器中嵌入python教程在游戏服务器中嵌入python的教程“ / home / mattos / tutorial”是克隆路径建立cpython cd教程/ src / lib / python ./configure --with-cxx-main = g ++ --enable-shared --prefix = ...
游戏服务器 框架 GameServer GameServer-master 游戏服务框架新手学习
在unity3d等游戏引擎使用GameServer中连接服务器的一个工具
GameShop Gens Bons Sources
SimpleModulus for MuOnline
GameServer go语言版本
它还包含模型文件,这些文件定义了数据库结构。 管理员:协调比赛的进行,例如当前的刻度和要放置的标志。 Checker:提供Checker脚本的界面,该脚本用于放置和检索标志以及测试服务的状态。 提交:服务器向其提交...
MuOnline quest system
GameServer.cpp(GameServer.cpp)GameServer.cpp(GameServer.cpp)GameServer.cpp(GameServer.cpp)GameServer.cpp(GameServer.cpp)GameServer.cpp(GameServer.cpp)GameServer.cpp(GameServer.cpp)