2009-12-08 12 views
5

Desidero ottenere la RAM adpater o la RAM grafica che è possibile visualizzare in Impostazioni visualizzazione o Gestione dispositivi tramite API. Sono in applicazione C++.API per ottenere la memoria grafica o video

ho cercato seraching sulla rete e come per la mia RnD sono giunto alla conclusione che siamo in grado di ottenere le informazioni di memoria grafica da 1. Struttura DirectX SDK chiamato DXGI_ADAPTER_DESC. Ma cosa succede se non voglio usare le API DirectX. 2. Win32_VideoController: Ma questa classe non sempre ti danno adapterRAM informazioni se la disponibilità del controller video è collegato. L'ho controllato su Vista.

C'è un altro modo per ottenere la RAM grafica?

+0

Si desidera ** accedere alla RAM grafica ** o solo ottenere ** quantità di RAM ** sulla scheda grafica? – atzz

+0

Voglio solo la quantità di RAM grafica. – amritad

risposta

3

Non c'è alcun modo per ottenere direttamente la RAM grafica su Windows, Windows impedisce di fare ciò in quanto mantiene il controllo su ciò che viene visualizzato.

È possibile, tuttavia, creare un dispositivo DirectX. Prendi la superficie del buffer posteriore e poi bloccala. Dopo averlo bloccato puoi riempirlo con quello che vuoi e poi sbloccare e chiamare il presente. Questo è lento, tuttavia, poiché è necessario copiare la memoria video sul bus nella memoria principale. Alcune carte usano anche i formati "swizzled" che deve srotolare mentre copia. Questo aggiunge ulteriore tempo per farlo e alcune carte ti vietano addirittura di farlo.

In generale, si desidera evitare l'accesso diretto alla scheda video e lasciare che Windows/DirectX facciano il disegno per voi. Sotto D3D1x sono abbastanza sicuro di poterlo fare tramite IDXGIOutput. È davvero qualcosa da cercare di evitare però ...

È possibile scrivere su un array lineare tramite standard win32 (Questo esempio assume C) ma è piuttosto coinvolto.

In primo luogo è necessario l'array lineare.

unsigned int* pBits = malloc(width * height); 

Quindi è necessario creare una bitmap e selezionarla sul controller di dominio.

HBITMAP hBitmap = ::CreateBitmap(width, height, 1, 32, NULL); 
    SelectObject(hDC, (HGDIOBJ)hBitmap); 

È quindi possibile riempire l'array pBits come si desidera. Quando hai finito puoi quindi impostare i bit della bitmap.

::SetBitmapBits(hBitmap, width * height * 4, (void*)pBits) 

Quando hai finito di usare la tua bitmap non dimenticarti di eliminarlo (Usando DeleteObject) E libera il tuo array lineare!

Modifica: C'è solo un modo per ottenere in modo affidabile la RAM video e cioè passare attraverso le interfacce DX Diag. Date un'occhiata a IDxDiagProvider e IDxDiagContainer nel DX SDK.

+0

I collegamenti sono ora interrotti (almeno non portano direttamente a ciò che dovrebbero). – Ruslan

1

I thread in modalità utente non possono accedere alle aree di memoria e agli I/O mappati dai dispositivi hardware, incluso il framebuffer. Ad ogni modo, cosa vorresti fare? Supponiamo che il caso si può accedere direttamente al framebuffer: ora è necessario gestire un sacco di possibili formati di pixel nel framebuffer. È possibile assumere un'organizzazione RGBA o ARGB a 32 bit. Esiste la possibilità di schermi 15/16/24-bit (RGBA555, RGBA5551, RGBA4444, RGBA565, RGBA888 ...). Questo se non vuoi supportare anche i formati di superficie video (overlay) come quelli basati su YUV.

Quindi, fare in modo che il driver dello schermo e/o le API sottostanti facciano lo stesso.

Se si desidera scrivere su una superficie di visualizzazione (che non corrisponde esattamente alla memoria del framebuffer, nonostante sia concettualmente quasi la stessa) ci sono molte opzioni. DX, Win32, oppure puoi provare la libreria SDL (libsdl).

2

Win32_videocontroller è la soluzione migliore per ottenere la quantità di memoria gfx. Ecco come è fatto in Doom3.

Si dice "..disponibilità del controller video è offline.Ho controllato su Vista." In quali circostanze il controller video sarà offline?

Per inciso, you can find the Doom3 source here. La funzione che stai cercando si chiama Sys_GetVideoRam e si trova in un file chiamato win_shared.cpp, anche se se esegui una ricerca a livello di soluzione, verrà attivata automaticamente.

Problemi correlati