2013-02-15 66 views
1

我想知道,如果我使用glBufferData,它會在我調用它時分配內存嗎(也就是說,如果size參數大於可用內存,那麼它會崩潰),還是它有一些特殊的內容只有當我實際上將數據複製到緩衝區時才分配內存的時間規則?glBufferData是根據現場的大小實際分配內存嗎?

如何在GPU的內存將這種看法::

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW); 

然後,又怎麼會被佔領

爲了使它更加簡潔,我的問題回答一個更實際的問題來回答內存變化,當你做到這一點在同一個緩衝:

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly); 

回答

4

如何在GPU的內存將這種看法:

glBufferData(GL_ARRAY_BUFFER, 1000, NULL, GL_DYNAMIC_DRAW); 

沒有保證,這將 「對GPU」 分配任何內存。驅動程序可能決定將緩衝區對象放在CPU內存中而不是GPU中。

我會改爲假設你的問題是「將爲緩衝區對象分配多少內存?」

1000字節。這就是你要求的,這就是司機會分配的。

然後,怎麼會佔用內存的變化,當你做到這一點在同一個緩衝:

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(poly), &poly); 

如果當前綁定到GL_ARRAY_BUFFER緩衝對象已分配給它的存儲,以及存儲至少包含sizeof(poly)字節,那麼它將通過將第一個sizeof(poly)字節從&poly複製到存儲中來修改緩衝區的存儲。

如果它沒有分配存儲空間,或者存儲空間小於sizeof(poly)字節,則會收到GL_INVALID_VALUE錯誤。

分配的大小沒有改變。正如您在返回的指針上調用memcpymalloc返回的分配大小沒有改變。glBufferData就像malloc;它會分配存儲空間(在該存儲空間中可以選擇memcpy)。 glBufferSubData就像memcpy;它將數據複製到現有的存儲中。

正如您不能在memcpy之前不先分配一樣,您不能先撥打glBufferData先撥glBufferSubData

+0

好吧,我已經知道了。但是,作爲一個側面問題,我有用戶生成的內容可以改變(越來越多)以最大大小(可能是一個相當大的值)分配數據看起來像是浪費資源(因爲大多數用戶不會生成內容) o允許的最大尺寸)。任何想法如何我可以處理這個?謝謝 – Meda 2013-02-15 21:27:59

+0

@Meda:有一個提問新問題的按鈕。只要確定清楚你到底在做什麼。 – 2013-02-15 21:53:53

1

the docs

如果GL無法使用指定的size創建數據存儲,則會生成GL_OUT_OF_MEMORY

另外:

如果dataNULL,指定大小的數據存儲器還是創建,但它的內容保持未初始化,因此未定義。

+0

我已閱讀文檔中的內容,但仍不清楚。要說清楚:如果你使用NULL指針作爲最後一個參數,它不應該分配任何內存直到你首次使用'glBufferSubData'發送你的數據。但是當你這樣做的時候,它會分配你最初要求的所有內存,或者只是在你的子數據調用中你需要的內存。這是我覺得困惑。 – Meda 2013-02-15 20:52:19

+1

@Meda:「指定大小的數據存儲區***仍然是什麼部分」***你不明白嗎?我們正在討論「malloc」和「malloc; memcpy;」之間的區別前者是當你使用NULL時發生的事情;後者是當你不這樣做時會發生什麼。 – 2013-02-15 20:56:16

+0

@NicolBolas我瞭解的部分。但是,簡單來說,GPU上會佔用多少內存:'glBufferData(GL_ARRAY_BUFFER,1000,NULL,GL_DYNAMIC_DRAW);'?然後,當你在同一個緩衝區上做這個操作時,佔用的內存如何變化:'glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(poly),&poly);' – Meda 2013-02-15 21:02:40

相關問題