Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jun 04, 2024 12:39

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kartengröße bzw. "Granularität"
BeitragVerfasst: Di Aug 21, 2012 21:20 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Also ich bin Anfänger was OpenGL angeht und habe mich die letzten Tage recht intensiv mit Kamerabewegungen beschäftigt.
Funktioniert sogar (soweit ich das beurteilen kann) prächtig xD

Wenn ich mich nun nicht mehr durch an rasterartiges Gebilde bewegen will, sondern durch eine Karte, wie es z.B. bei, sagen wir, Anno2070 oder anderen modernen spielen dieser Art ist, was sind dann sinnvolle Größeneinheiten einer solchen Karte.
In sachen HeightMap habe ich schon einiges gelesen und der Sinn dahinter ist mir klar. Meine Frage richtet sich also nicht dahingehend!

Wenn ich eine Karte mit 256 x 256 Tiles erstellen will, wie groß sollte die Kantenlänge eines solchen Tiles sein.
Wenn wir jetzt mal vorraussetzen, dass ich schon ordentlich Platz auf der Karte haben möchte.
Ich arbeite derzeit mit double werten und weiß z.B. nicht on ein Tile die Kantenlänge 1 oder 10 oder was auch immer haben sollte.

Mir ist bewusst, dass das keine besonders genauen Angaben sind, aber dafür erwarte ich ja auch eine vllt. etwas allgemeinere Antwort.

Beste Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 21, 2012 22:19 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du arbeitest mit Gleitpunktzahlen. D.h. du kannst deine Kantenlänge völlig beliebig wählen. Üblicherweise sorgt man aber dafür das eine Einheit irgendeinem üblichen Längenmaß, z.B. einem Meter oder Zentimeter entspricht. Dann hat der 3D-Artist der deine Modelle baut eine Vorstellung davon wie groß sein Modell wirklich ist.

Übrigens arbeitet die Grafikkarte nur mit Floats, also Single, nicht Double. Solltest du im Hinterkopf behalten. Bei Kartengrößen wo du wirklich den Double-Bereich nutzt, musst du dann das Koordinatensystem so schieben das du im Float-Bereich bleibst.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 21, 2012 22:36 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Zitat:
Üblicherweise sorgt man aber dafür das eine Einheit irgendeinem üblichen Längenmaß, z.B. einem Meter oder Zentimeter entspricht. Dann hat der 3D-Artist der deine Modelle baut eine Vorstellung davon wie groß sein Modell wirklich ist.


Aha, nette Information ^^

Zitat:
Übrigens arbeitet die Grafikkarte nur mit Floats, also Single, nicht Double.


Heißt das, ich gewinne an Performance wenn ich statt
Code:
  1. Gl.glVertex3d(x, y, z);


Code:
  1. Gl.glVertex3f(x, y, z);


nutze?

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 21, 2012 22:45 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Jein....der Immediate-Mode den du da benutzt ist so lahm, das dies vermutlich nicht mal weiter auffällt. :lol:

Aber theoretisch sind Floats schneller, ja. Der Aufruf von glVertex3d dürfte übrigens nichts weiter tun als die Eingabe-Daten nach Float umzuwandeln.

Wenn du Wert auf Performance legst, schau dir VBOs an.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 21, 2012 23:01 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Ok, vielen dank!

Ich habe in der Performance Rubrik bereits davon gelesen.
Wenn ich meine Karte auf diese Art rendere, und 64x64 Tiles erzeuge läuft das super.
Bei 128x128 wirds allerdings schon crappy.
Kein Wunder, das ergibt 16.384 Tiles. Das Ganze mal 2 da jedes Tile aus 2 Dreiecken besteht macht 32.768 Dreiecke.
Da würde ich mich auch schwer tun ;)

Hatte mich bis jetzt noch nicht an VBOs rangetraut. Wird wohl Zeit.

Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 21, 2012 23:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also 32.768 Dreiecke sollten auch im Immediate-Mode unproblematisch sein. Ich denke dein Problem ist das du die 2 Dreiecke jeweils in ein eigenes glBegin/glEnd gepackt hast. Das nennt man einen "Draw-Call". Es macht kaum einen Unterschied ob du in einem Draw-Call ein einzelnes oder ein paar hundert Dreiecke renderst. Also versuche immer soviel wie möglich in einem Rutsch zu rendern.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Aug 21, 2012 23:34 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Zitat:
Ich denke dein Problem ist das du die 2 Dreiecke jeweils in ein eigenes glBegin/glEnd

Code:
  1.  
  2. Gl.glBegin(Gl.GL_TRIANGLES);
  3.             foreach(Triangle tri in mapTriangles){
  4.                 Gl.glVertex3d(tri.getA().getX(), tri.getA().getY(), tri.getA().getZ());
  5.                 Gl.glVertex3d(tri.getB().getX(), tri.getB().getY(), tri.getB().getZ());
  6.                 Gl.glVertex3d(tri.getC().getX(), tri.getC().getY(), tri.getC().getZ());
  7.             }
  8.             Gl.glEnd();
  9.  


Ich glaube das habe ich nicht getan ;) (Hoffe ich vor allem)

Hatte davon schon gelesen und versucht das zu vermeiden.
Und weil ich nicht wusste wie viel "zu viel" ist, hatte ich vorher sogar eine Mischform ausprobiert in dem ich alle Dreiecke einer Zeile zwischen Begin und End gepackt hatte.
Vllt ist der Aufruf ja auch schuld. momentan hab ich den kram in ner ArrayList. Allerdings war das 2D Array zuvor auch nicht schneller.

Ich hätte eigentlich auch gedacht es läge am nichtbenutzen der VBOs. Aber wenns bei der Menge trotzdem möglich sein sollte, dann muss der "Fehler" ja irgendwo sein ;)

EDIT:
Ich versuche die ganze Zeit ein vernünftiges Beispiel für VBOs in C# zu finden... hat da wer Erfahrungen mit?
Das Tutorial im Wiki ist für mich etwas kompliziert.

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 22, 2012 00:26 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 15, 2009 20:48
Beiträge: 111
Wohnort: Berlin
Programmiersprache: Delphi,JS,PHP,AS3,C#
alternativ kannst du auch erstmal ne displaylist benutzen, das ist sehr einfach und bringt ziemlich viel.

Zitat:
Die Grafikkarte speichert alle Objekte einer Displayliste in ihrem Grafikartenspeicher, um die Displayliste jetzt anzeigen zu lassen muss der Grafikkarte nur die Nummer der jeweiligen Displayliste übergeben werden und nicht nochmals alle Objekte, das spart eine Menge Bandbreite, Voraussetzung ist allerdings genügend Grafikkartenspeiche

_________________
thanks to the internet we have rule 34, wich states that if something exists, theres a pornographic version of it,


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 22, 2012 01:29 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Die Handhabung der DisplayList schein sehr einfach zu sein.
Trotzdem will es nicht so richtig.

Code:
  1.             this.mapList = Gl.glGenLists(1);
  2.  
  3.             Gl.glNewList(this.mapList, Gl.GL_COMPILE);
  4.  
  5.             Gl.glColor3d(0, 1, 1);
  6.             Gl.glBegin(Gl.GL_TRIANGLES);
  7.             for (int i = 0; i < mapTriangles.Count; i++) {
  8.                 Triangle tri = (Triangle)mapTriangles[i];
  9.                 Gl.glVertex3d(tri.getA().getX(), tri.getA().getY(), tri.getA().getZ());
  10.                 Gl.glVertex3d(tri.getB().getX(), tri.getB().getY(), tri.getB().getZ());
  11.                 Gl.glVertex3d(tri.getC().getX(), tri.getC().getY(), tri.getC().getZ());
  12.             }
  13.             Gl.glEnd();
  14.  
  15.             Gl.glEndList();

Wo das problem ist weiß ich:
glIsList() gibt false zurück nachdem ich die liste und die Id verheiratet habe.

Aber ich hab keine Ahnung, wie das Problem entsteht, oder zu beheben ist.

Grüße!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 22, 2012 03:10 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Problem gelöst.
DisplayList macht vorerst den Job, bis ich VBOs unter Kontrolle hab.

Code:
  1. InitializeOpenGL();
  2. InitializeGameComponents();

funktioniert viel besser als:
Code:
  1. InitializeGameComponents();
  2. InitializeOpenGL();
  3.            

Hintergrund: glGenList(1) gibt null zurück wenn der OpenGL Kontext nicht vorher initialisiert wird. Hinlänglich bekannt xD

Besten Danke!!!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 22, 2012 09:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Ich glaube das habe ich nicht getan ;)

Ja, sieht gut aus. War ja auch nur eine Vermutung ins blaue hinein, beliebter Anfängerfehler und so.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Aug 22, 2012 14:01 
Offline
DGL Member

Registriert: Di Aug 21, 2012 19:31
Beiträge: 173
Programmiersprache: C#
Coolcat hat geschrieben:
Zitat:
Ich glaube das habe ich nicht getan ;)

Ja, sieht gut aus. War ja auch nur eine Vermutung ins blaue hinein, beliebter Anfängerfehler und so.

Ich versuche möglichst viel zu lesen bevor ich so'n Krams mache bzw. meine blöden Fragen zu Posten. ;)
Daher lies sich das schon mal vermeiden.
Das Problem mit der DisplayList war mir eigentlich auch klar. Ich war mir nur sehr sicher das die Reihenfolge stimmt.
Ich habe allerdings in der Aufrughierarchie 'ne Ebene zu tieg geguckt und daher die eigentliche Problemstelle gar nicht gesehen xD

Wir sind nun glaube ich ziemlich weit ab vom eigentlichen Thema ;)

Möchte nur noch sagen, dass die DisplayList das Performanceproblem gelöst haben, und das ich auf Grund einiger Optimierungsmaßnamen (Zusammenlegen von Triangles...) nun eh wieder einiges an Reserve habe.

Zukünftige Fragen werde ich dann im entsprechenden Bereich Posten.

Grüße und vielen Dank!

_________________
ack nack nack nack nack


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 12 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.048s | 15 Queries | GZIP : On ]