怎樣出要繪制的整幅圖形所占的記憶體空間大小,還有MFC里怎樣分配記憶體大小?
uj5u.com熱心網友回復:
求助!!!
uj5u.com熱心網友回復:
用的什么方式繪制的?帖出你的繪圖代碼uj5u.com熱心網友回復:
我是用雙緩沖的方式繪圖,但是這種方法在所繪的圖太大的時候不能處理,所以想用區域重繪的方式,就是先比較記憶體和位圖大小,如果位圖大,那就先畫一部分位圖,隨著滾動條的拉動在繪制剛才沒顯示出來的部分。但是怎能分配記憶體還有怎么比較大小我不會處理,求幫助!!!void CDrawView::OnDraw(CDC* pDC)
{
CDrawDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CRect client;
pDC->GetClipBox(client);
CRect rect = client;
GetClientRect(rect);
CMemDC memdc(pDC);
CBrush brush;
if(!brush.CreateSolidBrush(RGB(255,255,255)))
return;
brush.UnrealizeObject();
memdc.FillRect(client, &brush);
CBrush brush1;
if(!brush1.CreateSolidBrush(RGB(255,255,255)))
return;
CPen pen;
if(!pen.CreatePen(PS_SOLID,1,RGB(0,0,0)))
return;
CBrush *pOldBrush;
CPen *pOldPen;
pOldPen = memdc.SelectObject(&pen);
pOldBrush = memdc.SelectObject(&brush1);
int m_nwidth =memdc.GetDeviceCaps(LOGPIXELSX);///水平方向上每英寸的像素點數
DrawWell(&memdc);
LoadBmp(&memdc);
memdc.SetBkMode(TRANSPARENT);
}
uj5u.com熱心網友回復:
你可以這樣,在每次貼圖的時候,根據滾動條的位置來計算下貼圖的區域,然后貼圖的時候,只貼這塊就行了,具體的代碼實作,可以搜索:picture控制元件支持滾動條顯示影像,這類的解決方案,比如這個demo可以參考下:http://download.csdn.net/detail/u010937817/6025845uj5u.com熱心網友回復:
CreateFileMappinguj5u.com熱心網友回復:
首先計算出把整幅圖形繪制出來所用的記憶體大小,然后判斷記憶體空間是否能夠一次性繪制完整幅圖形,如果可以就直接分配記憶體為要繪制整幅圖所用的記憶體大小。否則,可以將繪制圖形以一定比例適當減小,然后在判斷能否繪制,若可以就分配該大小的記憶體,否則就重復進行直到成功的確定下分配記憶體位圖的大小。確定下記憶體以后,在進行視窗重繪的時候,還要根據記憶體位圖的邏輯坐標和客戶區的坐標來保證客戶區在記憶體位圖內,然后進行拷貝。想這樣實作,而且我用的是單檔案啊。uj5u.com熱心網友回復:
一般,24位圖 長*寬*3+n個調整位元組(每行位元組數必須是4的倍數)32位圖:長*寬*4
uj5u.com熱心網友回復:
單檔案有什么特別的嗎?繪圖的方式都是 一樣的,關鍵就是設定貼圖的區域,或者你的圖最大的有多大呢
uj5u.com熱心網友回復:
其實這個方法很多的,類似于游戲的場景管理器。首先你要有視口的概念。整個場景可能比視口大很多,比如玩魔獸、LOL時,地圖很大,在螢屏上是可以滾動的,視口就是一個矩形的區域,事實上就是用來裁剪你能看到的那一部分地圖的矩形區域。
然后,你要明白一個道理,任何對視口之外的影像渲染作業都是無效的。但不包括碰撞檢測,位置改變等物理計算。
一個場景內可能包含多個物體,多層畫面,比如,最底層的是地圖,在上面是你的hero以及一些怪物。這些都是要被渲染的物件。
因此:
1、一個好的渲染引擎,應該會快速規劃哪一些物件(物體)應該被渲染,哪一些不需要渲染,最理想的情況是對每一個物體還要進行背面剔除,比如一個盒子,盒子本身雖然在視口內,但它的背面是看不到的,因此背面是可以被剔除的。但這需要大量的計算,因此要根據實際情況選擇剔除演算法,然后將需要渲染的物件送入渲染流水線。
2、針對你說的情況,貌似就是一個2D的影像展示。一個影像如果非常大,可以用記憶體檔案映射的形式(5樓說的那個API)存盤于硬碟,將影像分為不同的區域(使用4叉樹),動態的加載當前視口臨近的區域到記憶體中(這樣可以實作無縫滾動),動態更新影像并僅顯示視口內的影像。
3、如果你的場景也不是很大,可以直接創建離屏緩沖區,現在的顯卡顯存都比較大,即便顯存不夠也可以使用記憶體來充當,動態更新離屏緩沖區,然后每次只需要bitblt視口內的區域即可。
uj5u.com熱心網友回復:
首先計算出把整幅圖形繪制出來所用的記憶體大小,然后判斷記憶體空間是否能夠一次性繪制完整幅圖形,如果可以就直接分配記憶體為要繪制整幅圖所用的記憶體大小。否則,可以將繪制圖形以一定比例適當減小,然后在判斷能否繪制,若可以就分配該大小的記憶體,否則就重復進行直到成功的確定下分配記憶體位圖的大小。確定下記憶體以后,在進行視窗重繪的時候,還要根據記憶體位圖的邏輯坐標和客戶區的坐標來保證客戶區在記憶體位圖內,然后進行拷貝。想這樣實作,而且我用的是單檔案啊。
你可以這樣,在每次貼圖的時候,根據滾動條的位置來計算下貼圖的區域,然后貼圖的時候,只貼這塊就行了,具體的代碼實作,可以搜索:picture控制元件支持滾動條顯示影像,這類的解決方案,比如這個demo可以參考下:http://download.csdn.net/detail/u010937817/6025845
單檔案有什么特別的嗎?繪圖的方式都是 一樣的,關鍵就是設定貼圖的區域,或者你的圖最大的有多大呢
uj5u.com熱心網友回復:
其實這個方法很多的,類似于游戲的場景管理器。
首先你要有視口的概念。整個場景可能比視口大很多,比如玩魔獸、LOL時,地圖很大,在螢屏上是可以滾動的,視口就是一個矩形的區域,事實上就是用來裁剪你能看到的那一部分地圖的矩形區域。
然后,你要明白一個道理,任何對視口之外的影像渲染作業都是無效的。但不包括碰撞檢測,位置改變等物理計算。
一個場景內可能包含多個物體,多層畫面,比如,最底層的是地圖,在上面是你的hero以及一些怪物。這些都是要被渲染的物件。
因此:
1、一個好的渲染引擎,應該會快速規劃哪一些物件(物體)應該被渲染,哪一些不需要渲染,最理想的情況是對每一個物體還要進行背面剔除,比如一個盒子,盒子本身雖然在視口內,但它的背面是看不到的,因此背面是可以被剔除的。但這需要大量的計算,因此要根據實際情況選擇剔除演算法,然后將需要渲染的物件送入渲染流水線。
2、針對你說的情況,貌似就是一個2D的影像展示。一個影像如果非常大,可以用記憶體檔案映射的形式(5樓說的那個API)存盤于硬碟,將影像分為不同的區域(使用4叉樹),動態的加載當前視口臨近的區域到記憶體中(這樣可以實作無縫滾動),動態更新影像并僅顯示視口內的影像。
3、如果你的場景也不是很大,可以直接創建離屏緩沖區,現在的顯卡顯存都比較大,即便顯存不夠也可以使用記憶體來充當,動態更新離屏緩沖區,然后每次只需要bitblt視口內的區域即可。
uj5u.com熱心網友回復:
能給個例子嗎
其實這個方法很多的,類似于游戲的場景管理器。
首先你要有視口的概念。整個場景可能比視口大很多,比如玩魔獸、LOL時,地圖很大,在螢屏上是可以滾動的,視口就是一個矩形的區域,事實上就是用來裁剪你能看到的那一部分地圖的矩形區域。
然后,你要明白一個道理,任何對視口之外的影像渲染作業都是無效的。但不包括碰撞檢測,位置改變等物理計算。
一個場景內可能包含多個物體,多層畫面,比如,最底層的是地圖,在上面是你的hero以及一些怪物。這些都是要被渲染的物件。
因此:
1、一個好的渲染引擎,應該會快速規劃哪一些物件(物體)應該被渲染,哪一些不需要渲染,最理想的情況是對每一個物體還要進行背面剔除,比如一個盒子,盒子本身雖然在視口內,但它的背面是看不到的,因此背面是可以被剔除的。但這需要大量的計算,因此要根據實際情況選擇剔除演算法,然后將需要渲染的物件送入渲染流水線。
2、針對你說的情況,貌似就是一個2D的影像展示。一個影像如果非常大,可以用記憶體檔案映射的形式(5樓說的那個API)存盤于硬碟,將影像分為不同的區域(使用4叉樹),動態的加載當前視口臨近的區域到記憶體中(這樣可以實作無縫滾動),動態更新影像并僅顯示視口內的影像。
3、如果你的場景也不是很大,可以直接創建離屏緩沖區,現在的顯卡顯存都比較大,即便顯存不夠也可以使用記憶體來充當,動態更新離屏緩沖區,然后每次只需要bitblt視口內的區域即可。
你還是沒有搞明白啊,這是一個方法,思路。場景管理很有多中,BSP、四叉樹、8叉樹等,你要根據實際情況選擇適合你的,你說了半天都沒說你要畫什么東西,如何去組織這些要畫的東西....怎么可能給你例子呢?你如果非要例子,可以百度一下BSP、四叉樹、8叉樹....實在太多了,你會暈的,所以關鍵還是你的需求。
uj5u.com熱心網友回復:
有的時候超出系統記憶體,就是測井曲線繪制
首先計算出把整幅圖形繪制出來所用的記憶體大小,然后判斷記憶體空間是否能夠一次性繪制完整幅圖形,如果可以就直接分配記憶體為要繪制整幅圖所用的記憶體大小。否則,可以將繪制圖形以一定比例適當減小,然后在判斷能否繪制,若可以就分配該大小的記憶體,否則就重復進行直到成功的確定下分配記憶體位圖的大小。確定下記憶體以后,在進行視窗重繪的時候,還要根據記憶體位圖的邏輯坐標和客戶區的坐標來保證客戶區在記憶體位圖內,然后進行拷貝。想這樣實作,而且我用的是單檔案啊。
你可以這樣,在每次貼圖的時候,根據滾動條的位置來計算下貼圖的區域,然后貼圖的時候,只貼這塊就行了,具體的代碼實作,可以搜索:picture控制元件支持滾動條顯示影像,這類的解決方案,比如這個demo可以參考下:http://download.csdn.net/detail/u010937817/6025845
單檔案有什么特別的嗎?繪圖的方式都是 一樣的,關鍵就是設定貼圖的區域,或者你的圖最大的有多大呢
你要繪制多大的圖呢,怎么還能超出系統記憶體,每個系統有4G的虛擬記憶體空間呢
uj5u.com熱心網友回復:
有的時候超出系統記憶體,就是測井曲線繪制
首先計算出把整幅圖形繪制出來所用的記憶體大小,然后判斷記憶體空間是否能夠一次性繪制完整幅圖形,如果可以就直接分配記憶體為要繪制整幅圖所用的記憶體大小。否則,可以將繪制圖形以一定比例適當減小,然后在判斷能否繪制,若可以就分配該大小的記憶體,否則就重復進行直到成功的確定下分配記憶體位圖的大小。確定下記憶體以后,在進行視窗重繪的時候,還要根據記憶體位圖的邏輯坐標和客戶區的坐標來保證客戶區在記憶體位圖內,然后進行拷貝。想這樣實作,而且我用的是單檔案啊。
你可以這樣,在每次貼圖的時候,根據滾動條的位置來計算下貼圖的區域,然后貼圖的時候,只貼這塊就行了,具體的代碼實作,可以搜索:picture控制元件支持滾動條顯示影像,這類的解決方案,比如這個demo可以參考下:http://download.csdn.net/detail/u010937817/6025845
單檔案有什么特別的嗎?繪圖的方式都是 一樣的,關鍵就是設定貼圖的區域,或者你的圖最大的有多大呢
你要繪制多大的圖呢,怎么還能超出系統記憶體,每個系統有4G的虛擬記憶體空間呢
uj5u.com熱心網友回復:
還涉及圖形放大之類的
有的時候超出系統記憶體,就是測井曲線繪制
首先計算出把整幅圖形繪制出來所用的記憶體大小,然后判斷記憶體空間是否能夠一次性繪制完整幅圖形,如果可以就直接分配記憶體為要繪制整幅圖所用的記憶體大小。否則,可以將繪制圖形以一定比例適當減小,然后在判斷能否繪制,若可以就分配該大小的記憶體,否則就重復進行直到成功的確定下分配記憶體位圖的大小。確定下記憶體以后,在進行視窗重繪的時候,還要根據記憶體位圖的邏輯坐標和客戶區的坐標來保證客戶區在記憶體位圖內,然后進行拷貝。想這樣實作,而且我用的是單檔案啊。
你可以這樣,在每次貼圖的時候,根據滾動條的位置來計算下貼圖的區域,然后貼圖的時候,只貼這塊就行了,具體的代碼實作,可以搜索:picture控制元件支持滾動條顯示影像,這類的解決方案,比如這個demo可以參考下:http://download.csdn.net/detail/u010937817/6025845
單檔案有什么特別的嗎?繪圖的方式都是 一樣的,關鍵就是設定貼圖的區域,或者你的圖最大的有多大呢
你要繪制多大的圖呢,怎么還能超出系統記憶體,每個系統有4G的虛擬記憶體空間呢
那你計算下,最多能占多少空間
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/139829.html
標籤:基礎類
