Multiplayer: Unterschied zwischen den Versionen

Aus Das Sopra Wiki
Dietsch (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Langenfeld (Diskussion | Beiträge)
K Änderungen von Langenfeld (Diskussion) wurden auf die letzte Version von LeonH zurückgesetzt
Markierung: Zurücksetzung
 
(12 dazwischenliegende Versionen von 6 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{löschen}}
=== Netzwerk ===
=== Netzwerk ===
Da die Implementierung von Netzwerkfunktionalität für Multiplayer-Unterstützung nicht ganz trivial umzusetzen ist wird sie gern als optionales Feature für die spätere Entwicklung angedacht. Das Problem hierbei ist, dass Netzwerkfunktionalität einen entscheidenden Einfluss auf die gesamte Architektur hat. Wenn Netzwerkfunktionalität geplant ist sollte diese daher von vornherein als festes Feature eingeplant werden.
Da die Implementierung von Netzwerkfunktionalität für Multiplayer-Unterstützung nicht ganz trivial umzusetzen ist wird sie gern als optionales Feature für die spätere Entwicklung angedacht. Das Problem hierbei ist, dass Netzwerkfunktionalität einen entscheidenden Einfluss auf die gesamte Architektur hat. Wenn Netzwerkfunktionalität geplant ist sollte diese daher von vornherein als festes Feature eingeplant werden.


Wenn man sich dafür entscheided Netzwerkfunktionalität zu implementieren, sollte man wissen dass es für das XNA Framework zwei grundlegend verschiedene Möglichkeiten gibt:
Wenn man sich dafür entscheidet, Netzwerkfunktionalität zu implementieren, sollte man wissen, dass es für das XNA Framework zwei grundlegend verschiedene Möglichkeiten gibt:
* Man kann die Netzwerk-Funktionalitäten Nutzen die das XNA-Framework zur Verfügung stellt. Hierzu sollte man folgende [http://blogs.msdn.com/xna/archive/2007/11/16/xna-framework-networking-and-live-requirements.aspx Fakten zu XNA Framework Networking and LIVE Requirements] kennen und findet dann alle weiteren Informationen, sowie auch Tutorials, in den [http://msdn.microsoft.com/en-us/library/bb975801.aspx Networking Seiten zu XNA 3.0 in der MSDN]. Auch der Education Catalog des XNA Creators Club verfügt über eine [http://creators.xna.com/en-US/education/catalog/?contenttype=0&devarea=19&sort=1 Sektion mit Samples zu Networking].
* Man kann die Netzwerk-Funktionalitäten Nutzen, die das XNA-Framework zur Verfügung stellt. Hierzu sollte man folgende [http://blogs.msdn.com/xna/archive/2007/11/16/xna-framework-networking-and-live-requirements.aspx Fakten zu XNA Framework Networking and LIVE Requirements] kennen.
* Wenn man die Einschränkungen der ersten Möglichkeit nicht hinnehmen will und/oder nicht mit ''Xbox LIVE'' bzw. ''Games for Windows® - LIVE'' arbeiten möchte, so kann man mit [[.NET]] eigene Netzwerkfunktionalität programmieren oder versuchen eine .NET Network-Library zu integrieren. Auch wenn man bei dieser Alternative mehr flexibilität erreichen kann ist das definitiv die schwerere Variante. Mögliche Einstiegspunkte in das Thema:
* Wenn man die Einschränkungen der ersten Möglichkeit nicht hinnehmen will und/oder nicht mit ''Xbox LIVE'' bzw. ''Games for Windows® - LIVE'' arbeiten möchte, so kann man mit [[.NET]] eigene Netzwerkfunktionalität programmieren oder versuchen eine .NET Network-Library zu integrieren. Auch wenn man bei dieser Alternative mehr flexibilität erreichen kann, ist das definitiv die schwerere Variante. Mögliche Einstiegspunkte in das Thema:
** Der [http://msdn.microsoft.com/de-de/library/system.net.sockets.aspx System.Net.Sockets - Namespace des .NET Frameworks 3.5]
** Der [http://msdn.microsoft.com/de-de/library/system.net.sockets.aspx System.Net.Sockets - Namespace des .NET Frameworks 4.5]
** Die [http://code.google.com/p/lidgren-network/ Lidgren networking library]  
** Die [http://code.google.com/p/lidgren-network-gen3/ Lidgren networking library]  


Davon unabhängig sind für die Realisierung eines klassischen Client/Server Konzepts folgende Schritte notwendig:
Davon unabhängig sind für die Realisierung eines klassischen Client/Server Konzepts folgende Schritte notwendig:
Zeile 12: Zeile 14:
Auf Server Seite:
Auf Server Seite:
* Socket öffnen & Clientverbindungen annehmen
* Socket öffnen & Clientverbindungen annehmen
* Daten gemäß Protokoll transportieren
* Daten gemäß einem definierten Protokoll transportieren


Auf Client Seite:
Auf Client Seite:
* Mit Server Socket verbinden
* Mit Server Socket verbinden
* Daten gemäß Protokoll transportieren
* Daten gemäß einem definierten Protokoll transportieren


==== Protokoll ====


== Multiplayer mit der [http://code.google.com/p/lidgren-network/ Lidgren] Bibliothek ==
Ein Netzwerkprotokoll legt fest, wie und in welcher Form Daten von einem Rechner in einem Netzwerk zu einem anderen Rechner übertragen werden. Bei der Definition eines (Netzwerk-)Protokolls muss auf sehr viele verschiedene Dinge geachtet werden. Eines der wichtigsten ist die zur Verfügung stehende [http://de.wikipedia.org/wiki/Datenübertragungsrate Datenübertragungsrate] des Netzwerks. Ein echtzeit-multiplayer Spiel muss seinen Spielzustand mit allen verbundenen Spielern zu jeder Zeit synchron halten. Das heißt, jede Änderung des Spielzustandes eines Spielers muss ebenfalls in den Spielzuständen aller anderen Spieler durchgenommen werden.
 
Eine Möglichkeit, dies zu lösen, ist, den gesamten Spielzustand z.B. einmal pro Sekunde zu übertragen. Allerdings kommt hier besagte maximale Datenübertragungsrate zum Tragen, denn ein Spielzustand, in dem sich 500 Spielobjekte befinden und ihre Attribute ändern, kann je nach Wahl der Architektur und des Protokolls so groß sein, dass eine 100 MBit/s Übertragungsrate nicht mehr ausreicht. Da die Datenübertragungsrate im Internet meist deutlich geringer als 100 MBit/s ist, ist Multiplayer über das Internet ist mit diesem "naiven" Protokoll fast immer undenkbar.
 
Wie die Übertragung von Spielzuständen möglichst effizient erreicht werden kann, das heißt, dass nur die wirklich notwendigen Daten übertragen werden, die für die Änderung des Spielzustands wichtig sind, ist eine "Kust für sich" und hängt stark von der Softwarearchitektur des Spiels ab. Überlegen Sie sich bei der Definition eines Netzwerkprotokolls daher genau, welche Daten Sie übertragen müssen, damit das Spiel im Netzwerk spielbar ist und bleibt, und wie Sie diese Daten übertragen.
 
== Multiplayer mit der [http://code.google.com/p/lidgren-network-gen3/ Lidgren] Bibliothek ==
=== Die NetBuffer Klasse ===
=== Die NetBuffer Klasse ===
Eine Instanz der ''NetBuffer'' Klasse erhält man stets durch Aufruf der Methode ''CreateBuffer()'' auf einem ''NetServer'' respektive ''NetClient'' Objekt.
Eine Instanz der ''NetBuffer'' Klasse erhält man stets durch Aufruf der Methode ''CreateBuffer()'' auf einem ''NetServer'' respektive ''NetClient'' Objekt.
Zeile 37: Zeile 46:
Starten des Servers
Starten des Servers
<source lang=csharp>
<source lang=csharp>
NetConfiguration config = new NetConfiguration("MyApp");
NetPeerConfiguration config = new NetPeerConfiguration("MyApp");
config.Port = 4096;
config.Port = 4096;
NetServer myNetServer = new NetServer(config);
NetServer myNetServer = new NetServer(config);
myNetServer.SetMessageTypeEnabled(NetMessageType.ConnectionApproval, true);
myNetServer.Start();
myNetServer.Start();
</source>
</source>
Zeile 46: Zeile 54:
Empfangen von Clientdaten
Empfangen von Clientdaten
<source lang=csharp>
<source lang=csharp>
NetBuffer buffer = myNetServer.CreateBuffer();
NetIncomingMessage msg;
NetMessageType type;
while ((msg = server.ReadMessage()) != null)
NetConnection sender;
while (myNetServer.ReadMessage(buffer, out type, out sender))
{
{
switch (type)
switch (msg.MessageType)
{
{
case NetMessageType.DebugMessage:
case NetIncomingMessageType.VerboseDebugMessage:
Console.WriteLine(buffer.ReadString());
case NetIncomingMessageType.DebugMessage:
case NetIncomingMessageType.WarningMessage:
case NetIncomingMessageType.ErrorMessage:
Console.WriteLine(msg.ReadString());
break;
break;
case NetMessageType.ConnectionApproval:
case NetIncomingMessageType.Data:
// a client has connected and asks for approval
sender.Approve();
break;
case NetMessageType.StatusChanged:
string statusMessage = buffer.ReadString();
NetConnectionStatus newStatus = (NetConnectionStatus)buffer.ReadByte();
Console.WriteLine("New status for " + sender + ": " + newStatus + " (" + statusMessage + ")");
break;
case NetMessageType.Data:
// data sent by client..
// data sent by client..
// buffer contains the userdata from the client..
// buffer contains the userdata from the client..
Zeile 81: Zeile 81:
<source lang=csharp>
<source lang=csharp>
myNetServer.SendToAll(buffer, NetChannel.UnreliableInOrder1);
myNetServer.SendToAll(buffer, NetChannel.UnreliableInOrder1);
</source>
</source> [[Kategorie:Code-Beispiele]]
 
=== Client ===
=== Client ===
Client starten
Client starten
Zeile 243: Zeile 244:


[[Kategorie:Code-Beispiele]]
[[Kategorie:Code-Beispiele]]
[[Kategorie:Begriffe]]
[[Kategorie:Tutorials]]