簡體   English   中英

使用用戶分配的內存吸引到HDC

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM