Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

21

13.01.2011, 09:18

Microsoft machts es ähnlich.

Microsoft.DirectX.Direct3D.CustomVertex.Transformed:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[StructLayout(LayoutKind.Sequential), MiscellaneousBits(1)]
public struct Transformed
{
    public float X;
    public float Y;
    public float Z;
    public float Rhw;
    public const VertexFormats modopt(IsConstModifier) Format = 4;
    public override string ToString();
    public Vector4 Position { get; set; }
    public Transformed(Vector4 value);
    public Transformed(float xvalue, float yvalue, float zvalue, float rhwvalue);
    public static int modopt(IsConstModifier) StrideSize { get; }
}

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

22

13.01.2011, 09:22

Spannend. Ich frag mich warum das geht ohne explizites Alignment. Eventuell, weil eh alle Member 4 Byte (oder Vielfaches davon) groß sind?

Edit:

Zitat

Sequential

The members of the object are laid out sequentially, in the order in which they appear when exported to unmanaged memory. The members are laid out according to the packing specified in StructLayoutAttribute.Pack, and can be noncontiguous.

Klingt für mich irgendwie... nach einem Fehler von Microsoft, der scheinbar in der Praxis nie auftritt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

23

13.01.2011, 09:32

In der deutschen MSDN steht das etwas anders da:

Zitat

Sequential

Das Layout der Member des Objekts erfolgt sequenziell in der Reihenfolge, in der sich diese beim Export in nicht verwalteten Speicher befinden. Das Layout der Member entspricht der in StructLayoutAttribute.Pack angegebenen Komprimierung, und es darf nicht lückenhaft sein.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

24

13.01.2011, 10:14

Nun, da Microsoft nicht muttersprachlich deutsch verfasst, sondern manuell oder semi-automatisch ihre Artikel übersetzen, ist die deutsche Version für mich weniger aussagekräftig als die englische, zudem man eh selber nur mit diesem Attribut diese Forderung nach "darf nicht lückenhaft sein" gar nicht beeinflussen kann.
Spannend ist diese Inkonsistenz jedoch trotzdem. Eins von beiden ist schlecht ausgedrückt oder schlicht falsch.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

25

13.01.2011, 10:36

Ja da hast du wohl recht. Das [u]"and can be noncontiguous[/u]" bezieht sich vermutlich auf folgende Situation:

C#-Quelltext

1
2
3
4
5
6
[StructLayout(LayoutKind.Sequential)]
public struct MyStruct
{
    public byte a; // 1 byte
    public int b; // 4 bytes
}


Hier würden nach byte a noch 3 Füllbytes kommen und somit eine Lücke bis zum nächsten Field int b. Das sizeof würde hier vermutlich 8 Bytes liefern.

Mit dem von dir vorgeschlagenen FieldOffsetAttribute kann man dies umgehen. Mit StructLayout.Pack kann man dies aber auch beeinflussen, per Default dürfte der Wert davon auf 0 stehen was Gerätespezifisch bedeutet und in den meisten Fällen 4 Byte Abstände liefert. Hier könnte man den Wert 1 wählen wenn man es denn braucht und das Ergebniss von sizeof wäre dann 5 Bytes.

Da alle Fields der VertexKlassen jeweils 4 Byte gross sind spielt das wohl auch kaum eine Rolle, wenn man allerdings irgendetwas extravagantes plant gut zu wissen.

Evtl wäre es gut daraus einen eigenen Thread zu erstellen.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

26

13.01.2011, 10:41

Genau das habe ich gemeint.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige