[Photon] Lite Application 源码阅读笔记

来源:互联网 发布:产品目录设计软件 编辑:程序博客网 时间:2024/06/17 00:48

概要 Overview

        本文主要阅读与分析Lite Application源码的设计思路、执行功能及代码风格,以便更好地理解Photon Server以及对其进行应用。本文适合已初步了解Photon引擎中的基本概念的人进行阅读,其中代码均来源于Server SDKsrc_source中的Lite工程,建议一边阅读相关源代码一边阅读本文,从而更好地理清思路。本文整体按照总分结构,从核心开始展开。

 

一、  LiteApplication

根据Photon官方网站上提供的Documentation,一个Application的基本组成为一个继承ApplicationBase的具体类和一个继承PeerBase的具体类。因此我们在工程中找到LiteApplication类,它继承了ApplicationBase,于是它便是整个Application的主类。

          此类的职责是为与其连接的Client创建Peer,另外还负责初始化log日志和性能计数器。

从官方网站上的Documentation可以得知其要实现的方法有CreatePeerSetupTearDown

 

二、  LitePeer

从代码注释可以得知,LitePeer类的职责是处理接收进来的操作请求(在OnOperationRequest中),获取房间的引用(GetRoomReference)并向房间加入操作(Operation),每个玩家只能加入一个房间。

该类需重载构造函数,要实现的方法有OnDisconnectOnoperationRequest

 

三、  两者的关系

LiteApplication为每一个新的连接创建LitePeer,使其可以接受和处理与玩家之间的消息。

 

四、  RoomReferenceRoomCacheBaseRoomInstanceRoom类及之间的关系

RoomReference用于观察来自房间仓库(RoomCache)的房间实例(Room),从LitePeer中相关代码可以得知它是通过LiteGameCache的实例的GetRoomReference获得的,而且每个RoomReference都分配了一个Guid(全局唯一标识符)。

RoomCacheBase可看作一个房间工厂,它拥有所有的房间实例(RoomInstance),并处理房间的添加删除工作,在Lite Application中它具体由LiteGameCache实现。

RoomInstance用于跟踪所有的RoomReference,处理它们的添加删除工作。

Room拥有所有玩家(Actors)以及属性(Properties),并将所有操作和消息(Message)加入队列,执行操作(ExecuteOperation)处理消息(ProcessMessage)以及发布事件(PublishEvent),在程序中它具体由LiteGame实现。

 

         由以上可以知道它们之间的关系:

1、 RoomCacheBase作为一个房间工厂生产和管理房间实例;

2、 RoomInstance管理房间的所有RoomReference

3、 RoomReferenceLitePeerRoomCacheBase之间充当桥梁,建立玩家与房间之间的联系;

4、 Room处理房间中的所有操作。

 

前三者都在做着维护和管理房间的工作,并为房间分配任务(Operation),而房间则得到任务队列逐一处理这些任务,并且这些类所依赖的是高层模块,作者将所有可扩展部分留给了具体的实现类,可见其很好的贯彻了面向对象设计的思想。

 

一旦玩家与房间的联系建立起来,我们就要开始执行具体的操作,以下是对Lite中定义的5Operation的具体实现进行说明。

一、  JoinOperation

LitePeerOnOperationRequest开始,追踪到HandleJoinOperation中。

阅读代码后,可以明确它主要做了两件事:

1、 获得RoomReference

首先查看所有的房间实例中有没有该房间,如果没有则创建一个并加入房间列表,有则向该房间添加RoomReference并将其返回给LitePeer

2、 向房间加入Opeartion

这个过程内部相对复杂一点,首先将ExecuteOperation这一个方法注册到RoomExecutionFiber(我理解为一个执行线程池),然后由其进行处理。其中的代码我们无法得知,但也不需要我们细究。

        

         其中,我们主要关心的是实现部分,即ExecuteOperation,其真正执行的功能在LiteGameHandleJoinOperation中。

首先代码要确认玩家要加入的房间并没有被Disposed,之后开始为房间创建新的Actor来代表玩家,这其中又有相应的代码来确保玩家不是已经存在在该房间中,不然将向客户端返回错误信息并中止接下来的内容。然后如果你是进入这个房间的第一个玩家,则将你的GameProperties设置到房间中。之后代码将你的ActorProperties设置到你的Actor对象中。最后我们开始构建OperationResponse,把目前房间的GameProperties和所有ActorActorProperties以及玩家的ActorNumber都返回给客户端,并且同时向在场的其他玩家广播事件。

二、   LeaveOperation

HandleLeaveOperation中,代码先检查是否已获得RoomReference,之后向房间加入Operation,将已获得的RoomReferenceDispose掉,重新赋值为null

三、   RaiseEventGetProperties & SetProperties

这三个Operation都调用了HandleGameOperation来执行,由于它们不影响房间的存在,所以被归为统一的一类操作。

 

        

Lite Application中并没有对Event进行任何的限制操作,它允许客户端自我设计和维护所需的事件并通过OpRaiseEvent操作向服务端请求转发,而Lite Application只是负责转发而已。

 

小结 Summary

         Photon引擎有着足够开放的体系,基本上满足了网络游戏通信的各种需求,有着不错的扩展性。另外通过阅读官方源码有助于提高自己对程序设计的认识。源码的注释恰到好处,代码风格也比较严谨,给人一目了然的感觉,这值得我们学习。

原创粉丝点击