Rotation Variable von 12 Bytes auf 6 Bytes

    • Offizieller Beitrag

    Ich muss sehr viele Rotationen im Multiplayer übertragen und mir waren die 12 Bytes doch schon sehr heftig. Mit diesen Script konnte ich es auf die Hälfte runterschrauben. Was haltet ihr davon? Die Byte Array werden dann repliziert.

    Ich versuche sowas auch mit Location. Habt ihr ne bessere Idee?

    Ich hoffe iich liege damit richtig, dass es am Ende nur 6 bytes sind, evtl ist der Array auch noch paar Byte groß wegen dem Index? das weis ich noch nicht.

    2 Nachkommastellen sollte für die Rotation noch ein sauberes Ergebnis erziehlen, ansonsten kann man das mit Interp noch alles ausgelichen. So wie der replicationMovment funktioniert.


    Dieses hier ist zum Aufbauen der Array, die dann repliziert oder versendet werden kann. Am Anfang ist ein CombineRotators. Der sorgt dafür, dass die Werte umgerechnet werden, wenn sie über den Rotationswert hinaus gehen. zB 180 und -180 ist bei vielen als Standard Miximum. Sollte ein Wert 190 sein, durch irgendwelche berechnungen vom eigenen Script, dann wird durch den combineRotators der Wert -170 sein. Ab 180 geht es ins Negative Bereich. Da ein Byte nur Maximal 255 sein kann, passt das sehr gut, das es nur bis 180 geht. Für Negative werte, habe ich nach der Komma Stelle eine 1 hinzugefügt. Denn mein Script berechnet alles nur auf 2 nachkommastellen. Wenn ein Wert -12,99 ist, dann bekommt das Byte eine 1 davor gesetzt und sieht somit so aus im Array [12,199] . Denn die 199 ist das maximum was man erreichen kann bei 2 Zahlen. Nacher wird beim entschlüsseln die 1 wieder entfernt, dazu weiter unten im script.

    Externer Inhalt blueprintue.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.


    Dieses hier ist zum entschlüsseln. Da die Rotation auch Minus sein kann, habe ich die 2 nachkommastellen mit einer 1 Davor versehen, sodass man erkennen kann, das es Minus ist. Wenn es den Wert X=12,56 hat, dann würde es so aussehen im Array, [12,56]. Wenn es Negativ sein sollte, dann [12,156]. Dann würde X so aussehen X=-12,56. Weil die 1 erkannt wurde. Die 1 ist sehr Praktisch, denn die nachkomma werte können nicht über 255 kommen.

    Externer Inhalt blueprintue.com
    Inhalte von externen Seiten werden ohne Ihre Zustimmung nicht automatisch geladen und angezeigt.
    Durch die Aktivierung der externen Inhalte erklären Sie sich damit einverstanden, dass personenbezogene Daten an Drittplattformen übermittelt werden. Mehr Informationen dazu haben wir in unserer Datenschutzerklärung zur Verfügung gestellt.

  • Hallo


    Wenns funktioniert ist doch toll.

    Besser als 6 Bytes ist schwierig.

    Ich würds mit den Kompressionsfunktionen vom FRotator versuchen. Damit kannst du einen Rotator auf 3 oder 6 Bytes drücken. Je nachdem wie du es haben willst. Wenn du sagst, du brauchst sogar die Nachkommastellen, wirst du aber auch da nicht unter 6 Bytes kommen. Wenn du eine, sagen wir mal, weniger wichtige Axis hast, kannst du aber die auf ein einzelnes Byte komprimieren und die anderen auf 2 lassen. Dann wären wir immerhin bei 5.

    Bevor es aber um ein Byte geht, würde ich eher versuchen nur OnChange die Replication zu machen (falls im Context überhaupt eine Option), und natürlich die Frequenz runterdrehen.


    Gruss

  • Nunja nicht endgültig. Aber ohne auszuprobieren etwa so:


    Hier in jeweils ein Byte:


    Code
        FRotation R; // Die zu komprimierende Rotation
        uint8 Pitch = FRotator::CompressAxisToByte(R.Pitch);
        uint8 Yaw = FRotator::CompressAxisToByte(R.Yaw);
        uint8 Roll = FRotator::CompressAxisToByte(R.Roll);


    Und wieder zurück:

    Code
    FRotator Rotation = FRotator( FRotator::DecompressAxisFromByte(Pitch),  FRotator::DecompressAxisFromByte(Yaw),  FRotator::DecompressAxisFromByte(Roll));


    Hier auf 2 Bytes:

    Code
        uint16 Pitch = FRotator::CompressAxisToShort(R.Pitch);
        uint16 Yaw = FRotator::CompressAxisToShort(R.Yaw);
        uint16 Roll = FRotator::CompressAxisToShort(R.Roll);

    Und wieder zurück:

    Code
        FRotator Rotation = FRotator( FRotator::DecompressAxisFromShort(Pitch),  FRotator::DecompressAxisFromShort(Yaw),  FRotator::DecompressAxisFromShort(Roll));

    Achtung es is unsigned, du musst schauen das die Rotation Positive ist.

    Ich hoffe das klappt.