Monogame / SharpDX Texture2D不具有价值

我发现的问题很可能是类之间,所以我真的没有太多的select,但发布整个代码在这里: https : //www.dropbox.com/sh/smyw9t1ap3by2vd/pBX-aJJ-Qx

我一直在使用spritebatches渲染纹理最近使用monamame的Windows 8与xaml在运行几秒后引发错误。 这个错误只发生在几秒钟之后,尽管渲染效率越低或纹理越多,崩溃的速度越快。 在完成git子模块更新后,错误信息完全消失,但纹理仍然从屏幕消失,只剩下矢车菊蓝色。

GitHub的人认为这是我的代码而不是他们的问题,这意味着我确实做错了什么。 作为参考,这里是问题线程: https : //github.com/mono/MonoGame/issues/1927 。 谢谢你的帮助!

更新:我已经确定了问题的根源。 它与声明和保持纹理有关。

protected override void LoadContent() { _spriteBatch = new SpriteBatch(GraphicsDevice); ContentManager myManager = new ContentManager(Content.ServiceProvider, Content.RootDirectory); terrainEngine.Load(myManager); } ContentManager content; public void Load(ContentManager content) { this.content = content; blockTextures = content.Load<Texture2D>("Graphics\\Blocks"); spriteFont = content.Load<SpriteFont>("Graphics\\SpriteFont1"); } 

现在,如果我从terrainEngine类的Update方法中调用Load(content),那么程序将工作,否则,纹理会在一秒钟后消失。

我想你正在声明一些东西在垃圾收集器清理范围内(这解释了为什么使用更多的内存使得它发生得更快,并解释了声明纹理和消失之间的延迟)。

具体来说,我认为这是你的ContentManager ,在你的LoadContent()函数中声明:

 protected override void LoadContent() { _spriteBatch = new SpriteBatch(GraphicsDevice); ContentManager myManager = new ContentManager(Content.ServiceProvider, Content.RootDirectory); terrainEngine.Load(myManager); } 

即使您稍后将设置分配给全局variables:

 ContentManager content; public void Load(ContentManager content) { this.content = content; blockTextures = content.Load<Texture2D>("Graphics\\Blocks"); spriteFont = content.Load<SpriteFont>("Graphics\\SpriteFont1"); } 

现在,全局variables只是分配给某些在离开作用域时会被清除的东西。

尝试直接分配给你的全局variables:

 protected override void LoadContent() { _spriteBatch = new SpriteBatch(GraphicsDevice); content = new ContentManager(Content.ServiceProvider, Content.RootDirectory); terrainEngine.Load(); } public void Load() { blockTextures = content.Load<Texture2D>("Graphics\\Blocks"); spriteFont = content.Load<SpriteFont>("Graphics\\SpriteFont1"); }