[英]Draw to HDC with user allocated memory
我有一個無窗口的IViewObject對象。
我想調用其Draw函數以渲染到Opengl PBO內存中(或者OleDraw更簡單)。
現在,我首先使用CreateDIBSection (分配自己的內存)創建一個HBITMAP,然后從中復制到我的PBO內存中。 但是,我想避免多余的副本。 我認為這在理論上應該可行,因為映射的PBO位於頁鎖內存中。
這是我今天所做的簡化:
hdc = CreateCompatibleDC(nullptr); // Get current DC
HBITMAP bitmap = CreateDIBSection(... hdc, &bitmap_data_...); // Create Bitmap
SelectObject(hdc, bitmap);
m_spViewObject->Draw(... hdc ...); // IViewObject->Draw to bitmap
memcpy(pbo_ptr, bitmap_data_, size);
我的問題是,是否可以使用Draw函數以某種方式繪制到我指定的內存(在本例中為PBO),而不是win32 api(CreateDIBSection)分配的內存?
一種可能是是否可以根據用戶指定的內存創建設備獨立的位圖? 但是,我沒有找到執行此操作的功能。
您嘗試做的是非常合邏輯的恕我直言。 但是,不幸的是AFAIK沒有傳統的方法可以做到這一點。
根據WinAPI,DIB部分要么分配自己的內存,要么使用文件映射。 OTOH OpenGL以自己的方式管理其內存。 有一個選項可以從任何內存塊創建DIB,但這僅用於視頻驅動程序,用戶模式應用程序無法訪問。
實際上,避免這種額外復制的可能性非常大。 您可以創建一個虛擬視頻驅動程序(不要與鏡像視頻驅動程序混淆),獲取其HDC
。 然后以“自定義”方式告訴它應該繪制的位置(通過Escape
)。 然后,您可以將此HDC
傳遞給您想要繪制的任何內容,您的虛擬視頻驅動程序將直接在您想要的內存上繪制。
此外,要進行實際繪圖,您將能夠使用OS功能。 通過可識別GDI的位圖( EngCreateBitmap
)包裝內存,並使用OS( EngXXXX
)在內存上進行繪制,這樣您就只需在驅動程序中實現最少的功能。
但是,無論如何,這是驅動程序的發展。 我相信復制內存塊足夠快(與實際圖形相比),因此您可以將代碼保持原樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.