từ những gì tôi đã đọc here có vẻ như hầu hết các chức năng GDI của Windows đều được tăng tốc. Vì vậy, ví dụ: gọi tới BitBlt
hoặc AlphaBlend
sử dụng tăng tốc phần cứng nếu có. Nó cũng đề cập rằng nội dung của một cửa sổ được giữ chỉ trong bộ nhớ video. Bây giờ điều này là tốt và đúng cho một cửa sổ DC, nhưng làm cách nào tôi có thể sử dụng bộ nhớ DC nằm trong bộ nhớ thẻ video? Và một khi chúng tôi đã hoàn thành cách truy cập trực tiếp vào các điểm ảnh, tôi nghĩ điều đó sẽ liên quan đến 1. tạm thời sao chép dữ liệu vào bộ nhớ hệ thống 2. thay đổi dữ liệu pixel 3. sao chép lại vào bộ nhớ video.CreateCompatibleBitmap và CreateDIBSection (Bộ nhớ DC)
Tôi đã thử hai cách tiếp cận, cả hai cấp phát bộ nhớ hệ thống như tôi có thể nhìn thấy trong công việc quản lý ...
CreateCompatibleBitmap
HDC hDC = GetDC(NULL); m_hDC = CreateCompatibleDC(hDC); m_hBmp = CreateCompatibleBitmap(hDC, cx, cy); ReleaseDC(NULL, hDC); m_hOldBmp = (HBITMAP)SelectObject(m_hDC, m_hBmp);
và sau đó gọi để có được các bit
GetBitmapBits(...)
theo các nhận xét khác nhau, điều này thực sự sẽ tạo bitmap tương thích trong bộ ghi video y, nhưng tại sao tôi vẫn có thể thấy sự gia tăng bộ nhớ hệ thống (ngay cả khi tôi không gọi
GetBitmapBits
)?CreateDIBSection
HDC hDC = GetDC(NULL); m_hDC = CreateCompatibleDC(hDC); BITMAPINFO bmi; memset(&bmi, 0, sizeof(BITMAPINFO)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = cx; bmi.bmiHeader.biHeight = -cy; // top-down bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; m_hBmp = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, (void**)&m_pBits, NULL, NULL); ReleaseDC(NULL, hDC); m_hOldBmp = (HBITMAP)SelectObject(m_hDC, m_hBmp);
trong trường hợp này chúng tôi nhận được con trỏ đến các bit ngay lập tức (
m_pBits
) do đó, nó rõ ràng rằng những cư trú trong bộ nhớ hệ thống ...
Hoặc là nó một sao chép được lưu giữ trong bộ nhớ hệ thống cho cả hai phương pháp? Nhưng nếu tôi thay đổi các bit trong bộ nhớ hệ thống, một cuộc gọi đến BitBlt
sẽ vẫn phải kiểm tra/sao chép từ bộ nhớ hệ thống một lần nữa ... không được tối ưu hóa rất nhiều IMHO.
EDIT: Tôi cũng đã thử tạo bộ nhớ DC bằng cách sử dụng BeginBufferedPaint
và GetBufferedPaintBits
. Nó phân bổ bộ nhớ hệ thống là tốt, vì vậy trong khía cạnh đó tôi cho rằng nó chỉ là một wrapper cho các phương pháp trên nhưng lưu trữ của DC để một cuộc gọi tiếp theo không nhất thiết phải tái tạo một bộ nhớ DC. Xem article của Raymond Chen.
EDIT # 2: Tôi đoán câu hỏi thực tế là: Tôi có đang tạo bộ nhớ DC đúng trong phương pháp 1 hoặc 2 để có các hoạt động GDI tăng tốc phần cứng không? Với tôi tất cả đều có vẻ nhanh, và cả hai phương pháp đều cung cấp cùng một tốc độ, do đó, không thực sự là một cách để kiểm tra ...
Tôi nghĩ rằng nó luôn nằm trong bộ nhớ hệ thống và chỉ được đổi thành bộ nhớ video khi được hiển thị ... – AJG85
Điều đó có nghĩa là chúng tôi không thể tạo bộ nhớ trong bộ nhớ video và chức năng GDI không tăng tốc phần cứng khi làm việc một bộ nhớ DC? – demorge
Các chức năng GDI chỉ dành cho các thao tác * blitting * là phần cứng được tăng tốc trên Windows 7 độc quyền. GDI + vẫn là phần mềm được hiển thị ngay cả trên Windows 7 và vẫn còn chậm hơn. Nếu bạn đang làm bất cứ điều gì phức tạp mà yêu cầu thực hiện câu trả lời đơn giản là không sử dụng GDI. Sử dụng OpenGL hoặc DirectX nếu bạn muốn truy cập trực tiếp vào phần cứng. GDI luôn là một trừu tượng. – AJG85