Partikel Optimierung -> OpenGL

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

Seven

Betreff: Partikel Optimierung -> OpenGL

BeitragMo, Mai 14, 2012 21:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Abend. Mir war gerade langweilig und da fiel mir ein kleines Programm ein,
das ich vor kurzem schrieb und wie ich die Ausbeute maximieren könnte.

Nun setzte ich mich daran und schmiss alles raus, was allzu wichtig war
und dabei ist das rausgekommen:

BlitzMax: [AUSKLAPPEN]

SuperStrict
Global RX:Byte, RY:Byte
RX = 255
RY = 255
Graphics RX,RY
SeedRnd MilliSecs()
Global shots:TList = New TList
Global ShotCounter:Short
Type TShot
Field X:Byte
Field Y:Byte
Method New:TShot()
ShotCounter = ShotCounter + 1
EndMethod
End Type
Global Shot:TShot

SetColor 255,255,255
While Not KeyHit(key_escape)
Cls
If MouseHit(1) Then
For Local i:Short = 0 To 999
Shoot()
Next
EndIf
Rest()
DrawText ShotCounter, 5, 5
Flip 0
Wend
End
Function Shoot()
Shot:TShot = New TShot
ListAddLast(shots, Shot)
Shot.X = MouseX()
Shot.Y = MouseY()
End Function

Function Rest()
For Shot:TShot = EachIn shots
Plot Shot.X, Shot.Y
Shot.X = Shot.X + Rand(-5, 5)
Shot.Y = Shot.Y + Rand(-5, 5)
Next
EndFunction


Selbst die FPS Anzeige habe ich rausgeschmissen und lasse diese nun extern anzeigen.

Hat jmd. eine Idee, was man noch machen könnte?
Und wie steht es sonnst mit Partikel Systemen in Blitzmax?
Gibs da noch welche, mit dennen man deutlich mehr auf den Bildschirm bekommt,
als mit dem?
  • Zuletzt bearbeitet von Seven am Sa, Mai 26, 2012 20:11, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragMo, Mai 14, 2012 21:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Was soll denn Sinn der Übung sein?
Du könntest es etwas mehr Objektorientierter angehen und alles nötige in den TShot Type packen. Ist Hübscher und wiederverwendbarer.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Seven

BeitragMo, Mai 14, 2012 21:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Zweck... ich will sehen, wie viel man raushohlen kann.

Ich habe nähmlich etwas ähnliches in BlitzBasic gemacht und da waren nur
ca. 1.000 möglich. Mit dem hier komme ich auf ca. 28.000 und ich will
sehen, wie weit sich das noch steigern lässt. Einfach, weil ichs kann ^^

Ich denke, ich werde das auch noch auf anderen Rechnern ausprobieren, da ich gerade nur
am Laptop sitze.

Ahja und hier die Objektorientierte Version:
BlitzMax: [AUSKLAPPEN]

SuperStrict
Global RX:Byte, RY:Byte
RX = 255
RY = 255
Graphics RX,RY
SeedRnd MilliSecs()
Global shots:TList = New TList
Global ShotCounter:Short
Type TShot
Field X:Byte
Field Y:Byte
Function Shoot()
Shot:TShot = New TShot
ListAddLast(shots, Shot)
Shot.X = MouseX()
Shot.Y = MouseY()
End Function
Method New:TShot()
ShotCounter = ShotCounter + 1
EndMethod
Function Rest()
For Shot:TShot = EachIn shots
Plot Shot.X, Shot.Y
Shot.X = Shot.X + Rand(-5, 5)
Shot.Y = Shot.Y + Rand(-5, 5)
Next
EndFunction
End Type
Global Shot:TShot = New TShot
ListAddLast(shots, Shot)

SetColor 255,255,255
While Not KeyHit(key_escape)
Cls
If MouseHit(1) Then
For Local i:Short = 0 To 999
Shot.Shoot()
Next
EndIf
Shot.Rest()
DrawText ShotCounter, 5, 5
Flip 0
Wend
End
 

Matthias

BeitragDi, Mai 15, 2012 16:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hay.

Dein Beispiel sagt nichts darüber aus wozu BlitzMax+OpenGL fähig ist.

Am schnellsten wäre es wenn du direkt mit OpenGL arbeiten würdest.

Außerdem nimmt mann für Partilkel nicht einzelne Punkte. Schneller wären Quads(Triangles) mit Texture auf den dann viele Punkte sind.

Noch schneller würde es über Shader gehen. Allerdings setzt das viel können voraus.

Tipp. BlitzMax wird umso schneller je mehr du kannst (lernst). Laughing
http://wiki.delphigl.com/index.php/glBegin

in Blitz3D:
https://www.blitzforum.de/foru...t=partikel

ZEVS

