c# 实现Actor模式的游戏服务器,参考Skynet机制

####0:讨论群html

qq群号:390313628 unity 4.6 版本运行ios

####参考 服务器代码:http://git.oschina.net/liyonghelpme/GameServerCsharpgit

参考文献: http://twistedoakstudios.com/blog/Post2061_emulating-actors-in-c-with-asyncawaitweb

http://www.codeproject.com/Articles/535635/Async-Await-and-the-Generated-StateMachinec#

https://msdn.microsoft.com/en-us/magazine/gg598924.aspx安全

https://msdn.microsoft.com/en-us/magazine/jj991977.aspx服务器

http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspxasp.net

http://blogs.msdn.com/b/csharpfaq/archive/2010/06/18/parallel-programming-task-schedulers- and-synchronization-context.aspx异步

http://weblogs.asp.net/dixin/understanding-c-sharp-async-await-2-awaitable-awaiter-patternasync

http://everydaylifein.net/netframework/task-parallel-library-taskscheduler-deadlocks-threads.html

http://blogs.msdn.com/b/ericeil/archive/2009/04/23/clr-4-0-threadpool-improvements-part-1.aspx

####基本特征 Actor模式的游戏服务器的基本特征:

每一个Actor的属性都是私有的;

Actor的全部的公开的方法都是 async异步方法;

Actor全部方法的执行都须要队列化,也就是不容许多个函数在不一样的线程上执行,包括Actor内部方法和对外的Async方法。

####skynet基本实现 Skynet中是经过构建一个SkynetContext, 每一个Context附加有一个消息队列,当消息队列中有消息的时候,线程调度器,将这个队列调度到某个线程上去执行。每一个SkynetContext根据类型能够包含一个lua虚拟机。

####c#中实现 c#中为了实现上述机制,相关的重要概念包括:Task, synchronizationcontext, Async, Await;

Task是c#中的轻量级线程,由虚拟机来调度,存在多种Task的调度器,在本服务器中咱们使用 synchronizationcontext 调度器。

synchronizationcontext 是c#中一个抽象概念,用于声明一个执行领域,这个领域中的函数的执行是串行的,防止出现多个函数在多个线程上执行,形成数据访问冲突,本服务器中,每一个Actor是一个同步域,Actor的全部 函数都须要在同一个synchronizationcontext下执行。

async, await 是c#中实现的协程机制,经过调用await来保存当前的async函数的上下文运行状态,以便于当等待的任务完成以后,从新启动函数的执行,使用这个特性,是为了模拟skynet中lua服务器的协程机制。

####代码详解 服务器的核心代码是Actor.cs;

Actor的_messageQueue 属性,是一个synchronizationcontext, 用于同步Actor的全部函数执行。

Actor实现了一个RunTask函数,该函数启动一个Actor内部Task,该Task运行在Actor的synchronizationcontext中。

Stop函数用于终止整个Actor的运行。

ActorSynchronizationContext.cs

实现了一个能够使用await等待的,全部函数顺序执行的同步上下文。

在PlayerActor.cs 代码中展现了如何给Actor实现一个public async 方法,首先await 到Actor的messageQueue 上下文,接着执行后续的代码。

WorldActor中,展现了如何在当前Actor的上下文下启动一个Task, 以便安全的执行Task中的代码。

相关文章
相关标签/搜索