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

Aktuelle Zeit: So Jul 21, 2019 07:54

Foren-Übersicht » Sonstiges » Meinungen zu den Projekten
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: New Sga Project
BeitragVerfasst: Mo Jul 09, 2012 21:50 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Und hier der Meinungsthread zum New Sga Project


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Mo Jul 09, 2012 22:05 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Yay!
Was habe ich Boulder Dash geliebt...Freue mich auf den ersten Release :)

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Fr Jul 13, 2012 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Backface-Culling gibt dir einen Performance-Nachteil(!) in deinem Fall. Das führt nämlich einen weiteren Test ein, der bei dir überhaupt keine Rolle spielt – deine Tiles sind immer zum Betrachter ausgerichtet, also werden sie immer gezeichnet.

Es ist ja nicht so, dass OpenGL immer beide Seiten eines Quads zeichnet. Es zeichnet jedes Quad genau einmal. Mit Backface-Culling verhinderst du das Zeichnen nur, wenn das Quad vom Betrachter wegzeigt. Das ist bei geschlossenen Objekten, wo eine Rückseite eines Quads immer durch ein anderes, davorliegendes Quad verdeckt wird, sinnvoll, da man so sinnloses Zeichnen einspart. Dort überwiegt also die Zeiteinsparung durch weniger Füllratenverbrauch die Kosten, die man durch den zusätzlichen Test hat. In deinem Fall wird aber nicht ein einziges Quad durch das Backface-Culling aussortiert, daher bringt das nur unnötige Kosten rein.


Zu der Texturen-Sache: Die Lösung dafür wäre übrigens gewesen, die Texturkoordinaten um 0.5 Pixel (also 0.5 / textureWidth bzw. 0.5 / textureHeight, je nach Koordinate) zu verschieben und das Filtern auf GL_NEAREST zu stellen. Das kannst du übrigens immer noch tun, da deine Texturen immer 1:1 gezeichnet werden. GL_LINEAR kostet potentiell Rechenzeit, während GL_NEAREST das schnellste ist. Interpolation brauchst du aber garnicht.

Eine große Textur bringt normalerweise einen Performancevorteil, da es dann nicht so oft erforderlich ist, die Textur zu wechseln. Das ist teuer, allein wegen des Bindcalls, vorallem aber weil man einen neuen Zeichenaufruf (glBegin/glEnd, glDraw*-Call) braucht. Jeder Zeichenaufruf kostet relativ viel Zeit zusätzlich zu der Zeit die es braucht, um die Primitiven selber zu Zeichnen.


Für deinen Usecase würde ich für das Level ein großes VBO anlegen und erstmal pauschal alles Zeichnen. Sollte das zu stark auf die Performance gehen beziehungsweise das Level zu groß sein, solltest du Indexbuffer verwenden, um einzelne Teile des Levels zu zeichnen. Dabei würde ich eine einfache Unterteilungstechnik wie z.B. immer 8×8 (64 Quads) oder 16×16 Tiles (256 Quads) in einem Indexbuffer halten vorschlagen.

Dynamische Inhalte würde ich in ein separates VBO packen und ebenfalls erstmal pauschal Zeichnen. Da diese nicht so viele sein sollten, sollte das okay sein da keine IBOs zu verwenden.


Beim Fullscreen solltest du noch den Spielspezifischen Aspekt beachten, dass manche Level ja durchaus davon profitieren, dass der Spieler nicht sofort alles sieht. Eventuell also noch eine Art Fog-Of-War einbauen, sodass man nur den Teil des Levels sieht, den man schon „erkundet“ hat oder den Sichtbereich bei hohen Auflösungen anders einschränken. Wovon ich abraten würde wäre ein Skalieren auf die größe des Bildschirms. Das sieht bei texturierten Tiles meist recht bescheiden aus :).

mein Senf dazu :)

grüße

//edit: Ich plane selber auch gerade einen Boulder Dash clone, aber mit einigen sehr abgedrehten Aspekten (Um mal einen vorweg zu nehmen: lazz0r!!). Lass dich davon nicht einschüchtern wenn ich den hier irgendwann vorstelle ;).

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Fr Jul 13, 2012 20:36 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Vielen Dank für Deine Tipps Lord Horazont :D
Das Backface-Culling habe ich entfernt.
Lord Horazont hat geschrieben:
Zu der Texturen-Sache: Die Lösung dafür wäre übrigens gewesen, die Texturkoordinaten um 0.5 Pixel (also 0.5 / textureWidth bzw. 0.5 / textureHeight, je nach Koordinate) zu verschieben und das Filtern auf GL_NEAREST zu stellen. Das kannst du übrigens immer noch tun, da deine Texturen immer 1:1 gezeichnet werden. GL_LINEAR kostet potentiell Rechenzeit, während GL_NEAREST das schnellste ist. Interpolation brauchst du aber garnicht.

Funktioniert diese Technik auch mit GL_LINEAR oder GL_LINEAR_MIPMAP_NEAREST. Beim Skalieren entstehen beim Setzen des Filters auf GL_NEAREST hässliche Artefakte (Ränder werden bei transparenten Tiles nicht weich gezeichnet).
Code:
  1. BindTexture;
  2. glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);


EDIT:
Wow, ich glaub ich habs verstanden. Auf den ersten Blick sieht das sehr gut aus. Danke Du bist gut! Kannst Du Dir vorstellen, wieviele Stunden/Tage ich nach so einer einfachen Lösung gesucht und nichts gefunden habe? :D

Natürlich funktionierts auch mit den anderen Filtern. Hier mein grober Lösungsansatz:
Code:
  1. {
  2. Beispiel:
  3. Tileset ist 96*96 Pixel groß
  4. Jedes Tile hat eine Länge und Höhe von 32 Pixel
  5. Anzahl der Tiles: 3 * 3 = 9
  6. X,Y Koordinaten der Tiles (X = (0..2) Y = 0..2)
  7. }
  8.  
  9. Procedure DrawQuadPart(pX, pY, pZ, pWidth, pHeight : Single);
  10. Const TileSize=32;     //Breite und Höhe eines Tiles
  11.       TileSetSize=96; //Breite und Höhe des Tilesets
  12. Var FV:Single;  //Fix Value
  13.     X,Y:Integer; //Koordinaten der Tiles
  14.     NT:Integer; //Number of Tiles
  15. Begin
  16. NT:=TileSetSize DIV TileSize; //96 DIV 32 = 3
  17.  
  18. FV:=0.5/TileSetSize;
  19.  
  20. X:=2; //Rechtes oberes Tile aus Tileset wird gezeichnet
  21. Y:=0;
  22.  
  23. //glBegin und glEnd natürlich nur einmal (außerhalb der Schleife) aufrufen
  24.  
  25. glBegin(GL_QUADS); //Achtung: Tile wird horizontal gespiegelt
  26.  glTexCoord2f(X/NT+FV,(Y+1)/NT-FV); glVertex3f(pX-pWidth/2, pY-pHeight/2, -pZ); //Links unten
  27.  glTexCoord2f((X+1)/NT-FV,(Y+1)/NT-FV); glVertex3f(pX+pWidth/2, pY-pHeight/2, -pZ); //Rechts unten
  28.  glTexCoord2f((X+1)/NT-Fv,Y/NT+FV); glVertex3f(pX+pWidth/2, pY+pHeight/2, -pZ); //Rechts oben
  29.  glTexCoord2f(X/NT+FV,Y/NT+FV); glVertex3f(pX-pWidth/2, pY+pHeight/2, -pZ);  //Links oben
  30. glEnd;
  31.  
  32. End;
  33.  

Ende Edit

Im Schnitt habe ich beim Rendern maximal 20 Texturenwechsel, wobei die Anzahl der Tiles bei 168 mit einer Tilegröße von 32*32 Pixeln liegt. Wenn das möglich ist, würde ich es aber gerne noch einmal mit einer einzigen Textur versuchen. Eine Größe von 512*512 dürfte kein Problem sein?

Mit VBO's kenne ich mich (noch gar) nicht aus. Werde ich mir aber vornehmen.

Dass man ganze Höhle betrachten kann, ist von mir beabsichtigt. Natürlich weiss ich, dass manche Spiele dadurch leichter werden. Die Freiheit, den Schwierigkeitsgrad zu wählen, möchte ich dem Nutzer jedoch lassen. Einige Spiele sind nämlich schon so schwer genug.

