rendern mit gpu nutzen evtl dx

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
xdes
Beiträge: 57
Registriert: 13.08.2016 12:53

rendern mit gpu nutzen evtl dx

Beitrag von xdes »

hallo,
ich hoffe das ist hier richtig (bitte sonst verschieben )

aktuell weis ich nicht weiter (ich vermute ich nutze die falschen Google Begriffe).... und ich hoffe ihr könnt mir helfen...

ich habe ein kleines Script probiert(mehrer planes mesch´s laden und darstellen) und nun festgestellt das wenn ich 3d Objekte lade nur meine cpu ausgelastet wird (nur 1 kern)aber meine Grafikkarte nicht ...
ich vermute das deswegen auch die fps zusammen brechen( von ~5000 auf ~30 fps) nach ein paar mal die gleichen planes dargestellt (c.a. 5500 planes)

ich vermute dabei das die Grafik engien nur auf ein kern zugreift (glaube sowas mal angedeutet gelesen zu haben bei opengl) ich denke ich muss der 3d engein noch irgendwie erzählen das sie die Grafikkarte nutzen soll (die meistens bei ~1 % Belastung ist wenn ein cpu-kern ~100% ist während andere kerne bei ungefähr 1%liegen...)

dazu der code also die schleife wo so viel Leistung gefuttert wird:


Repeat
RenderWorld()
Delay(1)
FlipBuffers()
Until Quit = 1


(soory ein richtiges beenden ist noch nicht drin )

ich werde die Vermutung nicht los das ich die dx ich nen es mal anschalten muss weil ich in den Artikel (http://forums.purebasic.com/german/view ... =4&t=30217) mehrer Informationen daraus interpretiere... nur mehr als das habe ich auch nicht gefunden.... (auch nicht wie das gemacht worden ist)

so nun aber zu meiner eigentlichen frage kann mir wer ein tipp geben ( wenn möglich nicht vorsagen ( will ich es verstehen möchte...) aber son stups auf die richtige bahn ) weil ich denke für ein Projekt werde ich mehr als die planes brauchen von der Leistung her... und erhoffe mir von der Grafikkarte die Leistung...

vielen dank schon mal im voraus
xdes
Beiträge: 57
Registriert: 13.08.2016 12:53

Re: rendern mit gpu nutzen evtl dx

Beitrag von xdes »

so ich denke meine Vermutung sind heute .... (falsch Gewese) (aber ich versuche hier dar zustellen was mir nun noch an versuchen aufgekommen ist/was ich getestet habe fals wer anders das gleiche Problem hat oder so )

denn ich denke ich habe herausgefunden wie ich zwischen dx9 und opengl wechsel...
dank https://www.purebasic.com/documentation ... stems.html (Stichwort Subsysteme)

nun habe ich auch eine ogre.log (log Datei durch InitEngine3D(#PB_Engine3D_DebugLog ) )
die mir auch den wechsel zwischen dx9 und opengl darstellt (wenn ich den log richtig interpretiere)

leider läuft damit immer noch alles auf einem Kern (ich vermute das nur da der taskmanager 1 kern c.a. 100% und msi afterburner mir anzeigt das die Grafikkarten bei c.a. 1% liegt...)

zurzeit da mir nichts mehr einfehlt überlege ich ob mandas ganze nicht in mehrer Screen aufteilen kann oder ob ich anderes irgendwie sparsamer das ganze machen kann auch wenn ich es noch nicht aufgeben will ...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: rendern mit gpu nutzen evtl dx

Beitrag von NicTheQuick »

Zunächst mal läuft natürlich alles nur auf einem Kern, wenn du nicht selbst neue Threads erzeugst. Und da wir deinen Code nicht kennen, können wir dir hier eh nicht helfen. Gib uns ein Beispielcode, der bei dir und für deinen Geschmack eine zu hohe Auslastung hat, dann können wir mal schauen. Und solange du nur ein paar Planes darstellst, wird deine Grafikkarte kaum ausgelastet sein.
Bild
xdes
Beiträge: 57
Registriert: 13.08.2016 12:53

Re: rendern mit gpu nutzen evtl dx

Beitrag von xdes »

um den Code um den es gehen sollte schreibe ich dann wie im ersten post nochmal .... diesmal ergrenze ich noch die gesamte Datei drum herum

ich dachte das die fps schleife das wichtige sei...(die ich eigentlich am Anfang schrieb) ... da nix anderes zur gleichen zeit lauft (also kein andere tread) erlaube ich mir das drumherum auch ( ich hoffe das ist nicht schlimm)

den habe ich so in einer schleife laufen lassen um andere störungen aus schlissen zu können und ist auf das Minimum begrenzt (vorsicht das ende kann da nicht erreicht werden)

Repeat
RenderWorld()
Delay(1)
FlipBuffers()
Until Quit = 1

und ich erhalte c.a. 100% CPU last...


da der code da schon drin ist schreibe ich nochmal die gesamte Datei. Der schient zu gehen bis auf die fps halt

Code: Alles auswählen

 OpenWindow(0, 0, 0, 800, 600, "A screen in a window...")
  #RobotMesh=2
  #RobotTexture=3
  map_dir.s=".\map_files\"
  UseSQLiteDatabase()
  InitEngine3D(#PB_Engine3D_DebugLog )
  Add3DArchive("./tes map mesch", #PB_3DArchive_FileSystem)
  InitSprite()
  InitKeyboard()
  InitMouse()
  Parse3DScripts()
  OpenWindowedScreen(WindowID(0), 0, 0, 800, 600,0,0,0,#PB_Screen_NoSynchronization    )
  LoadMesh   (#RobotMesh   , "plane.mesh")
  LoadTexture(#RobotTexture, "clouds.jpg")
  TransformMesh(#RobotMesh, 1, 1, 1, 1, 1, 1, 0, 0, 0 )
  fu= CreateMaterial(#PB_Any, TextureID(#RobotTexture))
  If OpenDatabase(0, map_dir+"map.sqlite", "", "")
    If DatabaseQuery(0, "SELECT * FROM M1 WHERE  Typ=1")  
     While NextDatabaseRow(0)   ; alle Einträge durchlaufen
      z=GetDatabaseLong(0, 1)*2
      x=GetDatabaseLong(0, 3)*2
      y=0
      Repeat
        If x>=32
          y+3
          x=x-32
        EndIf
      Until x<=32      
      CreateEntity( #PB_Any, MeshID(#RobotMesh), MaterialID(fu) ,x,y,z)
     Wend
    EndIf
    FinishDatabaseQuery(0)
  EndIf
  DisableMaterialLighting(fu, 1)
  CreateLight(0, RGB(0,0,255), 100.0, 0, 0)
  SetLightColor(0, #PB_Light_SpecularColor, RGB(255, 0, 0))
  CreateCamera(0, 0, 0, 100, 100)
  MoveCamera(0, 0, 0, 500)
  CameraBackColor(0, RGB(0, 0, 128))
  Repeat      
    If ExamineKeyboard()
      If KeyboardPushed(#PB_Key_Up )
        cam+1
      EndIf
      If KeyboardPushed(#PB_Key_Down)
        cam-1
      EndIf
      If KeyboardPushed(#PB_Key_Left)
        cam_Y+1
      EndIf
      If KeyboardPushed(#PB_Key_Right)
        cam_Y-1
      EndIf
      If KeyboardPushed(#PB_Key_PageUp)
        ro+1
      EndIf
      If KeyboardPushed(#PB_Key_PageDown)
        ro-1
      EndIf
      If KeyboardPushed(#PB_Key_E)
        rota-1
      EndIf
      If KeyboardPushed(#PB_Key_D)
        rota+1
      EndIf
      If KeyboardPushed(#PB_Key_Escape)
        Quit = 1
      EndIf
    EndIf
    MoveCamera  (0, cam_Y, ro, cam)
    RotateCamera(0, rota, 0, 0 )
    If cam>0
      cam-1
    EndIf
    If cam<0
      cam+1
    EndIf  
    If cam_Y>0
      cam_Y-1
    EndIf
    If cam_Y<0
      cam_Y+1
    EndIf
    If ro>0
      ro-1
    EndIf
    If ro<0
      ro+1
    EndIf
    RenderWorld()
    Delay(1)
    FlipBuffers()
    Event = WindowEvent()
    If Event = #PB_Event_CloseWindow 
       Quit = 1
     EndIf
  Until Quit = 1
End

hir der code etwas zusammengestückelt

Code: Alles auswählen

 OpenWindow(0, 0, 0, 800, 600, "A screen in a window...")
  #RobotMesh=2
  #RobotTexture=3
  map_dir.s=".\map_files\"
  UseSQLiteDatabase()
  InitEngine3D(#PB_Engine3D_DebugLog )
  Add3DArchive("./tes map mesch", #PB_3DArchive_FileSystem)
  InitSprite()
  InitKeyboard()
  InitMouse()
  Parse3DScripts()
  OpenWindowedScreen(WindowID(0), 0, 0, 800, 600,0,0,0,#PB_Screen_NoSynchronization    )
  LoadMesh   (#RobotMesh   , "plane.mesh")
  LoadTexture(#RobotTexture, "clouds.jpg")
  TransformMesh(#RobotMesh, 1, 1, 1, 1, 1, 1, 0, 0, 0 )
  fu= CreateMaterial(#PB_Any, TextureID(#RobotTexture))
  If OpenDatabase(0, map_dir+"map.sqlite", "", "")
    If DatabaseQuery(0, "SELECT * FROM M1 WHERE  Typ=1")  
     While NextDatabaseRow(0)   ; alle Einträge durchlaufen
      z=GetDatabaseLong(0, 1)*2
      x=GetDatabaseLong(0, 3)*2
      y=0
      Repeat
        If x>=32
          y+3
          x=x-32
        EndIf
      Until x<=32      
      CreateEntity( #PB_Any, MeshID(#RobotMesh), MaterialID(fu) ,x,y,z)
     Wend
    EndIf
    FinishDatabaseQuery(0)
  EndIf
  DisableMaterialLighting(fu, 1)
  CreateLight(0, RGB(0,0,255), 100.0, 0, 0)
  SetLightColor(0, #PB_Light_SpecularColor, RGB(255, 0, 0))
  CreateCamera(0, 0, 0, 100, 100)
  MoveCamera(0, 0, 0, 500)
  CameraBackColor(0, RGB(0, 0, 128))
  Repeat      
    RenderWorld()
    Delay(1)
    FlipBuffers()
  Until Quit = 1
End
und hier noch mal der Code wo es langsam wird....

Code: Alles auswählen

  Repeat      
    RenderWorld()
    Delay(1)
    FlipBuffers()
  Until Quit = 1
ich hoffe das ist so wie du es meintest (sorry ich bin mir nicht sicher was du genau brauchst da ich ja den Code als beispiel der ich denke das problem ist schon geschrieben habe)...
(sorry wenn ich nicht so sprach gewandt bin ich hoffe das ist aber so oki )
xdes
Beiträge: 57
Registriert: 13.08.2016 12:53

Re: rendern mit gpu nutzen evtl dx

Beitrag von xdes »

durch das tauschen der mesh´s habe ich heraus gefunden beispiel Robot nehme anstat einer plane

ich die gleiche cpu last habe mit den gleichen fps mit höher GPU Auslastung (wenn mein test aussage kräftig ist würde mich freuen ob jemand sagen kann ob das auch bei anderen so ist)


jetzt ist nu meine frage wird anzahl der Entity durch die CPU(ein kern) begrenzt und die Komplexität durch die GPU ?

(ich hoffe das ist nicht schlimm das ich solche Anfänger fragen stelle...)
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: rendern mit gpu nutzen evtl dx

Beitrag von #NULL »

Ich weiß nicht ob das dein Problem behebt, aber du solltest pro main loop iteration alle events abarbeiten.
Dein erster code verarbeitet nur ein event pro frame, dein zweiter code gar keine events.
Beispiele findest du in der Hilfe zu OpenWindowedScreen(). Die 3D Beispiele machen das durch Aufruf von Screen3DEvents() die in Screen3DRequester.pb definiert ist.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: rendern mit gpu nutzen evtl dx

Beitrag von NicTheQuick »

Schlimm ist eher, dass deine Sätze kaum zu verstehen sind. Bist du tatsächlich Legastheniker oder gibst du dir nur keine Mühe? Und das zweite Problem ist, dass ich mit 3D eigentlich nichts am Hut hab.

Der Arbeitsspeicher deiner Grafikkarte enthält normalerweise alle Meshes, Texturen und Koordinaten der Instanzen, so grob gesagt. Dann rendert sie das alles um es auf dem Bildschirm auszugeben. Die CPU steuert die Position aller Instanzen und initial das Kopieren der Texturen und Meshes von der Festplatte zum Arbeitsspeicher und dann zum Grafikkartenspeicher. Wird die CPU auch noch dazu benutzt Physik zu berechnen, müssen die Meshes natürlich auch im Arbeitsspeicher vorliegen, damit sie damit arbeiten kann.
Bild
xdes
Beiträge: 57
Registriert: 13.08.2016 12:53

Re: rendern mit gpu nutzen evtl dx

Beitrag von xdes »

@ #NULL vielen dank. Ich dachte man sollte immer nur das überprüfen was man auch nutzt, auch wenn das was für dann ist wenn ich erstmal eine gute Performanz habe den sonst wird die schleife vermutlich noch langsamer ...

@NicTheQuick :angry: ich frage mich ob du nur trollen willst oder ähnliches ... weswegen ich dementsprechend reagiere werde ... ( Entity und Meshes so wie Texturen sind Unterschiedliche dinge....
und hir ein kleiner Auszug aus der Hilfe von pb
zitat:"Es ist möglich, ein Mesh oder ein Material jeweils bei mehreren Entities zu benutzen. Dies reduziert den Speicherverbrauch und notwendige CPU-Takte. "
da du die frage vermutlich nicht einmal richtig verstanden hast gehe ich davon aus das es keine Anfänger frage mehr ist )

@wieder an alle

hat wer ne Idee wie man die schleife sinnvoll auf mehrere kerne legt oder evtl so macht das sie schneller läuft... ?
(das delay soll die cpu entlasten und sie nicht auf 100% laufen lassen also soll es nicht weggelassenen werden auch wenn das delay zur zeit nicht wirklich was bringt ...)

Code: Alles auswählen

  Repeat      
    RenderWorld()
    Delay(1)
    FlipBuffers()
  Until Quit = 1
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: rendern mit gpu nutzen evtl dx

Beitrag von NicTheQuick »

xdes hat geschrieben:@NicTheQuick Entity und Meshes so wie Texturen sind Unterschiedliche dinge....
und hir ein kleiner Auszug aus der Hilfe von pb
zitat:"Es ist möglich, ein Mesh oder ein Material jeweils bei mehreren Entities zu benutzen. Dies reduziert den Speicherverbrauch und notwendige CPU-Takte. "
da du die frage vermutlich nicht einmal richtig verstanden hast gehe ich davon aus das es keine Anfänger frage mehr ist )
Nichts anderes habe ich gesagt. Bloß, dass ich Instanz statt Entity gesagt habe, was in dem Fall das selbe ist. Und Material ist natürlich der korrekte Begriff um die Oberfläche eines Meshes zu beschreiben, aber die Texturen selbst verbrauchen eben am meisten Speicherplatz.
Keine Ahnung, warum du mich als Troll siehst. Kann ich aber gerne zurück geben.

Du hast immer noch kein lauffähiges Beispiel gepostet. Nur irgendwas, was Daten aus einer Datenbank liest, die wir nicht besitzen und Dateien benutzt, die wir ebenfalls nicht besitzen. Hier haben die wenigsten Lust freiwillig deinen Code erst mal so umzubauen, dass er bei ihnen läuft.
Dennoch: Von einem Delay in der Ereignisschleife würde ich absehen. Versuche stattdessen mal die vertikale Synchronisation zu aktivieren. Dann sollte FlipBuffers() automatisch warten bis dein Bildschirm sich das nächste mal aufbaut und so CPU-Zeit sparen.
Bild
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Re: rendern mit gpu nutzen evtl dx

Beitrag von PMV »

Sehr löblich deine Bemühungen xdes, aber so wie sich deine Texte lesen hast du mit Grafiken dich noch gar nicht außeinander gesetzt, bzw. ist das dein erstes mal, oder?
Egal ob DirectX oder OpenGL, 3D-Grafik besteht nicht einfach nur aus ein paar Meshes, Texturen oder Materials und ein paar Lichtquellen hier und da. Das was dahinter steckt ist um ein vielfaches Komplexer, schon alleine deswegen, weil die Technik hinter dem Beschleunigen von 3D-Grafiken, also die Hardware Grafikkarte, nicht nur einfach Nullen und Einsen verarbeitet ... das soll dich aber jetzt nicht entmutigen, das muss man auch nicht im Detail wissen. Man sollte aber eine Ahnung davon haben, was da passiert. Dafür bin ich aber auch der falsche Ansprechpartner :yin-yang:

Zu deinem eigentlichen Problem: Die eingebaute PureBasic-OGRE3D-Engine kann schlicht nicht auf mehrere Threads ausgelagert werden. Das geht nicht mit DirectX9.0c weil es schlicht nicht vorgesehen ist und auch wenn ich das nie in Erwägung gezogen hab, das wird mit der OpenGL-Implementierung wohl auch nicht klappen. Doch selbst wenn DX11 zur Verfügung stünde, würden deine Beispiele nicht wirklich schneller laufen, weil du gar nix tust, was eine Grafikkarte belastet. Das deine Beispiel mit 100% Auslastung eines Kerns deiner CPU resultiert ist klar, das passiert bei jedem Loop der nicht ausgebremst wird :wink: Im Forum gibs ein paar pfiffige Beispiele, im englischen Forum noch mehr ... die ein paar interessante Dinge tun mit der eingebauten 3D-Engine.

Um die Grafikkarte nun ins Schwitzen bringen zu können sind spezielle "Tricks" nötig, die erst dazu führen, das die Grafikkarte tatsächlich aktiv wird. Eines davon sind die "StaticGeometry". Und OGRE bietet so ähnliches auch für bewegte bzw. animierte Objekte, leider unterstützt das PB aber leider immer noch nicht, somit gibs nicht viel, was da tun kannst außer mit dem Limit zu leben. Eine andere Sache sind im übrigen Shader, da müssteste dich auch Tief in die Materie einarbeiten, wenn du mit PureBasic-OGRE Grafikkarten zum schwitzen bringen willst. Beispiele dazu sind hier oder im englischem Forum zu finden.

Threads würde ich zu dem die Finger von lassen, so lange du überhaupt noch keine Erfahrungen mit OGRE3D hast und auch noch nix fertiges, das so funktioniert. Sonst wirst irgend wann auf unlösbare Probleme stoßen. Bringen tut dir das auch nur in so weit etwas, als dass du dann am Ende einen Thread für die Grafikverarbeitung verwenden kannst und andere für Spiellogik. In der Entwickung sollt das aber mit unter der letzte Schritt sein.

Wenn du mit PB lernen willst, wie man Spiele oder Grafiken verwendet, dann empfehle ich erst mal die 2D-Bibliothek. Und dich neben bei in der Zwischenzeit etwas mit 3D-Grafiken auseinander zu setzen. Ansonsten würd ich sagen, viel Spaß und Erfolg. <)

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten