2012-12-10 6 views
11

Ich möchte Pakete senden, um Eigenschaften von sich ständig ändernden Spielobjekten in einem Spiel zu synchronisieren. Ich habe Benachrichtigungen gesendet, wenn sich eine Eigenschaft auf der Serverseite zu einem EntitySync-Objekt ändert, das für das Senden von Updates verantwortlich ist, die der Client konsumieren soll.Identifizieren eines Eigenschaftsnamens mit geringem Platzbedarf

Momentan, ich bin im Voraus die Eigenschaft Zeichenfolge Name. Dies ist eine Menge Aufwand für das Senden einer Menge von Updates (Position, HP, Winkel). Ich möchte für eine halb-einzigartige Art, diese Pakete zu ignorieren.

Ich dachte über Attribute (Reflexion ... langsam?), Mit einem Suffix am Ende und das Senden als ID (Position_A, HP_A), aber ich bin auf einem sauberen Weg, um diese Eigenschaften schnell zu identifizieren mit einem niedrigen Fußabdruck. Es sollte so wenig Bytes wie möglich verbrauchen.

Ideen?

Antwort

7

auf Erklärung des Charlie Expanding

Die protobuf-net von Marc GRA gemacht Bibliothek ist genau das, was Sie in Bezug auf die Serialisierung suchen. Um es klarzustellen, das ist Marc Gravells Bibliothek, nicht Googles. Es verwendet die Protokollpuffercodierung von Google. Es ist eine der kleinsten Footprint-Serialisierungen, tatsächlich wird es wahrscheinlich kleinere Pakete erzeugen als Sie es manuell serialisieren würden (Wie Standard Unity3D behandelt Vernetzung, yuck).

Wie für die Geschwindigkeit verwendet Marc einige sehr clevere Tricks (Nämlich HyperDescriptors) http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces zu allen, aber entfernen Sie den Overhead der Laufzeit Reflexion.

Denkanstoß zur Netzwerkabstraktion; einen Blick auf Rx http://msdn.microsoft.com/en-us/data/gg577609.aspx Event-Streams sind die eleganteste Art, wie ich mit Vernetzung und Multithreading-Intra-Subsystem Kommunikation bisher behandelt habe:

// Sending an object: 
m_eventStream.Push(objectInstance); 

// 'handling' an object when it arrives: 
m_eventStream.Of(typeof(MyClass)) 
.Subscribe (obj => 
{ 
    MyClass thisInstance = (MyClass) obj; 
    // Code here will be run when a packet arrives and is deserialized 
}); 
+0

Ich habe das gesehen und es ist wirklich hervorragend - aber wie wähle ich selektiv Eigenschaften für die Serialisierung? –

1

Es klingt wie Sie versuchen, Ihre Objekte für das Senden über ein Netzwerk zu serialisieren. Ich stimme zu, dass es nicht effizient ist, den vollständigen Eigentumsnamen über die Leitung zu senden; Dies verbraucht viel mehr Bytes als Sie benötigen.

Warum verwenden Sie nicht eine wirklich fantastische Bibliothek, die Google nur für diesen Zweck erfunden hat?

Dies ist die .NET-Port: http://code.google.com/p/protobuf-net/

Auf den Punkt gebracht, definieren Sie die Nachrichten, die Sie so senden möchten, dass jedes Objekt eine eindeutige ID, die Eigenschaften effizienter zu senden machen hat:

SomeProperty = 12345 

Dann wird nur die ID der Eigenschaft und deren Wert gesendet. Es optimiert auch die Art, wie es die Werte sendet, so dass es nur 1, 2, 3 Bytes usw. verwenden kann, abhängig davon, wie groß der Wert ist. Sehr schlau, wirklich.

+0

Will nicht, dass ich tatsächlich jedoch jede Eigenschaft in diesem Fall schicken? Ich bin nur daran interessiert, die geänderten Eigenschaften zu senden (nicht das ganze Objekt; ich serialisiere das gesamte Spielobjekt, wenn eine neue Entität erstellt wird und das ist es). –

+0

Wenn Sie IsRequired für jede Eigenschaft auf false setzen, können Sie einfach ausfüllen die Eigenschaften, die Sie senden möchten: http://code.google.com/p/protobuf-net/wiki/GettingStarted –

Verwandte Themen