Grundsätzlich muss ich sagen, dass ich bisher keine Performance-Probleme hatte. Selbst auf einer alten Kiste, auf der sogar noch Win2k installiert ist, läuft das Spiel recht gut. Naja, die Anforderungen sind schließlich sehr gering. Allerdings möchte ich trotzdem alles möglichst optimieren, auch wenn es nicht immer "spürbar" ist. Deshalb bin ich für solche Tipps sehr dankbar.
Lord Horazont hat geschrieben:
Ich plane selber auch gerade einen Boulder Dash clone, aber mit einigen sehr abgedrehten Aspekten (Um mal einen vorweg zu nehmen: lazz0r!!). Lass dich davon nicht einschüchtern wenn ich den hier irgendwann vorstelle ;).

Das klingt gut :-) Keine Sorge, ich habe mich bewusst dafür entschieden, das Spiel möglichst einfach zu halten. Für mich war vor allem eine gute Kompatibilität zu den Original- und Fanspielen (für die es auch eine Konvertierung/Import-Möglichkeit gibt) wichtig. Wobei ich an der Game-Engine nicht mehr viel ändern werde, die ist soweit ganz gut.

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Sa Jul 14, 2012 11:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Freut mich dass es funktioniert ;). Solltest du immer noch Probleme haben, mach einfach einen Pixel transparenten Rand um die Tiles in der Textur.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Sa Jul 14, 2012 18:54 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Naja, meine anfängliche Euphorie hält sich nun doch in Grenzen. Ohne Nachteile gehts wohl leider doch nicht. Bei einigen Tilesets siehts richtig gut aus, bei anderen sieht man deutlich die Übergänge zwischen den Tiles. Ich weiss, das liegt am Filter, aber mit GL_NEAREST sieht's noch schlimmer aus. Vielleicht würde es helfen, die Tilesets weich zu zeichnen. Eine spürbare Verbesserung der Performance gabs nicht, außer, dass die CPU-Auslastung etwas sinkt. Das Umranden der Tiles mit transparenter Farbe bringt leider keinen Vorteil. Schade, werde mal offenlassen, wie ich das letztendlich löse. Im Moment bleib ich dann doch beim Texturen-Wechsel, werde aber weiter mit den Tilesets experimentieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Sa Jul 14, 2012 21:05 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Vielleicht anstatt Transparent zu machen einfach den Pixel am Rand wiederholen. So wie GL_CLAMP es macht.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Sa Jul 14, 2012 23:54 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
damadmax hat geschrieben:
Vielleicht anstatt Transparent zu machen einfach den Pixel am Rand wiederholen.

Danke für den Tipp :D So siehts schon besser aus! Zwischen den zwei Tiles liegen jetzt zwei Pixel, die Randpixel jedes Tiles werden verdoppelt. Die Texturkoordinaten verschiebe ich nicht mehr. Mit den Filtern muss ich noch etwas experimentieren, beim verkleinern wird das Bild mit den MIPMAP-Filtern unscharf. GL_LINEAR scheint doch die beste Wahl zu sein. Ich hab in der Textur sogar noch Platz für das Charset, dann brauche ich im Spiel überhaupt keine Texturenwechsel mehr :P

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: So Jul 15, 2012 10:57 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
Selbst wenn du auf 1024^2 oder 2048^2 erhöhst ist das im Vergleich zu anderen Anwendungsfällen, bei denen evtl. jede Textur diese Größe hat, immer noch ein Leichtgewicht.

Hab es bei meiner GUI genauso gemacht. Die GUI-Textur mit den Tiles für die Buttons und Fenster wird beim Start der Anwendung zusammen mit den Buchstaben in eine Textur kopiert. Das macht einen riesigen Performanceschub, da sonst zwischen jeder Komponente in der GUI die Textur gewechselt werden muss.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: So Jul 22, 2012 08:25 
Offline
Compliance Officer
Benutzeravatar

Registriert: So Aug 08, 2010 08:37
Beiträge: 458
Programmiersprache: C / C++ / Lua
du kannst die weiße textur streichen und stattdessen glColor3f(1,1,1); verwenden... fürs Blending braucht man nicht unbedingt texturen.

_________________
offizieller DGL Compliance Beauftragter
Never run a changing system! (oder so)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Mo Jul 23, 2012 19:23 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
end hat geschrieben:
du kannst die weiße textur streichen und stattdessen glColor3f(1,1,1); verwenden.

