Seite 1 von 1

[DX9] Keine VRAM-Auslastung ?!

Verfasst: 09.10.2010 01:56
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)

Re: [DX9] Keine VRAM-Auslastung ?!

Verfasst: 09.10.2010 12:14
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"

Re: [DX9] Keine VRAM-Auslastung ?!

Verfasst: 10.10.2010 15:42
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