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中的代碼。

相關文章
相關標籤/搜索