Danke für Deinen Hinweis! Oje, war dann doch vielleicht etwas spät/früh am Sonntag morgen um 4 Uhr. Ich benutze keine weiße Textur (mehr), ich zeichne ein Quad, nachdem ich die Verwendung von Texturen deaktierviert und glColor auf (1,1,1) gesetzt habe. Das war ein Denkfehler in meiner Beschreibung. Ich werde das noch ändern. Hatte zuvor aber wirklich eine weiße Textur verwendet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: So Okt 21, 2012 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Warum GetAsyncKeyState (windows only) wenn du SDL sowas auch hat und vorallem ein ordentliches Event-System, mit dem das ganze etwas schmerzfreier geht? Siehe dazu am besten unser SDL-Tutorial.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: So Okt 21, 2012 17:58 
Offline
DGL Member

Registriert: Di Jun 12, 2012 21:26
Beiträge: 112
Programmiersprache: Delphi
Lord Horazont hat geschrieben:
Warum GetAsyncKeyState (windows only)

Da ich (zumindest im Moment leider) nur für Windows programmiere. Ich kenne das Event-System von SDL, da ich es in meinem alten Projekt verwendet habe. Für die Texteingabe ist dieses System jedoch leider nicht geeignet. In meinem alten Projekt habe ich die Texteingabe über das Event-System implementiert, wüsste also, wie ich das Ganze angehen würde. Mit GetAsyncKeyState ist es jedoch wesentlich einfacher. Außerdem werden in SDL die Scancodes abgefragt. Das bedeutet, dass ich als Vorgabe ersteinmal das englische bzw. amerikanische Tastaturlayout habe, was ich für die Texteingabe in meinem alten Projekt schon störend fand.

Natürlich wäre eine plattformunabhänige Anwendung schön, allerdings ist das Projekt schon zu weit fortgeschritten, um alles entsprechende ohne weiteres Umzubauen. Die weitere Frage ist, ob sich der Aufwand lohnen würde. Bisher hielt sich das Feedback zum meine Projekt sehr in Grenzen. Ich weiss, dass ich damit nicht alleine stehe, sondern das das ein allgemeines Problem ist. Aber da fängt man eben an, sich Fragen über Nutzen und Aufwand zu stellen.

Grundsätzlich wird unter Windows doch die Tastaturabfrage über GetAsyncKeyState empfohlen und z.B. von der Nutzung von DirectInput für die Tastatur abgeraten. Die Frage wäre für mich, wie SDL das unter Windows bewerkstelligt.

Interessant für mich zu lesen war, dass z.B. auch viele Soundlibs unter anderem auch OpenAL unter Windows DirectX (DirectSound) verwenden. Oder liege ich da falsch?

Ich hoffe, das kommt jetzt nicht falsch rüber. Bin für Verbesserungsvorschläge immer sehr dankbar, und investiere auch gerne viel Zeit dafür (siehe meine verschiedenen Ansätze zur Joystick-Abfrage: HID, DirectInput und SDL).

Viele Grüße


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: So Okt 21, 2012 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
SDL kann dir auch den Unicode-Codepoint geben. Dazu musst du SDL_enableUNICODE bei der initialisierung aufrufen. Dann bekommst du im SDL-Event-Struct den Codepoint in einem attribut, aber frag mich gerade nicht nach dessen namen.

@Soundlibs: Die meisten Soundbibliotheken sind nur Abstraktionsschichten über dem betriebssystemspezifischen Zeug. Ist also ganz normal dass die unter Windows DirectSound und unter Linux halt Pulseaudio/Alsa/OSS/… verwenden.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: New Sga Project
BeitragVerfasst: Sa Nov 24, 2012 18:05 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Apr 13, 2011 22:05
Beiträge: 215
Programmiersprache: Lazarus/FPC
Ich habs jetzt auch endlich mal angespielt und muss sagen das es mir sehr gefällt, auch wenns recht einfach gehalten ist. Ich steh auf Old-School-Spiele. Bin sogar bei den ersten recht einfachen levels n'paar mal gescheitert weil man sich denkt das geht eh so leicht und dann passt man einmal nicht auf und schon bin ich von einem Diamanten erschlagen worden :mrgreen:
Klasse, auf jeden Fall: Weiter so!

_________________
Ich teile manchmal heimlich durch Null. - Alber Einstein


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 22 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Sonstiges » Meinungen zu den Projekten


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.025s | 15 Queries | GZIP : On ]