Photon Server Configuration
Photon的主要配置文件是PhotonServer.config。
它位於SDK的binaries-文件夾中。
它用於設置應用程序、IP監聽器和性能特定值。
它不包含遊戲邏輯的配置值。
默認值可以確保Photon在更多的核心上有很好的擴展性,但不會使普通機器不堪重負。
一般來說,不需要對性能進行調整。
這裡列出的設置是最常用的。
更多的選項在Photon伺服器配置頁面有描述。
事件節點
支持多個事件。
每個事件在配置文件中都有獨立的節點。
一個事件是一組應用程序、監聽器和其他設置,在運行該事件時應一起使用。
Example:
XML
<Configuration>
<Instance Name="CustomPhotonServerInstance"
MaxMessageSize="512000"
MaxQueuedDataPerPeer="512000"
PerPeerMaxReliableDataInTransit="51200"
PerPeerTransmitRateLimitKBSec="256"
PerPeerTransmitRatePeriodMilliseconds="200"
MinimumTimeout="5000"
MaximumTimeout="30000"
DisplayName="OwnCloudTM">
<!-- instance config here -->
</Instance>
</Configuration>
事件節點可以有這些屬性:
- Name:Photon Socket Server將為該事件使用的名稱。
- MaxMessageSize:單個對等體允許發送的最大信息量,單位為字節。
- MaxQueuedDataPerPeer:每個對等體的最大緩沖區容量,字節數。
- PerPeerMaxReliableDataInTransit:一個對等體可以發送的、對等體尚未收到ACK的最大可靠數據量。
以字節為單位。
一旦這個數量的數據被發送,所有未來的可靠數據將被排隊。 - PerPeerTransmitRateLimitKBSec:一秒鐘內可以發送的最大數據量(可靠的和不可靠的)(單位:KB)。
這可以用來限制一個對等體可以發送的數據量。
當達到極限時,可靠的數據被排隊,不可靠的數據被丟棄。 - PerPeerTransmitRatePeriodMilliseconds:我們檢查傳輸速率限制的頻率。
默認情況下,我們每250ms檢查一次(即每秒4次),每次檢查時我們將PerPeerTransmitRateLimitKBSec擴大4。
一個較小的值使數據流更加穩定,而一個較大的值使數據流更加生硬,但使用的伺服器資源較少。 - MinimumTimeout (見"超時設置")
- MaximumTimeout (見"超時設置")
- DisplayName:PhotonControl為該事件顯示的名稱。
- DataSendingDelayMilliseconds (見"延遲設置")
- AckSendingDelayMilliseconds (見"延遲設置")
- ProduceDumps:啟用或禁用創建 "轉儲文件 "的開關,以防發生崩潰。
轉儲文件對於發現Photon核心的問題至關重要。 - DumpType (見"Photon Core Debugging")
- MaxDumpsToProduce (見"Photon Core Debugging")
- MaxDumpsToAttemptToProduce (見"Photon Core Debugging")
- ...
超時設置
事件節點中的兩個值描述了伺服器如何超時處理無響應的UDP客戶端。
MinimumTimeout和MaximumTimeout。
一個用UDP連接的對象在斷開連接前有MinimumTimeout毫秒的時間來響應。
直到斷開連接的實際時間是根據RTT歷史動態地確定的,每個對象。
狀態好的RTT會更快地斷開連接。
TCP連接在節點TCPListener(也在PhotonServer.config)中有一個單獨的InactivityTimeout設置。
我們把這些設置為5秒(5000ms)。
如果在這段時間內沒有請求到達,連接將被超時並關閉。
客戶端也會定期 "ping "伺服器,以避免這種情況。
請記住,客戶端獨立監控一個連接,也可能超時。
雙方都應該有類似的超時,適合您的遊戲。
延遲設置
屬性DataSendingDelayMilliseconds和AckSendingDelayMilliseconds代表了性能和最小響應時間的權衡。
這個延遲直接增加了一些停滯性以減少流量。
等待允許伺服器聚合命令,並將它們打包發送。
當伺服器發送任何東西時,send延遲被觸發,ack延遲被傳入的可靠數據觸發。
正如您在上面看到的,默認值是每個50ms。
我們發現這是一個很好的值,但它會導致往返時間 (50ms),即使客戶端和伺服器運行在同一台機器上。
根據您的遊戲,您應該用不同的值進行加載測試。
0的延遲是一個特殊情況,它跳過了計時器的使用,所以要避免低延遲<10。
日誌設置
- LogFileLocation:非管理型Photon Socket Server的日誌文件位置。
它可以是絕對路徑,也可以是與 "PhotonSocketServer.exe "相對的路徑。 - LogFileName:無人管理的Photon Socket Server日誌文件的名稱。
- LoggingEnabled:啟用或禁用該事件的非管理型日誌。
- LogUnimportantExceptions:是否記錄一些被認為不重要的異常。
模式驗証
- ValidateSchema:啟用或禁用該實例的模式驗証。
- SchemaValidationFailureIsFatal:模式驗証失敗是否會導致伺服器關閉。
應用程序節點
配置文件定義了Photon在啟動時應該加載哪些應用程序。
在 "應用程序 "節點中,可以添加幾個 "應用程序 "條目。
要加載多個應用程序,只需添加更多的應用程序節點(有唯一的名稱)。
其中一個可以通過使用它的名字(本例中為 "NameServer")成為默認應用程序。
默認的應用程序是客戶端試圖連接到一個未知的應用程序時的備案。
沒有在PhotonServer.config中設置的應用程序不會被加載,也不需要被部署。
當應用程序在配置中,但文件丟失時,Photon不會啟動,並在日誌中命名該問題。
Example:
XML
<!-- Defines which applications are loaded on start and which of them is used by default. Make sure the default application is defined. -->
<!-- Application-folders must be located in the same folder as the bin_Win64 folders. The BaseDirectory must include a "bin" folder. -->
<Applications Default="NameServer">
<Application
Name="Master"
BaseDirectory="LoadBalancing\Master"
Assembly="Photon.LoadBalancing"
Type="Photon.LoadBalancing.MasterServer.MasterApplication">
</Application>
<Application
Name="Game"
BaseDirectory="LoadBalancing\GameServer"
Assembly="Photon.LoadBalancing"
Type="Photon.LoadBalancing.GameServer.GameApplication">
</Application>
<Application
Name="NameServer"
BaseDirectory="NameServer"
Assembly="Photon.NameServer"
Type="Photon.NameServer.PhotonApp">
</Application>
</Applications>
每個應用程序都有一個客戶在連接它時可以使用的名字。
應用程序節點所支持的屬性。
- BaseDirectory:定義了應用程序所在的文件夾。
它不命名 "bin "文件夾,但按照慣例期待它。 - Assembly:應用程序的".dll "名稱。
- 類型:應用程序的 "主 "類(它源自Photon.SocketServer.ApplicationBase)。
- ApplicationRootDirectory:
- PassUnknownAppsToDefaultApp:如果為真,當提供一個未知的應用程序名稱時,將使用默認的應用程序。如果是false,那麼這將是一個致命的錯誤,將終止一個連接。默認為false。
- StartTimeoutMilliseconds:如果應用程序在配置的時間內沒有啟動,Photon將關閉。
0 = 應用超時。 - StopTimeoutMilliseconds:如果應用程序沒有在配置的時間內停止,Photon就會關閉。
0=應用超時。
監聽
根據協議、IP和端口配置您機器上的端點。
可以定義多個監聽類型。
同一類型的多個監聽可以被定義,打開多個IP/端口組合。
通用設置
這些屬性在大多數監聽中都是共享的。
- 名稱:監聽的可選名稱。
- IPAddress:默認IP 0.0.0.0使Photon監聽任何本地可用的IP。
有多個IP的機器應該在這裡定義正確的IP。
通過替換通配符IP,Photon將只打開特定的IP地址。。 注意:如果您使用的是一個與IP綁定的許可証,您需要在配置的監聽中設置這個IP。 - Port:要監聽的端口號。
- IPAddressIPv6:要監聽的IP地址,例如,2001:db8:a0b:12f0::1或::要監聽所有的接口。
- ListenBacklog:監聽積壓隊列的大小。
這影響到可以同時建立的連接的數量;例如,如果151個客戶試圖在同一時間連接,那麼最後一個客戶可能會被拒絕。
請注意,每個連接建立的嘗試只需要短暫的時間,一旦連接建立起來,連接就不會受到限制的影響。
所以您可以把這個值設置為10,只要不超過10個試圖在同一時間連接,會仍然有10,000個並發的活動連接。 - Disabled:定義這個監聽是否被禁用。
- RecvBufferSize:傳入數據的緩沖區的大小。
- SendBufferSize:用於發送數據的緩沖區大小。
TCP監聽設置
FlowControlMaxQueuedBytes:
DisableNagle:決定Nagle演算法是否在連接上使用。
如果設置為true,則Nagle被禁用,出站的TCP數據將在到達TCP堆棧後立即發送。
如果設置為false,那麼Nagle正在運行,TCP協議棧將嘗試將出站數據打包成更少的數據報。
將此設置為 true 可能會改善您的TCP連接的延遲,但代價是會有更多的數據報被發送。InactivityTimeout:伺服器在多長時間內斷開無響應的對象的連接。
"0 "值意味著沒有超時。
以毫秒為單位。LoggingEnabled:定義這個監聽的日誌是否被啟用。
速率設置
- RateLimitKBSec:
- RateLimitRate:
- RateLimitPeriod:
計數器設置
- Counters:
- CounterName:
- ParentCounters:
自定義連接信息
- CustomConnectMessagePrefix:Photon忽略了配置的字符串,如果它作為客戶端連接信息的prefix發送。
- CustomConnectMessageSuffix:Photon忽略配置的字符串,如果它作為客戶端連接信息的suffix發送。
- CustomConnectMessageIsRequired:如果設置為true,每條連接信息都需要一個自定義的prefix / suffix。
管理應用程序設置
- OverrideApplication:任何連接到這個端口的客戶端都會在指定的應用程序中結束,無論客戶端連接到什麼。
- DefaultApplication:是一個備案,以防客戶指定的應用程序沒有被找到。
- MaxMessageSize:決定入站和出站信息允許的默認最大字節數。
- MaxInboundMessageSize:確定伺服器通過該監聽器收到的消息可能具有的最大字節數。
如果消息超過了MaxInboundMessageSize的限制,客戶端將被斷開與伺服器的連接。
默認是MaxMessageSize的配置值。 - MaxOutboundMessageSize:
確定伺服器通過該監聽器發送的消息可能具有的最大字節數。
如果消息超過了MaxOutboundMessageSize的限制,客戶端將被斷開與伺服器的連接。
默認是MaxMessageSize的配置值。 - AppDataInactivityTimeout:如果應用程序(管理代碼)沒有得到任何數據,相對於低級別的(本地代碼)keep-alive pings的超時。
消息速率屬性
- RateLimitMessagesSec:
- MessageRateLimitPeriod:
- MessageRateLimit:
HttpListeners
在v5中,WebSocketListeners和其他基於HTTP或Web的監聽被一個配置節點所取代。HttpListeners。
根據PeerType,監聽將用於一個特定的協議或變數。
Simple
:用於通過Httplistener或RawHTTPListener節點配置。Reliable
:用於通過ReliableHttpListener節點配置。WebSocket
:用於通過WebSocketListener節點配置。
XML
<HTTPListeners>
<HTTPListener
Name="MyListenerNameShowsUpInPerfMon"
IPAddress="0.0.0.0"
IPAddressIPv6="::"
Port="80"
OverrideApplication = "WebSocketEchoApp"
InactivityTimeout="5000"
DisableNagle="true"
Secure = "true"
PeerType="Simple|Reliable|WebSocket"
MaxUriLength="255"
MaxHeaderLength="255"
MaxHeaders="20"
PermittedOrigins="photonengine.com, myawesome.game, etc."
MaxInboundMessageSize="10000"
MaxInboundMessageQueueSize="50000"
MaxOutboundMessageSize="10000"
MaxOutboundMessageQueueSize="50000"
Ping="false"
WebHook="false"
NoCache="true"
>
<StandardHeaders>
<StandardHeader Name="X-Blah" Value="X-BlahValue"/>
<StandardHeader Name="X-Blah2" Value="X-Blah2Value"/>
</StandardHeaders>
<Routing>
<Route Url="/"/> <!-- If present this is a wildcard match for ANY url not specified -->
<Route Url="/photon/m" Ping="true" WebHook="true" PeerType="Simple"/>
<Route Url="/photon/g" PeerType="Reliable"/>
<Route Url="/photon/g1" OverrideApplication="HttpApp1" PeerType="Websocket"/>
<Route
PermittedOrigins="*"
Url="/photon/g2"
InactivityTimeout="12000"
MaxInboundMessageSize="10000"
MaxInboundMessageQueueSize="50000"
MaxOutboundMessageSize="10000"
MaxOutboundMessageQueueSize="50000"
OverrideApplication="HttpApp2"/>
</Routing>
</HTTPListener>
我們的想法是為每個應用程序配置一個監聽,如果需要,還可以為每個端點配置額外的路由和額外的標頭文件。
配置的路由器可以繼承自基本監聽的設置或覆蓋它們。
HttpListener節點的特定屬性。
- RouteCounters:
true
或false
。 - MaxUriLength:URI的最大長度。
- MaxHeaderLength:請求頭的最大長度。
- MaxHeaders:請求頭的最大數量。
- MaxKeepAliveTime:允許保持連接的最大時間。
- MaxKeepAliveRequests:在同一個保持動態連接中允許的最大請求。
- CloseDelayMilliseconds:連接關閉的延遲。
路由節點的具體屬性。
- SubProtocols:僅適用於WebSockets對等類型。
- PingEvery:這個端點應該多長時間被ping一次。
只適用於WebSockets對等類型。
要求 "Ping "為 "true"。
HttpListener和Route節點之間共享的屬性。
- Name:聽眾或路由的名稱。
- PermittedOrigins:白名單的域。在v5 BETA中曾被稱為 "Access-Control-Allow-Origin",並設置同名的HTTP響應頭(CORS)。
- Ping:
true
或false
,如果這個端點應該被Ping或不被Ping。 - WebHook:
true
或false
,如果這個端點應該是一個WebHook。 - Url:該端點的URL。
注意:默認情況下,路由級別的Windows性能計數器不會為具有單一路由的HTTP監聽創建。
Runtime Node
定義要使用的Photon Runtime組件。
XML
<Runtime
Assembly="PhotonHostRuntime, Culture=neutral"
Type="PhotonHostRuntime.PhotonDomainManager"
UnhandledExceptionPolicy="TerminateProcess">
</Runtime>
- UnhandledExceptionPolicy (見"Exception Handling")
廣義
廣義路徑
為了簡化路徑的配置,我們為最重要的文件夾提供了一組廣義。
[EXE]
:包含伺服器可執行文件 "PhotonSocketServer.exe "的文件夾。[CONFIG]
:包含伺服器使用的配置文件的文件夾。[DEPLOY]
:[CONFIG]
的父文件夾,即[CONFIG]\.
。[CERTS]
:默認的 "CertificatePath "值:[EXE]\certs
。
您可以使用來形成相對路徑。
這些廣義在伺服器啟動時被記錄在非管理的PhotonSocketServer日誌文件中:
Plain Old Text
22572: 16:13:36.098 - Config File: D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64\PhotonServer.config
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[CONFIG]" - "D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64"
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[DEPLOY]" - "[CONFIG]\.."
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[EXE]" - "D:\ExitGames\SDKs\Server\Photon-OnPremises-Server-Classic-SDK_v5-0-12-24441-RC1\deploy\bin_Win64"
22572: 16:13:36.098 - Config|INFO| Adding config path macro: "[CERTS]" - "[EXE]\certs"
廣義可以通過PhotonServer實例設置用明確的路徑進行覆蓋:
PathMacro_EXE
PathMacro_CERTS
廣義計數器
路由級別的廣義計數器名稱可以包括以下:
[ADDRESS]
:IP地址,例如:192.168.0.1。[PORT]
:端口號,例如:8080。[full_address]
:IP地址和端口。192.168.0.1:8080.[ENDPOINT]
:端點的名稱。[PARENT]
:端點的名稱或ParentCounters=""。
管理的SocketServer設置
您可以從應用程序層面上配置一些與PhotonSocketServer有關的設置。
這可以通過在應用程序各自的配置文件中添加一個可選的<SocketServer>
節點/元素來完成,如下所示(該示例包括每個設置的默認值):
XML
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<Photon>
<SocketServer SecurityProtocol = "Tls12|Tls13"
Protocols = "GpBinaryV16,GpBinaryV18,Json"
LogGuardOn = "true">
<Limits MessageRate = "5000"
MessageDataRate = "2147483647"
MaxMessageSize = "512000"
OnlyLogViolations = "false" />
<S2S RpcProtocol = "GpBinaryV18" UseInitV3 = "false" />
</SocketServer>
</Photon>
</configuration>
SecurityProtocol
:定義了伺服器應該使用的TLS版本。
默認值是推薦的更安全的版本,因為TLS1.2和TLS1.3是目前的標准。
只有在必要時才改變這個。
可能的值。Ssl3|Tls|Tls11|Tls12|Tls13
。
這設置了.NET的System.Net.ServicePointManager.SecurityProtocol
。Protocols
:定義了該伺服器應用程序可以使用哪些數據序列化協議。- `MessageRate':每個對象每秒允許的最大傳入消息數。
默認為5000。 MessageDataRate
:每個對象每秒允許的最大緩沖傳入數據的大小。
默認為2147483647(int.MaxValue
)。MaxMessageSize
:允許傳入信息的最大尺寸。
默認為512000。LogGuardOn
:啟用或停用防止記錄垃圾郵件的防護。OnlyLogViolations
:定義違反限制時採取的措施:記錄違規或斷開對象的連接。RpcProtocol
:用於伺服器與伺服器之間通信的數據序列化協議。UseInitV3
:是否使用InitRequest版本3進行伺服器間的通信。