Integrieren von Spielservern in das PlayFab Game Server SDK (GSDK)
Übersicht
Das PlayFab Game Server SDK (GSDK) wird in C++-, C#- und Java-Versionen bereitgestellt. Das GSDK verbindet Ihren Spielserver mit dem playFab-Agent, der auf dem virtuellen Computer installiert ist. Dieser Agent erleichtert wichtige Serverinteraktionen mit der PlayFab Multiplayer-Plattform.
Grundlegende Integration
Damit Ihr Spielserver mit der PlayFab-Multiplayer-Plattform kommunizieren kann, müssen Sie in das GSDK integrieren. Sie müssen mindestens die Start
Methoden und ReadyForPlayers
in Ihrem Spielserver implementieren.
int main()
{
// Call this while your game is initializing; it will start sending a heartbeat to our agent and put the game server in an Initializing state
Microsoft::Azure::Gaming::GSDK::start();
/* Add any other initialization code your game server needs before players can connect */
// Call this when your game is done initializing and players can connect
// Note: This is a blocking call, and will return when this game server is either allocated or terminated
if (Microsoft::Azure::Gaming::GSDK::readyForPlayers())
{
// readyForPlayers returns true when an allocation call has been done, a player is about to connect!
}
else
{
// readyForPlayers returns false when the server is being terminated
}
}
static void Main(string[] args)
{
// Call this while your game is initializing; it will start sending a heartbeat to our agent and put the game server in an Initializing state
GameserverSDK.Start();
/* Add any other initializion code your game server needs before players can connect */
// Call this when your game is done initializing and players can connect
// Note: This is a blocking call, and will return when this game server is either allocated or terminated
if (GameserverSDK.ReadyForPlayers())
{
// readyForPlayers returns true when an allocation call has been done, a player is about to connect!
}
else
{
// readyForPlayers returns false when the server is being terminated
}
}
public static void main(String[] args)
{
// Call this while your game is initializing; it will start sending a heartbeat to our agent and put the game server in an Initializing state
GameserverSDK.start();
/* Add any other initializion code your game server needs before players can connect */
// Call this when your game is done initializing and players can connect
// Note: This is a blocking call, and will return when this game server is either allocated or terminated
if (GameserverSDK.readyForPlayers())
{
// readyForPlayers returns true when an allocation call has been done, a player is about to connect!
}
else
{
// readyForPlayers returns false when the server is being terminated
}
}
Protokollierung mit dem GSDK
Wenn Ihr Spielserver endet, zippt der PlayFab-VM-Agent alle Protokolldateien und stellt sie Ihnen zur Verfügung.
Es gibt zwei Möglichkeiten, Protokolldateien aus Ihrem Spiel hinzuzufügen:
- Verwenden Sie die GSDK-Methode
Log
: Sie fügt der GSDK-Protokolldatei Ihre eigenen Protokollzeilen hinzu. - Schreiben Sie Ihre eigene Protokolldatei in das entsprechende Protokollverzeichnis, das der PlayFab-VM-Agent zippen und hochlädt.
// This will add your log line to the GSDK log file, alongside other information logged by the GSDK
Microsoft::Azure::Gaming::GSDK::logMessage("Here is a sample log");
// Alternatively, you can log your own files to the log directory
std::string logFolder = Microsoft::Azure::Gaming::GSDK::getLogsDirectory();
// This will add your log line to the GSDK log file, alongside other information logged by the GSDK
GameserverSDK.LogMessage("Here is a sample log");
// Alternatively, you can log your own files to the log directory
string logFolder = GameserverSDK.GetLogsDirectory();
// This will add your log line to the GSDK log file, alongside other information logged by the GSDK
GameserverSDK.log("Here is a sample log");
// Alternatively, you can log your own files to the log directory
String logFolder = GameserverSDK.getLogsDirectory();
Ordnungsgemäßes Herunterfahren ihres Spielservers
Es gibt drei Szenarien, in denen Ihr Spielserver endet:
Ihre Spieleserveranwendung wird beendet.
PlayFab beendet Ihren Spielserver, da mehr Spieleserver verfügbar sind, als für die aktuelle Spielerlast erforderlich sind.
Notiz
PlayFab beendet nur Spieleserver, die derzeit nicht aktiv sind.
- Azure führt die erforderliche Wartung auf dem virtuellen Computer aus, auf dem Ihr Spielserver gehostet wird.
Für (1) oben: Sie steuern, wann dies geschieht, und können alle erforderlichen Bereinigungen durchführen, bevor Ihre Anwendung beendet wird.
Für (2) und (3) oben: Das GSDK bietet Ihnen eine Möglichkeit, zu wissen, wann sie auftreten werden, indem Sie eine Rückrufmethode angeben.
// This method will be called in case #2, when PlayFab terminates the game server
void onShutdown()
{
printf("GSDK is shutting me down!!!\n");
/* Perform any necessary cleanup and end the program */
std::exit(0);
}
// This method will be called in case #3, when Azure will perform maintenance on the virtual machine
void onMaintenanceScheduled(tm t)
{
#ifdef WINDOWS
time_t local = _mkgmtime(&t);
double delta = difftime(local, time(NULL));
struct tm buf;
char str[26];
gmtime_s(&buf, &local);
asctime_s(str, sizeof str, &buf);
printf("UTC: %s", str);
localtime_s(&buf, &local);
asctime_s(str, sizeof str, &buf);
printf("local: %s", str);
printf("delta: %f", delta);
#else // Linux
time_t local = timegm(&t);
double delta = difftime(local, time(NULL));
printf("UTC: %s\n", asctime(gmtime(&local)));
printf("local: %s\n", asctime(localtime(&local)));
printf("delta: %f\n", delta);
#endif
/* Perform any necessary cleanup, notify your players, etc. */
}
int main()
{
Microsoft::Azure::Gaming::GSDK::start();
Microsoft::Azure::Gaming::GSDK::registerShutdownCallback(&onShutdown);
Microsoft::Azure::Gaming::GSDK::registerMaintenanceCallback(&onMaintenanceScheduled);
// Continue initializing your game
}
// This method will be called in case #2, when PlayFab terminates the game server
static void OnShutdown()
{
GameserverSDK.LogMessage("Shutting down...");
/* Perform any necessary cleanup and end the program */
}
// This method will be called in case #3, when Azure will perform maintenance on the virtual machine
static void OnMaintenanceScheduled(DateTimeOffset time)
{
/* Perform any necessary cleanup, notify your players, etc. */
}
static void Main(string[] args)
{
GameserverSDK.Start();
GameserverSDK.RegisterShutdownCallback(OnShutdown);
GameserverSDK.RegisterMaintenanceCallback(OnMaintenanceScheduled);
// Continue initializing your game
}
// This method will be called in case #2, when PlayFab terminates the game server
private static void onShutdown()
{
System.out.println("Shutting down...");
/* Perform any necessary cleanup and end the program */
}
// This method will be called in case #3, when Azure will perform maintenance on the virtual machine
private static void onMaintenanceScheduled(ZonedDateTime time)
{
/* Perform any necessary cleanup, notify your players, etc. */
}
static void Main(string[] args)
{
GameserverSDK.start();
GameserverSDK.registerShutdownCallback(Main::onShutdown);
GameserverSDK.registerMaintenanceCallback(Main::onMaintenanceScheduled);
// Continue initializing your game
}
Bereitstellen von PlayFab-Informationen zu Deinem Spielserver
Derzeit gibt es zwei Dinge, die Sie mit PlayFab kommunizieren können, indem Sie das GSDK verwenden:
- Die aktuelle Integrität Ihres Spielservers status.
- Eine Liste der Spieler, die derzeit mit Ihrem Spielserver verbunden sind.
Diese beiden Informationen werden im nächsten Heartbeat an PlayFab übertragen und können derzeit für die Berichterstellung verwendet werden.
static std::vector<Microsoft::Azure::Gaming::ConnectedPlayer> players;
void playerConnected()
{
// When a new player connects, you can let PlayFab know by adding it to the vector of players and calling updateConnectedPlayers
players.push_back(Microsoft::Azure::Gaming::ConnectedPlayer("player_tag"));
Microsoft::Azure::Gaming::GSDK::updateConnectedPlayers(players);
}
// This method will be called on every heartbeat to check if your game is healthy, as such, it should return very quickly
bool isHealthy()
{
// Return whether your game server should be considered healthy
return true;
}
int main()
{
Microsoft::Azure::Gaming::GSDK::start();
Microsoft::Azure::Gaming::GSDK::registerHealthCallback(&isHealthy);
// Continue initializing your game
}
static private List<ConnectedPlayer> players = new List<ConnectedPlayer>();
static void OnPlayerConnected()
{
// When a new player connects, you can let PlayFab know by adding it to the vector of players and calling updateConnectedPlayers
players.Add(new ConnectedPlayer("player_tag"));
GameserverSDK.UpdateConnectedPlayers(players);
}
// This method will be called on every heartbeat to check if your game is healthy, as such, it should return very quickly
static bool IsHealthy()
{
// Return whether your game server should be considered healthy
return true;
}
static void Main(string[] args)
{
GameserverSDK.Start();
GameserverSDK.RegisterHealthCallback(IsHealthy);
// Continue initializing your game
}
private static ArrayList<ConnectedPlayer> players = new ArrayList<ConnectedPlayer>();
private static void onPlayerConnected()
{
// When a new player connects, you can let PlayFab know by adding it to the vector of players and calling updateConnectedPlayers
players.add(new ConnectedPlayer("player_tag"));
GameserverSDK.updateConnectedPlayers(players);
}
// This method will be called on every heartbeat to check if your game is healthy, as such, it should return very quickly
private static GameHostHealth getGameHealth()
{
// Return whether your game server should be considered healthy
return GameHostHealth.Healthy;
}
static void Main(string[] args)
{
GameserverSDK.start();
GameserverSDK.registerHealthCallback(Main::getGameHealth);
// Continue initializing your game
}
Abrufen von Konfigurationseinstellungen in Ihrem Spielserver
Es gibt mehrere PlayFab-Einstellungen im Zusammenhang mit Ihrem Spielserver, die Sie mit dem GSDK abrufen können.
Notiz
Zwei dieser Einstellungen werden tatsächlich von Ihren Clients an PlayFab übergeben, als Teil des Aufrufs zum Anfordern eines Multiplayerservers. Daher sind diese Einstellungen erst für Ihren Spielserver verfügbar, wenn sie zugewiesen sind.
// Get all the configuration values
std::unordered_map<std::string, std::string> config = Microsoft::Azure::Gaming::GSDK::getConfigSettings();
// Retrieve a particular configuration value
auto it = config.find(Microsoft::Azure::Gaming::GSDK::SESSION_COOKIE_KEY);
if (it != config.end())
{
std::string sessionCookie = config[Microsoft::Azure::Gaming::GSDK::SESSION_COOKIE_KEY];
}
// Here some other useful configuration keys (the full list is in gsdk.h)
static constexpr const char* SERVER_ID_KEY; // ID given to your game server upon creation
static constexpr const char* LOG_FOLDER_KEY; // Path to the folder that should contain all log files
static constexpr const char* CERTIFICATE_FOLDER_KEY; // Path to the folder that contains any game certificate files
static constexpr const char* TITLE_ID_KEY; // PlayFab Title ID for this game server
static constexpr const char* BUILD_ID_KEY; // PlayFab Build ID for this game server
static constexpr const char* REGION_KEY; // Azure Region this server is running in
// These two keys are only available after allocation (once readyForPlayers returns true)
static constexpr const char* SESSION_COOKIE_KEY; // The Session Cookie you passed into the allocation call when you requested a server
static constexpr const char* SESSION_ID_KEY; // The Session ID you specified in the allocation call when you requested a server
// Get all the configuration values
IDictionary<string, string> config = GameserverSDK.getConfigSettings();
// Retrieve a particular configuration value
if (config.TryGetValue(GameserverSDK.SessionCookieKey, out string sessionCookie))
{
// sessionCookie contains the value
}
// Here are some other useful configuration keys (the full list is in the GameserverSDK class)
public static string ServerIdKey; // ID given to your game server upon creation
public static string LogFolderKey; // Path to the folder that should contain all log files
public static string CertificateFolderKey; // Path to the folder that contains any game certificate files
public static string TitleIdKey; // PlayFab Title ID for this game server
public static string BuildIdKey; // PlayFab Build ID for this game server
public static string RegionKey; // Azure Region this server is running in
// These two keys are only available after allocation (once readyForPlayers returns true)
public static string SessionCookieKey; // The Session Cookie you passed into the allocation call when you requested a server
public static string SessionIdKey; // The Session ID you specified in the allocation call when you requested a server
// Get all the configuration values
Map<String, String> config = GameserverSDK.getConfigSettings();
// Retrieve a particular configuration value
if (config.containsKey(GameserverSDK.SESSION_COOKIE_KEY))
{
String sessionCookie = config.get(GameserverSDK.SESSION_COOKIE_KEY);
}
// Here are some other useful configuration keys (the full list is in the GameserverSDK class)
public static final String SERVER_ID_KEY; // ID given to your game server upon creation
public static final String LOG_FOLDER_KEY; // Path to the folder that should contain all log files
public static final String CERTIFICATE_FOLDER_KEY; // Path to the folder that contains any game certificate files
public static final String TITLE_ID_KEY; // PlayFab Title ID for this game server
public static final String BUILD_ID_KEY; // PlayFab Build ID for this game server
public static final String REGION_KEY; // Azure Region this server is running in
// These two keys are only available after allocation (once readyForPlayers returns true)
public static final String SESSION_COOKIE_KEY; // The Session Cookie you passed into the allocation call when you requested a server
public static final String SESSION_ID_KEY; // The Session ID you specified in the allocation call when you requested a server