BeitragDi, Mai 15, 2012 16:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Ebenso kannst du das Listen-Prinzip optimieren, indem du einfach zu jedem TShot den nächsten (TShot.succ) speicherst und so auf die Liste verzichtest.
Die Zufallszahlen sind auch nicht optimal. Chaos.Random ist hier schneller.

ZEVS
 

Seven

BeitragDi, Mai 15, 2012 16:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Direkt über die Shader wäre schon was, aber ich dachte das geht nur per CUDA/APP/OpenCL/DirectCompute.
Ist BlitzMax wirklich dazu fähig? o.O

Ist OpenGL auch mit Windows schneller, als DirectX? Ich hörte es wäre nicht so, aber
ich werde es ausprobieren.

Um die Punkte direkt geht es ja nicht. Ich wollte es nur visualisieren und ich habe
durch rumprobieren gemerkt, dass das Zeichnen wirklich das langsamste ist.
Das wird wohl niemanden überraschen, aber ich persöhnlich dachte, es wäre das
durchgehen jedes Objektes durch "EachIn".
Einen Test später das Ergebnis; Während ich mit dem Zeichnen ca. 28.000 Punkte/Partikel
bekomme (30 fps) sind es ohne fast 200.000 Very Happy

Ich werde mich jetzt mal an die Quads bzw. an OpenGL setzen. Danke für die Antwort Very Happy

EDIT: Ich sehe grade; Dein Wiki Link ist perfekt Shocked

Propellator

BeitragDi, Mai 15, 2012 17:14
Antworten mit Zitat
Benutzer-Profile anzeigen
OpenGL Performance ist von der Grafikkarte bzw. den Treibern abhängig.
Shader werden in Shadersprachen wie GLSL, HLSL und Cg geschrieben, und gehen problemlos in BlitzMax.
Beispiel Schwarzweiss-Shader vom BPS mit Max2D: Klick!
Propellator - Alles andere ist irrelephant.
Elefanten sind die Könige der Antarktis.
 

Seven

BeitragDi, Mai 15, 2012 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
wow, das erstaunt mich doch sehr und scheint auch weit über meinen Fähigkeiten
zu liegen (ich habe z.B. noch nie was von GLSL, HLSL oder Cg gehört)
, aber zumindest habe ich für die nächste Zeit etwas zu tun^^

Noobody

BeitragDi, Mai 15, 2012 18:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Matthias hat Folgendes geschrieben:
Außerdem nimmt mann für Partilkel nicht einzelne Punkte. Schneller wären Quads(Triangles) mit Texture auf den dann viele Punkte sind.

Das mag sogar mit Max2D stimmen, aber mit OpenGL erst recht nicht. Polygone am Band raushauen geht für die Grafikkarte ohne Probleme, aber für viele Partikel jeweils noch eine halbwegs grosse Textur verwenden wird dann schon teuer - Speicherbandbreite ist begrenzt und Texturcaches klein.
Zudem noch, dass auf der Textur mit Punkten vermutlich der Grossteil leer ist, was einem die Fillrate in den Himmel treibt, ohne dass man tatsächlich viele Partikel malt.

Wenn man dann noch vorhat, diese Textur mit Punkten zu verändern (um die Punkte darauf zu verschieben oder sonstige Spässe), wird es erst richtig teuer, da man die veränderte Textur jeweils wieder in den Grafikspeicher übertragen muss (immerhin ein vergleichsweise schneller DMA, aber trotzdem).

Matthias hat Folgendes geschrieben:
Noch schneller würde es über Shader gehen. Allerdings setzt das viel können voraus.

Wenn du nicht grade in einem Fragment Shader Partikel einzeln beleuchtest oder Partikelbewegung in einem Transform Feedback berechnest, bringen Shader überhaupt nichts.

Matthias hat Folgendes geschrieben:
Tipp. BlitzMax wird umso schneller je mehr du kannst (lernst). Laughing
http://wiki.delphigl.com/index.php/glBegin

Schon besser! Allerdings ist glBegin auch ziemlich langsam, da du zum einen pro Vertex (!) zig Funktionsaufrufe hast und diese auch einzeln gesammelt und an die Grafikkarte geschickt werden müssen.
Definitiv die einfachste Möglichkeit, ein wenig Performance herauszuholen, aber leider noch nicht die schnellste.

@ZEVS: Exakt. Wenn der Grafikteil schnell genug ist und der Flaschenhals bei der CPU liegt, wäre das ein guter Startpunkt, um den CPU-Teil zu optimieren.

Seven hat Folgendes geschrieben:
Direkt über die Shader wäre schon was, aber ich dachte das geht nur per CUDA/APP/OpenCL/DirectCompute.
Ist BlitzMax wirklich dazu fähig? o.O

