har*_*ers 7 .net 3d xna out-of-memory
我有一个绘制和旋转立方体的类.每次我旋转立方体时,我都会使用多维数据集的新值重新加载缓冲区.
public void LoadBuffer(GraphicsDevice graphicsDevice)
{
buffer = new VertexBuffer(graphicsDevice, VertexPositionNormalTexture.VertexDeclaration, triangles * 3, BufferUsage.None);
buffer.SetData<VertexPositionNormalTexture>(verts);
graphicsDevice.SetVertexBuffer(buffer);
}
public void Draw(GraphicsDevice graphicsDevice)
{
graphicsDevice.DrawPrimitives(PrimitiveType.TriangleList, 0, triangles);
}
Run Code Online (Sandbox Code Playgroud)
然后在Game.Draw中调用Cube.Draw方法
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(ClearOptions.DepthBuffer | ClearOptions.Target, Color.White, 1f, 0);
basicEffect.Parameters["WorldViewProj"].SetValue(world * view * projection);
EffectPass pass = basicEffect.CurrentTechnique.Passes[0];
if (pass != null)
{
pass.Apply();
cube1.LoadBuffer(GraphicsDevice);
cube1.Draw(GraphicsDevice);
cube2.LoadBuffer(GraphicsDevice);
cube2.Draw(GraphicsDevice);
cube3.LoadBuffer(GraphicsDevice);
cube3.Draw(GraphicsDevice);
}
base.Draw(gameTime);
}
Run Code Online (Sandbox Code Playgroud)
几分钟左右后,我得到一个OutOfMemory Exception就行了:
buffer.SetData<VertexPositionNormalTexture>(verts);
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会发生这种情况以及我能做些什么来解决它.
顶点缓冲区是非托管资源.垃圾收集器不知道他们在幕后使用了一大堆非托管内存(和GPU资源).所有它知道的是每个人使用的微小的托管内存.
在我对这个问题的回答中,我更多地谈到了XNA中的非托管资源.
您可以Dispose()在VertexBuffer泄漏之前调用每个(但在绘制完成后,因为它仍然在使用!),以释放非托管资源.这样可以避免内存不足错误,但仍然会很慢!
你真正应该做的是只创建一次最小必要的顶点缓冲区.执行此操作的理想位置在您的LoadContent函数中(然后Dispose()在您的UnloadContent函数中).如果你有一大堆立方体,你需要的只是一个描述立方体的顶点缓冲区,每次绘制立方体时都可以重复使用.
显然你不想在同一个地方画出你所有的立方体.这就是World矩阵的用途.每次绘制立方体时,BasicEffect.World都要设置为该立方体的变换矩阵并调用Apply().
(你WorldViewProj直接设置的方式也可以.但是使用漂亮的API更好.)
如果旋转是您想要的,请使用Matrix.CreateFromYawPitchRoll(yaw, pitch, roll)创建变换矩阵.
有关此问题的更多详细信息,您的问题与我已回答的另一个问题类似.
(注意,如果顶点本身确实改变了每一帧,你应该使用DrawUserPrimitives.但请注意,这仍然比让GPU上的顶点着色器处理任何变换要慢得多.)
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |