簡體   English   中英

創建多個頂點和索引緩沖區時會占用大量內存

[英]Cost much memory when creating several vertex and index buffer

我遇到了一個很奇怪的問題。 當我在D3D中創建一些非常簡單的VertexBuffer和IndexBuffer時,TaskManager報告的內存消耗非常大。

我通過D3D CreateIndexBuffer方法創建了60000個索引緩沖區。 每個索引緩沖區包含6個索引(int),它們代表兩個三角形。 因此,一個索引緩沖區將占用24個字節。 並且總內存消耗將為24 * 60000 = 1,440,000。 但是任務管理器顯示應用程序增加了300MB內存!

我不知道D3D9是如何在內部進行內存分配的,但是在D3D10中也會發生此問題。 這是由於內存碎片造成的嗎?

這是x86 | bebug版本,而d3d是發行版,Windows 7。

60000個索引緩沖區? 為什么不只創建1個大索引緩沖區? 切換所有這些索引緩沖區本身將變得很慢。

原因:創建的每個索引緩沖區都會有開銷(各種跟蹤信息和驅動程序將用來優化信息的信息位),對於我來說5K的內存對我來說似乎很合理。 5K * 60000大約是300兆...

您必須考慮到,要存儲60000個6個整數的集合還有很多事情要做。 如果您要維護指向所有這些指針的指針,則應該為每個指針另外保留4個字節。 這甚至都沒有考慮到每個頂點緩沖區中都存在多個數據成員的事實,這些成員跟蹤諸如緩沖區類型,元素數量,每個元素的大小/類型,緩沖區是動態的,只讀的,寫入的,僅,等等。

您在另一條評論中提到它是只讀的並受管理。 被管理意味着Direct3D將存儲有關每個緩沖區的大量其他數據,以便在必要時(例如,設備重置)可以銷毀,重建和重新填充它。

如前所述,另一個問題是您有60000個索引緩沖區,每個緩沖區存儲6個索引來存儲2個三角形。 您可以在三角形扇形或三角形條帶中使用4個索引。 除此之外,我不確定您為什么需要60萬套。 實際上,您可以有一個索引緩沖區並在其中建立索引,這聽起來可能會令人困惑。 您可以指示Direct3D使用從6 * n索引開始的6 * n個索引來繪制第n對三角形。

不過,我離題了,因為這不是您提出問題的重點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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