Буферы вершин - это неуправляемые ресурсы. Сборщик мусора не знает , что он использует целую кучу неуправляемой памяти (и ресурсов графического процессора) за кулисами. Все, что он знает, - это небольшая часть управляемой памяти, которую использует каждый.
Я больше говорю о неуправляемых ресурсах в XNA в моем ответе на этот вопрос .
Вы можете вызвать Dispose()
для каждого VertexBuffer
до того, как утечку (но после завершения рисования, поскольку она все еще будет использоваться!), Чтобы освободить неуправляемые ресурсы. Это позволит избежать ошибки нехватки памяти, но все равно будет очень медленным!
Что вы действительно должны делать, так это создавать минимально необходимые буферы вершин только один раз . Идеальное место для этого - ваша функция LoadContent
(а затем Dispose()
их в вашей функции UnloadContent
). Если у вас есть целая связка кубов, все, что вам нужно, это один буфер вершин, описывающий куб, который вы будете использовать каждый раз, когда рисуете куб.
Очевидно, что вы не хотите рисовать все свои кубы в одном месте. Это то, для чего предназначена матрица мира. Каждый раз, когда вы рисуете куб, задайте BasicEffect.World
матрицу преобразования для этого куба и вызовите Apply()
.
(То, как вы устанавливаете WorldViewProj
напрямую, тоже хорошо. Но использование хорошего API, ну, конечно, лучше.)
Если вам нужно вращение, используйте Matrix.CreateFromYawPitchRoll(yaw, pitch, roll)
для создания матрицы преобразования.
Более подробно об этом ваша проблема похожа на другой вопрос, на который я ответил .
(Обратите внимание, что, если сами вершины действительно меняют каждый кадр, вы должны использовать DrawUserPrimitives
. Но обратите внимание, что это все же значительно медленнее, чем включение вершинного шейдера GPU обрабатывает любые преобразования.)