Hallo,
wie kann ich einer Structure sagen, das sie sein array von float Werten erstellen soll. Im moment geht nur das:
public struct PositionNormalTexturedBlended
{
public Vector3 pos;
public Vector3 normal;
public float tu, tv, i1, i2, i3, i4, w1, w2, w3, w4;
public static readonly VertexFormats Format =
VertexFormats.Position |
VertexFormats.Normal |
VertexFormats.Texture4;
};
Ich hätte aber gerne das hier:
public struct PositionNormalTexturedBlended
{
public Vector3 pos;
public Vector3 normal;
public float tu, tv;
public float[] index = new float[4]; // hier entsteht ein compiler fehler
public float[] weight = new float[4]; // hier auch
public static readonly VertexFormats Format =
VertexFormats.Position |
VertexFormats.Normal |
VertexFormats.Texture4;
};
Ja, in einem Strukt darfst du keine Feldinitialisierer habe. Schreib einfach
float[] index;
float[] weight;
und fertig.
Baka wa shinanakya naoranai.
Mein XING Profil.
Sei dir dennoch bewusst, dass es zwischen den beiden Varianten einen Unterschied gibt.
Bei public single i1, i2, i3, i4; liegen vier Singles direkt hintereinander im Struct und benötigen damit 16 Bytes.
Bei public single[] i; wird nur die Referenz auf ein Array, also vier Bytes, abgelegt. Das Array selbst wird auf dem Heap angelegt (mittels new).
Um dieses Problem zu umgehen, könntest du dir für die zusammengehörenden Werte index und weight einen eigenen Typ als Struct definieren und diesen nutzen.
PS.: Verwendet man den Begriff Heap unter .NET eigentlich noch? Und wenn nicht: welcher wäre besser?
Hallo Borg,
der Begriff Heap ist auch unter .NET gängig.
herbivore
Ich will aber feste größen in einem strukt benutzte, damit das ganze "blitz" schnell funktioniert. Z.B für Bildverarbeitung bei 50 Bilder in der Sekunde, wenn ich pro pixel zusätzliche Informationen benötige. Hat einer von euch schon mit performance relevanten algorithmen in C# gearbeitet? Oder ist C# doch wieder nur so'n VB murks? Im Moment finde ich C# in der Programmierung komfortabler als C++, da kann ich performance einbussen gut verkraften.
// Beispiel
myStruct[] ganzViel = new myStruct[100000];
myStruct[] ganzViel2 = new myStruct[100000];
for( int i=0; i<100000; i++ )
{
for( int j=0; j<4; j++ )
{
ganzViel.weights.Add( zufall() );
ganzViel.index.Add( zufall() );
}
}
ganzViel.CopyTo( ganzViel2, 0 );
Andererseits könnte ich auch ganz brutal vorgehen:
// Beispiel
int stuctSize = 8;
float[] ganzViel = new float[100000 * stuctSize];
float[] ganzViel2 = new float[100000 * stuctSize];
for( int i=0; i<100000; i++ )
{
for( int j=0; j<4; j++ )
{
ganzViel[ i * stuctSize + j * 2 + 0 ] = zufall();
ganzViel[ i * stuctSize + j * 2 + 1 ] = zufall();
}
}
ganzViel.CopyTo( ganzViel2, 0 );