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.
Si desidera ** accedere alla RAM grafica ** o solo ottenere ** quantità di RAM ** sulla scheda grafica? – atzz
Voglio solo la quantità di RAM grafica. – amritad