- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我的游戏窗口允许手动调整大小,这意味着它可以像任何其他普通窗口一样通过拖动其边缘来调整大小。该游戏还使用了 RenderTarget2D rt2d
,主要渲染目标在主要绘制方法中设置为:GraphicsDevice.SetRenderTarget(rt2d)
, 但它被重置回 null
(默认渲染目标)在主要 Draw 方法的末尾,这让人有点困惑:这真的是问题的根源吗,在 Render Target 设置为 rt2d
之间调整游戏窗口大小,而不是重置回默认值?现在看起来是这样。
主要 Draw 方法中的代码应该总是将主要渲染目标重置回 null
,所以没有预期的情况,这通常不会发生。
不过,调整游戏窗口大小的结果有时会导致 GraphicsDevice.isDisposed
返回 true
, 然后游戏抛出 System.ObjectDisposedException
在第一个SpriteBatch.End()
.我发现有关此错误的帖子可以追溯到 XNA 的最初几天,但没有很好的解释(也没有提到更改渲染目标,因此它也可能是这些帖子的问题根源)。
现在我可以通过多次调用此方法来触发此错误:
graphics.PreferredBackBufferWidth = graphics.PreferredBackBufferWidth;
graphics.PreferredBackBufferHeight = graphics.PreferredBackBufferHeight;
graphics.ApplyChanges();
...在主要的 Draw 方法中有以下几行:
RenderTarget2D rt2d = new RenderTarget2D(GraphicsDevice,
graphics.PreferredBackBufferWidth,
graphics.PreferredBackBufferHeight);
GraphicsDevice.SetRenderTarget(rt2d);
sb.Begin();
// main draw method here, it's pretty big, so it might be taking long
// enough to process to actually resize before resetting render target
sb.End();
GraphicsDevice.SetRenderTarget(null);
sb.Begin();
// draw the whole rt2d to the screen
sb.End();
我的猜测是,如果调整大小发生在渲染目标重置之前,我应该中止帧绘制并重置渲染目标,但我仍然不确定这正是导致此问题的原因。
更新:有Window.ClientSizeChanged
和 graphics.PreparingDeviceSettings
事件,但即使它们触发,默认渲染目标似乎也无济于事。
我想这不是“调整客户区大小和应用新图形设置之间的超时”之类的。这很可能是由非默认渲染目标引起的。
而且可能并不是渲染目标尺寸与新屏幕尺寸不同,因为当将图形设备尺寸更改为完全相同的值时,这也会引发异常。
UPD2:我只是尝试让全屏切换一个挂起的操作,使 F11 设置为 isFullscreenTogglePending
为 true 并在主程序的开头检查它 Update
方法,它根本没有帮助。然后我发现以前的全屏模式也是从主更新方法切换的,只是不是在一开始,而是在输入更新方法的中途,所以在主 Update
中的哪个位置并不重要。它运行的方法,它仍然会导致此错误。有趣的是,GraphicsDevice.isDisposed
抛出异常时为false。
这是异常信息:
System.ObjectDisposedException occurred
Message=Cannot access a disposed object.
Object name: 'GraphicsDevice'.
Source=Microsoft.Xna.Framework
ObjectName=GraphicsDevice
StackTrace:
at Microsoft.Xna.Framework.Helpers.CheckDisposed(Object obj, IntPtr pComPtr)
at Microsoft.Xna.Framework.Graphics.BlendState.Apply(GraphicsDevice device)
at Microsoft.Xna.Framework.Graphics.GraphicsDevice.set_BlendState(BlendState value)
at Microsoft.Xna.Framework.Graphics.SpriteBatch.SetRenderState()
at Microsoft.Xna.Framework.Graphics.SpriteBatch.End()
at secret_project.Game1.Draw(GameTime gameTime) in P:\msvs projects\secret_project\Game1.cs:line 3310
InnerException:
它位于 spriteBatch.End()
在主 Draw 调用中。
如何防止此错误?
可能相关的问题:
最佳答案
两件事:1.我不熟悉渲染目标......但这也许会有所帮助?来自 MSDN:
“渲染目标代表显示内存的线性区域,通常驻留在显示卡的显示内存中。因此,在设备重置时必须重新创建 RenderTarget 对象。”
2。除此之外,我曾经遇到过类似的问题。我在绘制调用结束时处理纹理。这会很好用,除非我试图移动窗口。每隔一段时间,当我尝试移动游戏窗口时,(对于纹理)就会发生 ObjectDisposed 异常。我对推理的最佳猜测是更新线程和绘制线程会错位,即使只是一小会儿,并且纹理会在有机会重置之前再次调用。我从来没有找到停止效果的方法,除了在尝试绘制之前确保对象没有被丢弃。
当然,我们的情况可能完全不相关,但作为一种可能的解决方法,只需添加一个标志,该标志将在最近重新调整窗口大小时停止任何绘制调用。
如果这不能解决问题,希望它能帮助缩小问题范围。
关于c# - 如何在应用新设置时防止 GraphicsDevice 被处置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16225701/
这个问题已经有答案了: Is there any way to accept only numeric values in a JTextField? (20 个回答) It's possible i
我使用戴尔 XPS M1710。笔记本电脑的盖子、侧面扬声器和前置扬声器都有灯(3 组灯可以单独调节)和鼠标垫下方的灯。在 BIOS 中,我可以更改这些灯的颜色,至少是每个组。另外,我可以在鼠标垫下打
我知道我可以使用 在 iOS 5 中打开设置应用 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"prefs://"
我有一个 Django 应用程序,我正在尝试为其设置文档。目录结构如下: - doc - project | - manage.py 我已经设置了路径以便 Sphinx 可以看到东西,但是当我尝试使用
我正在使用 768mb ram 运行 centos 5.5。我一直在日志中获取 server reached MaxClients setting, consider raising the MaxC
我在具有以下配置的服务器内运行了 Drupal 安装: StartServers 5 MinSpareServers 5 MaxSpareServers 15 MaxClien
是否可以使用 Microsoft.Web.Administration 包为给定的 location 配置 asp 设置? 我想以编程方式将以下部分添加到本地 IIS applicationHost.
我一直在阅读为 kube-proxy 提供参数的文档,但没有解释应该如何使用这些参数。我使用 az aks create 创建我的集群使用 azure-cli 程序,然后我获得凭据并使用 kubect
我想知道与在 PHP 中使用 setcookie() 函数相比,在客户端通过 JavaScript 设置一些 cookie 是否有任何明显的优势?我能想到的唯一原因是减少一些网络流量(第一次)。但不是
我有一个按钮可以将 body class 设置为 .blackout 我正在使用 js-cookie设置cookie,下面的代码与我的按钮相关联。 $('#boToggle').on('click'
我有一堆自定义的 HTML div。我将其中的 3 存储在具有 slide 类的 div 中。然后,我使用该幻灯片类调用 slick 函数并应用如下设置: $('.slide').slick({
我正在创建一个应该在 Windows 8(桌面)上运行的应用 我需要: 允许用户使用我的应用启动“文件历史记录”。我需要找到打开“文件历史记录”的命令行。 我需要能够显示“文件历史记录”的当前设置。
我刚买了一台新的 MacBook Pro,并尝试在系统中设置 RVM。我安装了 RVM 并将默认设置为 ➜ rvm list default Default Ruby (for new shells)
由于有关 Firestore 中时间戳行为即将发生变化的警告,我正在尝试更改我的应用的初始化代码。 The behavior for Date objects stored in Firestore
在 ICS 中,网络 -> 数据使用设置屏幕中现在有“限制后台数据”设置。 有没有办法以编程方式为我的应用程序设置“限制后台数据”? 或 有没有办法为我的应用程序调出具有选项的“数据使用”设置? 最佳
我正在尝试使用 NextJS 应用程序设置 Jest,目前在 jest.config.js : module.exports = { testPathIgnorePatterns: ["/.n
我最近升级到 FlashDevelop 4,这当然已经将我之前的所有设置恢复到原来的状态。 我遇到的问题是我无法在新设置窗口的哪个位置找到关闭它在方括号、大括号等之前插入的自动空格的选项。 即它会自动
有没有办法以编程方式访问 iPhone/iPod touch 设置? 谢谢。比兰奇 最佳答案 大多数用户设置可以通过读取存储在 /User/Library/Preferences/ 中的属性列表来访问
删除某些值时,我需要选择哪些设置来维护有序队列。我创建了带有自动增量和主键的 id 的表。当我第一次插入值时,没问题。就像 1,2,3,4,5... 当删除某些值时,顺序会发生变化,例如 1,5,3.
我正在尝试设置示例 Symfony2 项目,如此处所示 http://symfony.com/doc/current/quick_tour/the_big_picture.html 在访问 confi
我是一名优秀的程序员,十分优秀!