2012-12-10 17 views
11

Desidero inviare pacchetti per sincronizzare le proprietà degli oggetti di gioco che cambiano costantemente in un gioco. Ho inviato notifiche relative a quando una proprietà viene modificata sul lato server a un oggetto EntitySync che ha il compito di inviare gli aggiornamenti per il client da consumare.Identificazione di un nome di proprietà con un ingombro minimo

Al momento, sto pre-fissando il nome della stringa di proprietà. Si tratta di un sovraccarico per quando si inviano molti aggiornamenti (posizione, HP, angolo). Mi piacerebbe un modo semi-unico per identificare questi pacchetti.

Ho pensato agli attributi (riflessione ... lenta?), Utilizzando un suffisso alla fine e inviandolo come ID (Posizione_A, HP_A) ma sono in perdita di un modo pulito per identificare rapidamente queste proprietà con una stampa bassa del piede. Dovrebbe consumare il minor numero possibile di byte.

Idee?

risposta

7

Ampliando la spiegazione di Charlie,

La biblioteca protobuf-net realizzato da Marc Gravell è esattamente quello che stai cercando in termini di serializzazione. Per chiarire, questa è la biblioteca di Marc Gravell, non Googles. Utilizza la codifica del protocollo di protocollo di Google. Si tratta di uno dei più piccoli ingombri disponibili per la serializzazione, infatti probabilmente genererà pacchetti più piccoli di quelli che verranno serializzati manualmente (Come Unity3D è in grado di gestire in rete, yuck).

Per quanto riguarda la velocità, Marc utilizza alcuni inganni molto intelligenti (in particolare HyperDescriptors) http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces a tutti, ma rimuovere il sovraccarico della riflessione del tempo di esecuzione.

Cibo per la riflessione sull'astrazione della rete; dare un'occhiata a Rx http://msdn.microsoft.com/en-us/data/gg577609.aspx flussi di eventi sono il modo più elegante mi sono occupato di networking e la comunicazione intra-sottosistema multithread fino ad oggi:

// 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

L'ho visto ed è davvero eccellente, ma come faccio a selezionare in modo selettivo le proprietà da serializzare? –

1

Sembra che si stia tentando di serializzare gli oggetti per l'invio in rete. Sono d'accordo che non è efficiente inviare il nome completo della proprietà sul filo; questo consuma molto più byte del necessario.

Perché non utilizzare una biblioteca davvero fantastica che Google ha inventato solo per questo scopo.

Questa è la porta NET: http://code.google.com/p/protobuf-net/

In poche parole, si definiscono i messaggi che si desidera inviare in modo tale che ogni proprietà ha un ID univoco per rendere l'invio delle proprietà più efficiente:

SomeProperty = 12345 

Quindi invia semplicemente l'id della proprietà e il suo valore. Ottimizza anche il modo in cui invia i valori, quindi potrebbe utilizzare solo 1, 2, 3 byte ecc. A seconda di quanto è grande il valore. Molto intelligente, davvero.

+0

volontà non devo inviare effettivamente ogni proprietà in questo caso però? Mi interessa solo inviare le proprietà che sono cambiate (non l'intero oggetto, serializzo l'intero oggetto del gioco quando viene creata una nuova entità e basta) –

+0

Forse se imposti IsRequired a false per ogni proprietà, puoi semplicemente compilare le proprietà che si desidera inviare: http://code.google.com/p/protobuf-net/wiki/GettingStarted –

Problemi correlati