CUDA/OpenCL etc. sind nicht mehr Shader, sondern schon GPGPU-Programmiersprachen für komplexere GPU-Programmierung. Für OpenGL-Shader brauchst du nur GLSL, welches BMax durchaus beherrscht.

Seven hat Folgendes geschrieben:
Ist OpenGL auch mit Windows schneller, als DirectX? Ich hörte es wäre nicht so, aber
ich werde es ausprobieren.

Das kommt seeehr drauf an Razz Mit guten Treibern kann OpenGL schneller sein als DirectX, wenn man bei beiden die Grenzen ausreizt. Grund dafür ist, dass DirectX sehr strenge Anforderungen an Grafikkarten und deren Treiber stellt, die es dem Treiber schwierig machen, selber Optimierungen vorzunehmen.
OpenGL hingegen lässt viele Implementierungsdetails offen, so dass der Treiber selber entscheiden kann, wie er tatsächlich mit OGL-Befehlen umgeht. Das führt aber dazu, dass man einige Tricks kennen muss, um auch wirklich volle Performance aus OpenGL herauszuholen, damit die Treiberoptimierungen auch angewendet werden können. Nvidia zum Beispiel hat eine sehr grosse Dokumentationsbasis, die beschreibt, wie man dem Treiber die Optimierung erleichtern kann.

Bei schlechten Treibern aber hilft auch der beste Programmierer nichts. Auf alten ATI-Treibern kann man von Glück sprechen, wenn OGL überhaupt läuft Razz


Aber zu deinem ursprünglichen Problem: Wenn du wirklich das beste herausholen willst, gibt es verschiedene Stufen der Optimierung:

Steck deine Partikel in einen grossen VBO, setze die entsprechenden usage patterns, mappe ihn als write-only (was in den meisten Fällen einen DMA ermöglicht), übetrag deine Partikeldaten und überflieg bei Gelegenheit die Nvidia-Artikel über VBOs, die meistens sehr aufschlussreich sind.

Falls deine Partikel sich bewegen, hast du mehrere Möglichkeiten:

1. Optimiere deine CPU-Routinen so weit wie möglich, verwirf den alten VBO in jedem Frame (glBufferData mit NULL für die Daten und alle anderen Parameter gleich wie beim ersten Aufruf), mappe den VBO neu und übertrag die Daten.

2. (jetzt wirds schwierig) Setze Events (quasi OpenGL instruction fences) in die Kommandoschlange, warte darauf, dass dein VBO fertig gerendert hat und fang dann an, einzelne Partikelblöcke von der CPU aus neu zu berechnen und diese dann asynchron in den VBO zu schreiben (wieder mit Events). Damit erlaubst du paralleles Berechnen, Übertragen und Rendern der Partikel.
Ziemlich cool, aber ziemlich gefährlich, da man sich durchaus Programm bis Treiber abschiessen kann, wenn man asynchron in einen Block schreibt, der auf der GPU in verwendung ist Razz

3. (jetzt wirds schwieriger) Verzichte auf Partikelberechnung auf der CPU und verschiebe die Logik stattdessen in einen Vertexshader und aktiviere transform feedback (braucht aber schon eine relativ neue Grafikkarte). Damit brauchst du keine langsamen Speichertransfers zwischen CPU und GPU mehr, vernichtest den CPU-Flaschenhals und erlaubst zudem der Grafikkarte, selber Optimierungen vorzunehmen.

Wenn du also viel Zeit hast und wirklich viel Partikel rendern willst, kannst du ja mal ein wenig damit herumspielen. Man lernt dabei, OpenGL zu hasse---- ööööh, zu benutzen, was immer spassig ist, wenn man Grafikprogrammierung interessant findet.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun
 

Seven

BeitragDi, Mai 15, 2012 18:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh mein Gott , was für eine ausführliche Antwort Very Happy

Ich muss grade zugeben, dass ich ZEVS's Beitrag übersehen habe...
Gleich mal Vorschlag mit reinbauen, auch wenn das zeichnen den Flaschenhals darstellt.

Alsooo, ich muss sagen, dass ich leider die 2. hälfte deines Posts intensiv nachgooglen muss^^
Zur OpenGL Karte muss ich sagen, dass in meinem Laptop eine ATI 5850M (also wenn man 2 Generationen
abziehen würde, wäre die Karte sehr aktuell Smile ) und mein PC hat eine 560 Ti; Das auch nur eine
der Karte speziell auf OpenGL ausgelegt ist, habe ich noch nie gehört^^

Naja, zurück zum alten Thema; Ich werde deine Schritte versuchen umzusetzen. Mir stellt sich aber jetzt
die Frage, was den die CPU in Blitzmax macht und was die GPU.
Was bringt der "Threaded Build"? Ich las, damit wird Multithreating eingebaut, aber stimmt das wirklich
und wie viele Kerne können benutzt werden?

Danke für die Antwort Very Happy

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group