2009-12-08 23 views
5

Tôi muốn nhận RAM bộ nhớ RAM hoặc RAM đồ họa mà bạn có thể thấy trong Cài đặt hiển thị hoặc Trình quản lý thiết bị sử dụng API. Tôi đang ở trong ứng dụng C++.API để lấy bộ nhớ đồ họa hoặc video

Tôi đã thử dò tìm trên mạng và theo RnD tôi đã đi đến kết luận rằng chúng tôi có thể lấy thông tin bộ nhớ đồ họa từ 1. Cấu trúc DirectX SDK được gọi là DXGI_ADAPTER_DESC. Nhưng nếu tôi không muốn sử dụng API DirectX. 2. Win32_videocontroller: Nhưng lớp này không phải lúc nào cũng cung cấp cho bạn thông tin về bộ điều hợp nếu có sẵn bộ điều khiển video. Tôi đã kiểm tra nó trên vista.

Có cách nào khác để có RAM đồ họa không?

+0

Bạn có muốn ** truy cập RAM đồ họa ** hoặc chỉ nhận được ** lượng RAM ** trên bộ điều hợp đồ họa không? – atzz

+0

Chỉ muốn lượng RAM đồ họa. – amritad

Trả lời

3

Không có cách nào để trực tiếp nhận RAM đồ họa trên cửa sổ, cửa sổ ngăn bạn thực hiện việc này vì nó duy trì quyền kiểm soát nội dung được hiển thị.

Bạn CÓ THỂ, tuy nhiên, hãy tạo thiết bị DirectX. Lấy bề mặt đệm sau và khóa lại. Sau khi khóa bạn có thể điền nó với bất cứ điều gì bạn muốn và sau đó mở khóa và gọi hiện tại. Điều này là chậm, tuy nhiên, khi bạn phải sao chép bộ nhớ video trở lại trên xe buýt vào bộ nhớ chính. Một số thẻ cũng sử dụng các định dạng "bị xáo trộn" mà nó phải bỏ đi khi nó sao chép. Điều này cho biết thêm thời gian để làm điều đó và một số thẻ thậm chí sẽ cấm bạn làm điều đó.

Nói chung, bạn muốn tránh truy cập trực tiếp vào thẻ video và để cửa sổ/DirectX thực hiện bản vẽ cho bạn. Dưới D3D1x Im 'khá chắc chắn bạn có thể làm điều đó thông qua một IDXGIOutput mặc dù. Nó thực sự là một cái gì đó để thử và tránh mặc dù ...

Bạn có thể ghi vào một mảng tuyến tính thông qua tiêu chuẩn win32 (Ví dụ này giả định C) nhưng nó khá tham gia.

Trước tiên, bạn cần mảng tuyến tính.

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

Sau đó, bạn cần tạo bitmap và chọn bitmap đó vào DC.

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

Sau đó, bạn có thể điền vào mảng pBits như bạn muốn. Khi bạn đã hoàn thành, bạn có thể thiết lập bit bitmap.

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

Khi bạn hoàn tất việc sử dụng bitmap, đừng quên xóa nó (Sử dụng DeleteObject) VÀ giải phóng mảng tuyến tính của bạn!

Chỉnh sửa: Chỉ có một cách đáng tin cậy để nhận được ram video và đó là đi qua các giao diện DX Diag. Hãy xem IDxDiagProviderIDxDiagContainer trong DX SDK.

+0

Các liên kết hiện đang bị hỏng (ít nhất không trực tiếp dẫn đến những gì chúng được cho là). – Ruslan

1

Chủ đề chế độ người dùng không thể truy cập vùng nhớ và I/O được ánh xạ từ thiết bị phần cứng, bao gồm bộ đệm khung. Dù sao, những gì bạn sẽ muốn làm điều đó? Giả sử trường hợp bạn có thể truy cập trực tiếp framebuffer: bây giờ bạn phải xử lý rất nhiều định dạng pixel có thể có trong bộ đệm khung. Bạn có thể giả định một tổ chức RGBA hoặc ARGB 32 bit. Có khả năng hiển thị 15/16/24 bit (RGBA555, RGBA5551, RGBA4444, RGBA565, RGBA888 ...). Đó là nếu bạn không muốn cũng hỗ trợ các định dạng bề mặt video (lớp phủ) chẳng hạn như dựa trên YUV.

Vì vậy, hãy để trình điều khiển hiển thị và/hoặc các API lân cận thực hiện nỗ lực đó.

Nếu bạn muốn ghi vào bề mặt hiển thị (không bằng chính xác với bộ nhớ khung hình, gần như khái niệm gần như giống nhau) có rất nhiều tùy chọn. DX, Win32, hoặc bạn có thể thử thư viện SDL (libsdl).

2

Win32_videocontroller là khóa học tốt nhất của bạn để nhận được số lượng bộ nhớ gfx. Đó là cách nó được thực hiện trong nguồn Doom3.

Bạn nói "..trạng thái của bộ điều khiển video đang ngoại tuyến. Tôi đã kiểm tra nó trên vista." Trong trường hợp nào thì bộ điều khiển video sẽ ngoại tuyến?

Ngẫu nhiên, you can find the Doom3 source here. Chức năng bạn đang tìm kiếm được gọi là Sys_GetVideoRam và nó nằm trong một tệp có tên là win_shared.cpp, mặc dù nếu bạn thực hiện tìm kiếm rộng, giải pháp nó sẽ bật lên cho bạn.

Các vấn đề liên quan