2012-12-10 16 views
11

Chcę wysłać pakiety, aby zsynchronizować właściwości stale zmieniających się obiektów gry w grze. Wysłałem powiadomienia o tym, kiedy właściwość zmienia się po stronie serwera dla obiektu EntitySync, który jest odpowiedzialny za wysyłanie aktualizacji do konsumpcji przez klienta.Identyfikacja nazwy właściwości o niskim rozmiarze

W tej chwili wstępnie ustalam nazwę ciągu właściwości. Jest to dużo kosztowne, gdy wysyłasz dużo aktualizacji (pozycja, HP, kąt). Chciałbym uzyskać na wpół unikatowy sposób na zbieranie tych pakietów.

Myślałem o atrybutach (odbicie ... wolne?), Używając przyrostka na końcu i wysyłając to jako identyfikator (Position_A, HP_A), ale brakuje mi czystej metody szybkiego identyfikowania tych właściwości z niskim nadrukiem stóp. Powinien zużywać jak najmniej bajtów.

Pomysły?

Odpowiedz

7

Rozszerzając wyjaśnienia Charliego,

Biblioteka protobuf-net przez Marc Gravell jest dokładnie to, czego szukasz w zakresie serializacji. Aby to wyjaśnić, jest to biblioteka Marca Gravella, a nie Googles. Wykorzystuje kodowanie bufora protokołu Google. Jest to jeden z najmniejszych śladów postronnych, w rzeczywistości prawdopodobnie wygeneruje mniejsze pakiety niż ręcznie serializujesz (Jak domyślnie Unity3D obsługuje sieci, fuj).

Jeśli chodzi o szybkość, Marc używa bardzo sprytnego oszustwa (mianowicie HyperDescriptors) http://www.codeproject.com/Articles/18450/HyperDescriptor-Accelerated-dynamic-property-acces , aby wyeliminować narzut związany z odbiciem czasu pracy.

Żywność do przemyślenia w abstrakcji sieci; spojrzeć na Rx http://msdn.microsoft.com/en-us/data/gg577609.aspx strumienie zdarzeń są najbardziej elegancki sposób mam do czynienia z sieci i wielowątkowej komunikacji wewnątrz podsystemu do tej pory:

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

Widziałem to i jest naprawdę doskonałe - ale w jaki sposób mogę selektywnie wybierać właściwości do serializacji? –

1

Wygląda na to, że próbujesz serializować obiekty w celu przesłania przez sieć. Zgadzam się, że wysłanie pełnej nazwy nieruchomości przez przewód nie jest skuteczne; to pochłania więcej bajtów niż potrzebujesz.

Dlaczego nie skorzystać z naprawdę fantastycznej biblioteki, którą Google wymyślił właśnie w tym celu.

Jest to port .NET: http://code.google.com/p/protobuf-net/

W skrócie można zdefiniować wiadomości, które chcesz wysłać tak, że każda nieruchomość posiada unikalny identyfikator, aby wysyłając właściwości bardziej efektywne:

SomeProperty = 12345 

Następnie po prostu wysyła identyfikator nieruchomości i jej wartość. Optymalizuje również sposób wysyłania wartości, więc może wykorzystywać tylko 1, 2, 3 bajty itp. W zależności od tego, jak duża jest ta wartość. Bardzo sprytnie, naprawdę.

+0

Czy nie muszę faktycznie wysłać Każda nieruchomość w tym przypadku jednak? Interesuje mnie tylko wysłanie właściwości, które się zmieniły (nie cały obiekt, serializuje cały obiekt gry, gdy tworzona jest nowa encja i to wszystko). –

+0

Może jeśli ustawisz IsRequired na false dla każdej właściwości, możesz po prostu wypełnić właściwości, które chcesz przesłać: http://code.google.com/p/protobuf-net/wiki/GettingStarted –

Powiązane problemy