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

11

12.01.2011, 11:08

^Ja, das ist mir klar... nur dann bin ich wieder bei meinem Anfangproblem.

Ich wollte ja nur eine Struktur, damit ich nicht soviel Code kopieren / doppelt führen muss, da ich dann 2 verschiedene Strukturen habe.

Gibt es keinen Renderstate (oder ähnliches) welcher sagt, dass eine Farbe ignoriert werden soll?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

12.01.2011, 11:09

Wenn du die Daten in dein Struct packst, dann muss die auch an die Grafikkarte transferiert werden. Speicher ist am Ende eh linear, da wird der Bus sicher nicht alle 64 Bytes mal 16 skippen wollen.
Ein einziges Struct für alles kann zwar auch alles, ist aber nicht optimal in der Performance.
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

13

12.01.2011, 11:09

Du kannst SetRenderState mit D3DMRS_COLORVERTEX benutzen.

Was genau spricht denn gegen 2 Structs ausser deine Faulheit ;) ?

14

12.01.2011, 11:18

Also das mit dem RenderState würde funktionieren =) Danke

Nun zu meiner angeblichen Faulheit =) hehe

Das hat nichts mit Faulheit zu tun, echt nicht. Das Problem ist nur, dass ich relativ viel Code in meiner Rendermethode habe, und mein Prinzip ist nunmal halt, dass ich so viel Code wie möglich auch nur 1 mal verwenden muss, bzw. nicht doppelt führen muss.

Die Programmstruktur bleibt schöner und übersichtlicher mit nur einer Struktur. Klar würden 2 auch gehen, aber ich denke in meinem Programm macht das Performancemässig nicht wirklich was aus.

Oder was meint ihr Profis dazu?? =)

DerMark

Treue Seele

Beiträge: 324

Wohnort: Emsdetten

Beruf: Softwareentwickler

  • Private Nachricht senden

15

12.01.2011, 11:20

Machs lieber gleich richtig. Wenn deine Struktur das so nicht zulässt, dann hast du irgendwas falsch gemacht, überdenke das lieber nochmal.

zb Was wenn du später noch mehr daten in deinem vertex haben willst, zb 2 texturkoordinaten, Tangenten, Binormalen, BoneWeights, etc? Dann hast du wieder ein Problem.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

12.01.2011, 11:21

Ich finde, dass das nach einer Entschuldigung für schlechtes Design klingt. "relativ viel Code in meiner Rendermethode" klinge ebenfalls danach.

Ich würde es nicht so machen.
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]

17

12.01.2011, 11:25

hmm.. okey.. ja werde mir das mal durch den Kopf gehen lassen, bzw. mal die beiden Möglichkeiten miteinander vergleichen.
Ich denke 2 Strukturen wären vielleicht wirklich sinnvoller...

Aber danke auf jedenfall für die Hilfe und einen schönen Tag noch

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

12.01.2011, 16:46

Nur als kleiner Tipp vielleicht noch: Ich würde auf jeden Fall ein StructLayout Attribute an meine Vertex Struktur kleben:

C#-Quelltext

1
2
3
4
5
6
7
8
9
using System.Runtime.InteropServices;

...

  [StructLayout(LayoutKind.Sequential)]
  public struct Vertex
  {
    ...
  }


Denn theoretisch könnte die CLR die Structmember im Speicher ablegen wie ihr gerade beliebt was dann D3D traurig machen würde. Mit dem StructLayout Attribut kannst du sicherstellen dass das auf keinen Fall passiert.

19

13.01.2011, 08:29

Guten Morgen =)

Danke für den Tipp, aber habe nicht ganz verstanden warum ich das machen sollte??
Habe zwar den Artikel (msdn) gelesen, aber irgendwie kapier ich das nicht...

Kann mir das jemand verständlich erklären?

Danke und Gruss
Master Chief

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

13.01.2011, 08:51

C# ist managed. Die Daten liegen in einem virtuellen Speicher und die Reihenfolge, Adresse oder der Zusammenhang der Daten wird nicht garantiert.
Ein Objekt kann mal an der einen Adresse liegen und Sekunden später an einer anderen, je nachdem wie es dem Garbage-Collector gerade passt. Genau so wird nicht garantiert, dass die Reihenfolge oder der Abstand der Member in einem Struct so ist, wie du es im Code angegeben hast, bzw. vermuten würdest. Um das (die Reihenfolge) zu gewährleisten, musst du das Attribut von dot dazuschreiben.
Ich würde sogar noch weiter gehen und die Offsets der einzelnen Member spezifisch angeben:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Explicit)]
struct TestExplicit 
{
    [FieldOffset(0)] 
    public int i1;
    [FieldOffset(4)] 
    public int i2;
    [FieldOffset(8)] 
    public double d;
    [FieldOffset(12)]        // Anmerkung: Sollte hier nicht 16 stehen? Ein double hat immerhin 8 Byte...
    public char c;
    [FieldOffset(14)] 
    public byte b1;
}
(Quelle: http://msdn.microsoft.com/en-us/library/…v=vs.71%29.aspx)

Eventuell ist das unnötig, lässt sich schwer sagen, hängt wohl davon ab was genau der Managed Call von "device.DrawPrimitives" selber noch an Konvertierung oder Marshalling durchführt. Ich würde allerdings kein Risiko eingehen.
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]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (13.01.2011, 08:57)


Werbeanzeige