`
milk_36
  • 浏览: 121120 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

AE-go_GameServer Player Cache 结构分析 笔记

阅读更多

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_

    《GameServer97d-Source_muonline_》是一款基于经典的网络游戏《奇迹MU Online》(MU Online)的游戏服务器源代码。这款游戏在2001年首次发布,吸引了大量玩家,而GameServer97d-Source是该游戏的一个版本,提供给...

    X-TeaM_GameServerSource_PluginX-TEAMS5_season2_

    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_网络游戏

    【标题】"UO.zip_UO_UO服务端_gameserver mu_网络游戏" 指的是一个与Ultima Online(简称UO)相关的网络游戏服务端软件。Ultima Online是一款历史悠久的大型多人在线角色扮演游戏,由Richard Garriott的公司Origin ...

    wangluochuanshu.rar_gameserver

    本文将深入探讨网络传输在游戏开发中的应用,特别是针对"Gameserver"这一标签,我们将详细解析游戏服务器和游戏客户端的构建与交互。 首先,游戏服务器是整个游戏运行的中枢,它负责处理游戏世界的逻辑、玩家交互、...

    ACTeam -GameServer97d_AcTeam_muonline_Free!_science1st_gameserve

    标题 "ACTeam - GameServer97d_AcTeam_muonline_Free!_science1st_gameserve" 暗示我们正在处理一个与游戏服务器相关的项目,特别是针对“muonline”这款游戏的。ACTeam可能是开发或维护这个服务器软件的团队名称,...

    S3GP_Philips_GameServer

    标题"S3GP_Philips_GameServer...尽管我们没有具体的文件列表来深入分析,但以上知识点可以提供一个关于S3GP_Philips_GameServer可能涉及的技术领域的全面概述。如果能提供更多详细信息,我们可以进一步探讨这些主题。

    SteamCMD-AutoUpdate-Any-Gameserver:Windows SteamCMD,用于自动更新和安装任何游戏服务器的Steam cmd设置,可配置许多有用的功能。 此批处理脚本将使您的游戏服务器自动更新更新间隔,并宣布服务器正在关闭以进行更新等,所有这些均可配置

    VBScript(Visual Basic Script Edition)是另一种可能被用到的脚本语言,尤其是在与Windows系统的交互中。VBScript可以用于创建更复杂的逻辑,比如与用户的交互、定时任务或者处理文件系统操作。在本项目中,...

    游戏服务器框架-Node.js开发

    用于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_源码

    【标题】"GameServer_muonline_源码"指的是一个基于MU Online游戏的服务器源代码,这个源代码可能包含了实现游戏服务器核心功能的各种模块和组件。MU Online是一款多人在线角色扮演游戏(MMORPG),其服务器端的代码...

    project-docker-gameserver-eco:在Docker中运行专用Eco GameServer的文件

    项目docker-gameserver-eco 在Docker中运行专用Eco GameServer的文件为了运行,请导航到您已提取docker-compose和Dockerfile的文件夹中,将名为“ EcoServer.zip”的EcoServer-Files的当前压缩版本添加到该文件夹​...

    GameServer-master 游戏服务框架新手学习

    `GameServer-master`可能基于常见的服务器开发语言,如C++、Java、Python或Golang。这些语言都有各自的优势,如C++和Golang的高性能,Java的易维护性,Python的快速开发特性。同时,框架可能使用了如protobuf、json...

    embedding-python-in-gameserver-tutorial:在游戏服务器中嵌入python的教程

    在游戏服务器中嵌入python教程在游戏服务器中嵌入python的教程“ / home / mattos / tutorial”是克隆路径建立cpython cd教程/ src / lib / python ./configure --with-cxx-main = g ++ --enable-shared --prefix = ...

    GameServer_expedition_Mionline_

    《GameServer_expedition_Mionline_》是一个与Mu Online探险相关的游戏服务器模块,主要涉及的是游戏中的探险任务系统。这个模块可能包含了处理玩家查询、执行探险任务、管理战斗用户以及商店交易等一系列功能。 ...

    GameServer_Modulus_muonline_

    最后,RcbShop.h是RcbShop.cpp的接口定义文件,它定义了类的结构、成员变量以及公开的函数。通过RcbShop.h,其他部分的代码可以知道如何与RcbShop.cpp进行交互,进行商品交易操作。良好的接口设计是模块化编程的基础...

    GameServer go语言版本.zip

    Go语言,又称Golang,是Google于2009年推出的一种静态类型的编译型语言。它具有以下特点,使其特别适合构建高性能的游戏服务器: 1. 并发模型:Go语言的goroutine和channel提供了轻量级线程和同步机制,使得处理...

    GameServer_muonline_

    本文将深入探讨"GameServer_muonline_"中的任务系统设计,包括QuestInfo、QuestSystem、RaklionSelupan、RaklionBattleUserMng、RcbShop以及QuestUtil等关键模块。 首先,QuestInfo.cpp与QuestInfo.h是关于任务信息...

    GameServer_GameServerSource_muonline_

    本篇将深入探讨“GameServer(GameServerSource_muonline_)”中涉及的核心知识点,特别是围绕“MuOnline”游戏的Eldorado系统源码进行解析。 MuOnline是一款多人在线角色扮演游戏(MMORPG),其Eldorado系统是游戏内...

    GameServer_muolihua_muonline_

    在“GameServer_muolihua_muonline_”这个压缩包中,包含了GameMain.cpp、GameCommand.cpp、GameMain.h以及GameCommand.h这四个核心文件,它们是构建MuOnline游戏服务器的主要组成部分。 1. **GameMain.cpp与...

Global site tag (gtag.js) - Google Analytics