Application 應(yīng)用程序
一個(gè)應(yīng)用程序是一個(gè)游戲服務(wù)器端的邏輯。一個(gè)游戲的所有特征(例如遠(yuǎn)程過程調(diào)用,數(shù)據(jù)存儲(chǔ)等)都在一個(gè)Photon Application中實(shí)現(xiàn)。C#代碼編譯之后,Photon會(huì)其加載生成的程序集。Photon Core使用配置文件來設(shè)置應(yīng)用程序和定義啟動(dòng)參數(shù)。
通常,在單個(gè)應(yīng)用中提供游戲的所有邏輯。Photon仍然能夠同時(shí)運(yùn)行多個(gè)應(yīng)用程序。每個(gè)應(yīng)用程序可以有不同的任務(wù)。例如,可以編寫單獨(dú)的應(yīng)用程序向基于web的客戶端發(fā)送策略文件。
客戶端通過在連接時(shí)提供應(yīng)用程序的名稱來選擇它想要使用的應(yīng)用程序。
游戲邏輯
游戲邏輯定義了客戶端如何與服務(wù)器交互。它實(shí)現(xiàn)操作,事件和服務(wù)器自己執(zhí)行的任何操作。
在SDK文件夾(“{Server_SDK_path}/src-server/Loadbalancing”)中有一個(gè)“LoadBalancing應(yīng)用程序”,它提供了基于房間游戲的一個(gè)好的例子。
如果你的游戲?qū)⑹且粋€(gè)單一的,巨大的世界,MMO演示應(yīng)用程序是一個(gè)很好的例子。此應(yīng)用程序處理客戶端的利益管理,并提供項(xiàng)目,屬性,演員和更多的類。
或者,任何游戲邏輯可以直接在C??蚣苤祥_發(fā)。這個(gè)入口點(diǎn)是定義在Photon.Socketserver.dll中的應(yīng)用程序類。
Operations 操作
一個(gè)操作是Photon相當(dāng)于一個(gè)遠(yuǎn)程過程調(diào)用。Photon客戶端使用操作調(diào)用來完成任何他們想做的事情。
根據(jù)需要在服務(wù)器端應(yīng)用程序中定義操作及其所有參數(shù)??蛻舳丝梢酝ㄟ^設(shè)置帶有符合操作約定的鍵和值的哈希表來調(diào)用任何操作??蛻舳撕头?wù)器框架負(fù)責(zé)序列化,傳輸和反序列化。
每個(gè)操作也可以提供結(jié)果。這是向客戶端提供所請求數(shù)據(jù)的一種方式。當(dāng)然可以跳過結(jié)果,從而節(jié)省帶寬。
操作調(diào)用和結(jié)果是一個(gè)客戶端和服務(wù)器之間的事情。其他客戶端不會(huì)知道這些。
Events 事件
Photon事件是為客戶端準(zhǔn)備的消息。每個(gè)事件由字節(jié)碼輸入?yún)^(qū)分類型,并攜帶游戲更新。 “LoadBalancing應(yīng)用程序”定義了幾個(gè)事件,但是可以純粹在客戶端定義自己的事件。
與操作結(jié)果不同,接收的事件很可能導(dǎo)致另一個(gè)客戶端的操作調(diào)用。這意味著:事件可能會(huì)隨時(shí)到達(dá)。 “LoadBalancing應(yīng)用程序”在有人加入或離開房間時(shí)發(fā)送事件。
操作RaiseEvent使事件真正通用:任何客戶端可以通過將散列表與數(shù)據(jù)組合在一起,并在發(fā)送時(shí)指定代碼來創(chuàng)建新事件。游戲數(shù)據(jù)可以發(fā)送,不需要更改服務(wù)器。
當(dāng)然,對于更精細(xì)的服務(wù)器端對事件的反應(yīng),可以定義自定義操作,其檢查事件數(shù)據(jù),編譯它或創(chuàng)建其他事件。
連接和超時(shí)
與普通UDP不同,Photon的可靠UDP協(xié)議建立了服務(wù)器和客戶端之間的連接:如果UDP包中的命令是可靠的,則它們具有序列號和標(biāo)志。如果這樣的話,接收端必須確認(rèn)命令??煽康拿钜远涕g隔重復(fù),直到確認(rèn)到達(dá)。如果未到達(dá),則連接超時(shí)。
雙方從他們的角度獨(dú)立地監(jiān)視這種連接。雙方都有自己的規(guī)則來決定另一個(gè)是否仍然可用。
如果檢測到超時(shí),則在連接的那一側(cè)發(fā)生斷開連接。一旦一方認(rèn)為他方不再響應(yīng),就不會(huì)向它發(fā)送任何消息。這就是超時(shí)斷開是單向的而不是同步的原因。