Array Struct Replication

    • Offizieller Beitrag

    Moin, hab das sicherlich schon mal gefragt, aber irgendwie bin ich mir unsicher bei mein jetziges Verfahren.

    Wenn ich das richtig beobachtet habe, werden alle Variable in einer Struct repliziert, egal ob man nur eine Variable verwendet.

    Aber was ist mit ein Array? Wenn ich ein Array komplett durchlaufe, zB eachLoop, werden alle Elemente hintereinander repliziert, oder wird einmal ein Array repliziert und dann local durchsucht?


    mfg EKI

  • Mag sein das ich Struct anders verstehe als du, aber Struct ist eigentlich in dieser Form....

    Code
    public struct Coords
    {   
        public Coords(double x, double y){
                X = x;        
                Y = y;    
        }
        public double X { get; }    public double Y { get; }
        public override string ToString() => $"({X}, {Y})";
    }

    Bist du Sicher das du nicht meinst das Variablen in einer Array repliziert werden?


    Weil das wäre ja logischer, auch wenn ich mich mit der inneren Struktur der Engine nicht sehr intensiv befasst habe.


    Aber nehmen wir als Beispiel mal einen String. Ein String ist auch nichts anderes als ein Array von Char.


    Und, wenn du halt mehrere Objekte hast, dann wäre ein Array von Objekt eigentlich der logische Weg.


    Mag sein, das ich da jetzt etwas durcheinander bringe oder deine Frage nicht richtig verstanden habe, oder auch beides. Aber in der Regel ist es in der Programmierung immer vom kleinen, zum großen nachvollziehbar und herleitbar, bis auf wenige Ausnahmen.

  • Moin, hab das sicherlich schon mal gefragt, aber irgendwie bin ich mir unsicher bei mein jetziges Verfahren.

    Wenn ich das richtig beobachtet habe, werden alle Variable in einer Struct repliziert, egal ob man nur eine Variable verwendet.

    Aber was ist mit ein Array? Wenn ich ein Array komplett durchlaufe, zB eachLoop, werden alle Elemente hintereinander repliziert, oder wird einmal ein Array repliziert und dann local durchsucht?


    mfg EKI

    Ist etwas schwer für mich das genau zu erklären aber folgendes weiß ich:

    Variablen Replication findet soweit mir bekannt ist nicht statt, wenn sich ein Wert ändert, sondern, wenn ein "Dirty" state festgestellt wird. D.h. wenn der server, während er prüft, was er replizieren muss, merkt, dass sich die Variable zum vorher replizierten Stand verändert hat. Genrell müsste der Check am Ende des Frames sein, d.h. es zählt der Status den deine Variable am Ende des Frames hat.


    Soweit ich mich erinnern kann sollte auch die Array Replication halbwegs intelligent sein und nicht immer alles replizieren den kompletten Array übertragen, sondern nur die Änderung. [Quelle] Da müsstest du aber noch einmal Recherchieren. Bei structs sollte es auch so sein dass nur die member übertragen werden die sich verändert haben. [Quelle]

    Sind beides aber keine direkten Epic aussagen, aber jeweils von Entwicklern die recht fit in UE4 sind.

    Das ganze kann dir aber in Blueprint egal sein, denn auf die Tiefe, welches Element oder welcher Member in der entsprechenden Replikation verändert wurden hast du keinen zugriff. Als BP Entwickler weißt nur nur, dass entsprechendes struct/array repliziert wurde.


    Generell versuche ich persönlich Array Replication zu vermeiden, außer es handelt sich um etwas was nur wenige Male repliziert wird.

    • Offizieller Beitrag

    Eine Struct kann auch als Array gesetzt werden. Dann sind alle Elemente eine Struct.

    Aber wir können ja auch weg vom Struct. Das selbe ist ja auch mit ein normalen Array. zB Float.

    Sagen wir mal so, 10 Elemente als Float sind in ein Array und das Array ist repliziert. Die 10 Elemente werden alle mit ein ForEachLoop gelesen. Wird jetzt 10 mal einzelnd repliziert, oder nur einmal das ganze array repliziert und dann gelesen. Evtl ist die Frage auch überflüssig, wenn alle Elemente, egal wie, einzeln gesendet werden.

  • Eine Struct kann auch als Array gesetzt werden. Dann sind alle Elemente eine Struct.

    Aber wir können ja auch weg vom Struct. Das selbe ist ja auch mit ein normalen Array. zB Float.

    Sagen wir mal so, 10 Elemente als Float sind in ein Array und das Array ist repliziert. Die 10 Elemente werden alle mit ein ForEachLoop gelesen. Wird jetzt 10 mal einzelnd repliziert, oder nur einmal das ganze array repliziert und dann gelesen. Evtl ist die Frage auch überflüssig, wenn alle Elemente, egal wie, einzeln gesendet werden.

    Ich glaube, Tomarr hat es einfach falsch verstanden, weil die ausdrucksweise etwas holprig ist.

    Bei dem was du beschreibst handelt es sich um einen "Array of Structs".

    Bei dem Satz "Eine Struct kann auch als Array gesetzt werden" könnte man denken, dass du ein struct in ein Array wandeln willst, oder sonst etwas. Es gibt sogar sprachen wo es geht, wobei dort die Array sich eher wie Maps verhalten (Zugriff über einen Key, statt einem Index.)