**:
為什麼有些書說視訊記憶體首位址為a00000,有的說再b8000?
顯示模式不同。
我記得b800是單色
a000是彩色(圖形?)
我想你是在dos下編寫吧:)
不同的顯示模式首位址不一樣
a000000l通常是0x13
b8000那是文字模式
如果是dos下編,注意以下幾點:
1。所有圖形方式中顯示緩衝區起始位址都是 a000:0000,即 0xa0000000
2。如果程式工作在保護模式,則起址應為 0xa0000;
3。顯示緩衝區長度永遠為 0xffff 位元組。
4。0x13h 以上的圖形模式中,超出的位元組應通過切換顯示頁(其實就是顯示卡上視訊記憶體中的
起始指標)實現。
5。直接顏色模式和間接顏色模式對記憶體的組織是不同的。
1.b800:0000是文字模式(如3模式)視訊記憶體起始位址
2.13模式以上通過修改顯示卡某個暫存器做頁面切換。
windows下不能直接訪問視訊記憶體,最接近的方法就是directx。
怎麼樣才能直接讀取視訊記憶體的內容?? 是用directx的directshow?還是direct draw?怎麼用呢?那個函式?
有沒有api可以直接杜視訊記憶體的?你去看看《深入 directx7.0 》,裡面有詳細介紹!
或者看msdn,directx是專門對硬體程式設計的!
用directdraw,建立primarysu***ce,然後lock之,就可以得到視訊記憶體位址,讀寫完後再unlock()。具體的有點複雜,一句兩句說不清,最好看書或參考msdn。
算了,還是給你**吧。
//初始化
hresult hret = directdrawcreateex( null, (void**)&m_pdirectdraw, iid_idirectdraw7, null );
if(hret != dd_ok)
// step 2: set the cooperative level
hret = m_pdirectdraw->setcooperativelevel(hwnd, ddscl_exclusive | ddscl_fullscreen);
// step 3:set display mode
hret = m_pdirectdraw->setdisplaymode( gameres_x, gameres_y, gamecolorbitdepth, 0, 0 );
// step 4: create a primary su***ce with one backsu***ce
ddsu***cedesc2 ddsd;
zeromemory( &ddsd, sizeof(ddsd));
ddsd.dwsize = sizeof(ddsd);
ddsd.dwflags = ddsd_caps | ddsd_backbuffercount;
ddsd.ddscaps.dwcaps = ddscaps_primarysu***ce | ddscaps_flip | ddscaps_complex;
ddsd.dwbackbuffercount = 1;
hret = m_pdirectdraw->createsu***ce( &ddsd, &m_pddsprimary, null );
//lock
ddsu***cedesc2 ddsdprimary;
ddsdprimary.dwsize = sizeof(ddsu***cedesc2);
hres = m_pddsprimary->lock( null, &ddsdprimary, ddlock_wait, ddlock_nosyslock, 0 );
lpbyte lpbymemory = (lpbyte)ddsdprimary.lpsu***ce;
// do some thing
// unlock
m_pddsprimary->unlock(null);
書上說,記憶體位址a000:0000到b000:0000為顯示儲存器,共128kb,c000:0000到ffff:ffff為各種bios用。有的書又說ega/vga卡中由256kb的動態儲存器(dram)組成,擴充套件的super vga顯示系統中,顯示儲存器大多超過256kb,高達512kb或1mb或更高。
請問視訊記憶體到底在系統記憶體上還是顯示卡上,那大於128kb的顯存在哪兒,位址又是多少。windows下也把記憶體位址a000:0000到b000:0000為顯示儲存器嗎?
視訊記憶體當然是在顯示卡上了,為了能對現存進行操作,將系統的記憶體進行對映,所以寫到這些記憶體裡就象是寫到了視訊記憶體裡一樣,不同的顯示卡對映位址不一樣,與作業系統無關。
大於128kb的顯存在顯示卡上,位址還是使用a000:0000(dos下, windows 9x裡已經實現視訊記憶體動態定位了)至於如何切換需要操作顯示卡上的位遮蔽暫存器來實現,具體可是參考vesa標準.
為了相容,windows當然要把a000:0000到b000:0000作為顯示儲存器位址之一
關於陣列位址問題
c語言中 指標 是算是比較難的乙個問題,而 指標 就是 位址 知道陣列的位址問題,才能在用指標陣列的時候得心應手。下面是一段 include int main int b 2 3 printf p t p n a,a 1 printf p t p n a,a 1 printf p t p n a 0...
GPU視訊記憶體未釋放問題
我們正在使用tensorflow或pytorch寫程式的時候,有時會在控制台將程式殺死,但是有時候程式已經結束了,用nvidia smi也看到程式已經停止,但是gpu還佔著記憶體沒有釋放。這是因為,在使用pytorch設定多執行緒 threads 進行資料讀取 data loader 時,其實是假的...
TensorFlow 2 X GPU視訊記憶體問題
tensorflow 2.x訓練時,預設狀態下gpu視訊記憶體只能分配82 左右 筆者電腦為rtx 2070 max q 8gb,windows 10,cuda 10.1,cudnn 7.6,tensorflow 2.1.0 很多部落格給出如下的 gpus tf.config.experimenta...