我已经在XNA(vb.net)的一个游戏项目工作了几年,但我没有接受过正规教育,所以我在尝试时学习。这意味着我可能会编写代码效率低下或完全错误(很好地考虑)。对我的问题:
今天,当我第一次启动调试时,在绘制第一帧之前出现错误(出现白色窗口)。它突出显示我的game.Run()
,错误为System.OutOfMemoryException
。当我把它复制到剪贴板时,它说:
System.OutOfMemoryException was unhandled
HResult=-2147024882
Message=Exception of type 'System.OutOfMemoryException' was thrown.
Source=WindowsGame2
StackTrace:
at WindowsGame2.Game1.Draw(GameTime gameTime)
at Microsoft.Xna.Framework.Game.DrawFrame()
at Microsoft.Xna.Framework.Game.Tick()
at Microsoft.Xna.Framework.Game.HostIdle(Object sender, EventArgs e)
at Microsoft.Xna.Framework.GameHost.OnIdle()
at Microsoft.Xna.Framework.WindowsGameHost.RunOneFrame()
at Microsoft.Xna.Framework.WindowsGameHost.ApplicationIdle(Object sender, EventArgs e)
at System.Windows.Forms.Application.ThreadContext.System.Windows.Forms.UnsafeNat iveMethods.IMsoComponent.FDoIdle(Int32 grfidlef)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.Unsafe NativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at Microsoft.Xna.Framework.WindowsGameHost.Run()
at Microsoft.Xna.Framework.Game.RunGame(Boolean useBlockingRun)
at Microsoft.Xna.Framework.Game.Run()
at WindowsGame2.Program.Main(String[] args) in C:\Projects \WindowsGame2\WindowsGame2\WindowsGame2\Program.vb:line 9
InnerException:
我不记得当天对代码进行任何特定更改,而只是简单地添加更多内容。我知道这很模糊,但我真的可以想到这一点。我一直在挖掘每个论坛,但无济于事。 我能提供哪些信息可能有助于理解问题? 我感谢任何帮助! /基督教
编辑: 我尝试优化代码(并且相当多),所以它应该运行得更顺畅。例如,我现在使用的循环比以前少得多。 这个问题似乎并不是在运行它时,而是在它启动时。现在我开始大约是我按下调试的1/5。
答案 0 :(得分:0)
看起来堆栈跟踪指向Draw方法。确保不会在每一帧(绘制或更新)中不必要地重新创建对象,因为这将每秒发生60次(假设为60fps)。
因为你说它只发生了一些时间,而其他时候它没有发生,所以也看看你是否可以减少启动时创建的内容。确保只在需要时创建所需内容。
如果堆栈跟踪是正确的并且问题在您的Draw方法中是特定的,请确保您不是每帧都不必要地重新创建纹理,并确保在完成后对任何具有它的对象调用.Dispose()它