[DX9] Keine VRAM-Auslastung ?!

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Burstnibbler
Beiträge: 58
Registriert: 04.10.2008 12:10

[DX9] Keine VRAM-Auslastung ?!

Beitrag von Burstnibbler »

Hallo mal wieder,

Wenn ich nachfolgenden Code mit "Directx7" kompiliere, dann stimmt die VRAM-Auslastung nahezu mit der errechneten Auslastung (~15 MB) überein.
Wenn ich den Code aber mit dem nativen DX9 kompiliere, dann erhalte ich eine VRAM-Auslastung von 0 Bytes.
Interessant ist dabei auch, dass die RAM-Auslastung unter DX9 bei 34 MB liegt, während sie unter "Directx7" bei nachvollziehbaren 4 MB rumdümpelt.

VRAM-Code:

Code: Alles auswählen

;WinXP Pro (x86), PB 4.41 (x86), PB 4.50 Demo (x86) 
EnableExplicit

Define.i Loop
Define.i VRAM_1, VRAM_2, SPR_MEM

InitSprite()
OpenWindow(0,0,0,400,200,"Test",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0),0,0,400,200,0,0,0)

VRAM_1 = AvailableScreenMemory()

For Loop = 0 To 99
  CreateSprite(Loop,200,200,0)
Next

VRAM_2  = AvailableScreenMemory()
SPR_MEM = 100 * (200*200*4); für 32Bit Sprites

Repeat
  ClearScreen(0)
  StartDrawing(ScreenOutput())
    DrawText(0, 0,"VRAM 1: "+Str(VRAM_1)+" Bytes")
    DrawText(0,20,"VRAM 2: "+Str(VRAM_2)+" Bytes")
    DrawText(0,40,"VRAM   : "+Str(VRAM_1 - AvailableScreenMemory())+" / ~ "+Str(SPR_MEM)+" Bytes")
  StopDrawing()
  FlipBuffers()
Until WaitWindowEvent(1000) = #PB_Event_CloseWindow
End

Und noch der RAM-Code:

Code: Alles auswählen

;WinXP Pro (x86), PB 4.41 (x86)
EnableExplicit
;
Structure PROCESS_MEMORY_COUNTERS
  cb.l
  PageFaultCount.l
  PeakWorkingSetSize.l
  WorkingSetSize.l
  QuotaPeakPagedPoolUsage.l
  QuotaPagedPoolUsage.l
  QuotaPeakNonPagedPoolUsage.l
  QuotaNonPagedPoolUsage.l
  PagefileUsage.l
  PeakPagefileUsage.l
EndStructure
;
Define.i Loop, hProcess, RAM_1
Define Pmc.PROCESS_MEMORY_COUNTERS
Prototype.i Proto_GPMI(hProcess, *ppsmemCounters, cb.l)
;
If (Not OpenLibrary(0,"Psapi.dll")) : End : EndIf ; MSDN sagt: "Kernel32.dll" für Win7 & Windows Server 2008 R2
Global GetProcessMemoryInfo_.Proto_GPMI=GetFunction(0,"GetProcessMemoryInfo")
If (Not GetProcessMemoryInfo_) : CloseLibrary(0) : End : EndIf
hProcess = GetCurrentProcess_()
If (Not hProcess) : CloseLibrary(0) : End : EndIf
;
InitSprite()
OpenWindow(0,0,0,400,100,"Test",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0),0,0,400,100,0,0,0)
;
For Loop = 0 To 99
  CreateSprite(Loop,200,200,0)
Next
;
Repeat
  GetProcessMemoryInfo_(hProcess, @Pmc, SizeOf(Pmc))
  RAM_1 = Pmc\WorkingSetSize
  ClearScreen(0)
  StartDrawing(ScreenOutput())
    DrawText(0,20,"RAM-Last : "+Str(RAM_1)+" Bytes   ("+Str((RAM_1 / Pow(1024,2)))+" MB)")
  StopDrawing()
  FlipBuffers()
Until WaitWindowEvent(1000) = #PB_Event_CloseWindow
CloseLibrary(0)
End
;

Und nun zu meiner Frage:
Kann das jemand bestätigen und/oder mir erklären woran das liegt ?

MfG,
Burstnibbler

Edit: RAM-Code umgestellt auf ProcessMemoryInfo (genauere Ergebnisse)
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Re: [DX9] Keine VRAM-Auslastung ?!

Beitrag von Thorium »

Das liegt daran das die Sprites bei DirectX9 nicht auf der Grafikkarte liegen. DirectX9 hat keine 2D API mehr, es muss Direct3D verwand werden, möchte man die Grafikkartenbeschleunigung bei 2D nutzen. PureBasic hat dafür die Sprite3D Befehle. Ein Sprite3D ist ein Polygon, welchen als Textur ein Sprite verwendet.

Schau in der Hilfe man unter Sprite3D, ist in der Übersicht direkt unter "Sprite & Screen" bei "2D Games & Multimedia Libraries"
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Burstnibbler
Beiträge: 58
Registriert: 04.10.2008 12:10

Re: [DX9] Keine VRAM-Auslastung ?!

Beitrag von Burstnibbler »

Hallo Thorium,

vielen Dank für deine Erklärung ! :allright:
Jetzt weis ich immerhin schon mal, warum der VRAM leer bleibt.

Gibt es für das andere "Phänomen" eigentlich auch einen plausiblen Grund?
Weil, irgendwie verstehe ich nicht warum die RAM-Auslastung bei meinem Beispiel unter DX9 so hoch ist.
Also rein rechnerisch müsste sie doch bei ca. 19 MB (15 MB Spritedaten + 4 MB Programm) liegen,
aber angezeigt werden 34 MB (15 MB Spritedaten + 15 MB ??? + 4 MB Programm).
Kann es sein, dass die Spritedaten 2 mal ins RAM geschrieben werden ?

MfG,
Burstnibbler
Antworten