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_muonline_》是一款基于经典的网络游戏《奇迹MU Online》(MU Online)的游戏服务器源代码。这款游戏在2001年首次发布,吸引了大量玩家,而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.
【标题】"UO.zip_UO_UO服务端_gameserver mu_网络游戏" 指的是一个与Ultima Online(简称UO)相关的网络游戏服务端软件。Ultima Online是一款历史悠久的大型多人在线角色扮演游戏,由Richard Garriott的公司Origin ...
本文将深入探讨网络传输在游戏开发中的应用,特别是针对"Gameserver"这一标签,我们将详细解析游戏服务器和游戏客户端的构建与交互。 首先,游戏服务器是整个游戏运行的中枢,它负责处理游戏世界的逻辑、玩家交互、...
标题 "ACTeam - GameServer97d_AcTeam_muonline_Free!_science1st_gameserve" 暗示我们正在处理一个与游戏服务器相关的项目,特别是针对“muonline”这款游戏的。ACTeam可能是开发或维护这个服务器软件的团队名称,...
标题"S3GP_Philips_GameServer...尽管我们没有具体的文件列表来深入分析,但以上知识点可以提供一个关于S3GP_Philips_GameServer可能涉及的技术领域的全面概述。如果能提供更多详细信息,我们可以进一步探讨这些主题。
VBScript(Visual Basic Script Edition)是另一种可能被用到的脚本语言,尤其是在与Windows系统的交互中。VBScript可以用于创建更复杂的逻辑,比如与用户的交互、定时任务或者处理文件系统操作。在本项目中,...
用于Node.js的Game Server框架安装Linux,macOS#用您希望的游戏命名方式替换my-gameserver。NODE_ENV = development npm install mage --bootstrap --prefix my-gameserver cd my-gameser Game Server Framework ...
【标题】"GameServer_muonline_源码"指的是一个基于MU Online游戏的服务器源代码,这个源代码可能包含了实现游戏服务器核心功能的各种模块和组件。MU Online是一款多人在线角色扮演游戏(MMORPG),其服务器端的代码...
项目docker-gameserver-eco 在Docker中运行专用Eco GameServer的文件为了运行,请导航到您已提取docker-compose和Dockerfile的文件夹中,将名为“ EcoServer.zip”的EcoServer-Files的当前压缩版本添加到该文件夹...
`GameServer-master`可能基于常见的服务器开发语言,如C++、Java、Python或Golang。这些语言都有各自的优势,如C++和Golang的高性能,Java的易维护性,Python的快速开发特性。同时,框架可能使用了如protobuf、json...
在游戏服务器中嵌入python教程在游戏服务器中嵌入python的教程“ / home / mattos / tutorial”是克隆路径建立cpython cd教程/ src / lib / python ./configure --with-cxx-main = g ++ --enable-shared --prefix = ...
《GameServer_expedition_Mionline_》是一个与Mu Online探险相关的游戏服务器模块,主要涉及的是游戏中的探险任务系统。这个模块可能包含了处理玩家查询、执行探险任务、管理战斗用户以及商店交易等一系列功能。 ...
最后,RcbShop.h是RcbShop.cpp的接口定义文件,它定义了类的结构、成员变量以及公开的函数。通过RcbShop.h,其他部分的代码可以知道如何与RcbShop.cpp进行交互,进行商品交易操作。良好的接口设计是模块化编程的基础...
Go语言,又称Golang,是Google于2009年推出的一种静态类型的编译型语言。它具有以下特点,使其特别适合构建高性能的游戏服务器: 1. 并发模型:Go语言的goroutine和channel提供了轻量级线程和同步机制,使得处理...
本文将深入探讨"GameServer_muonline_"中的任务系统设计,包括QuestInfo、QuestSystem、RaklionSelupan、RaklionBattleUserMng、RcbShop以及QuestUtil等关键模块。 首先,QuestInfo.cpp与QuestInfo.h是关于任务信息...
本篇将深入探讨“GameServer(GameServerSource_muonline_)”中涉及的核心知识点,特别是围绕“MuOnline”游戏的Eldorado系统源码进行解析。 MuOnline是一款多人在线角色扮演游戏(MMORPG),其Eldorado系统是游戏内...
在“GameServer_muolihua_muonline_”这个压缩包中,包含了GameMain.cpp、GameCommand.cpp、GameMain.h以及GameCommand.h这四个核心文件,它们是构建MuOnline游戏服务器的主要组成部分。 1. **GameMain.cpp与...