【问题标题】:Screen not refreshing in XNA ProjectXNA Project 中的屏幕不刷新
【发布时间】:2013-09-20 02:43:24
【问题描述】:

我正在使用带有 xna 的 winforms。 到目前为止一切正常,除了绘图。这是我的初始代码:

        protected override void Draw()
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            spriteBatch.Begin();
            tileSheet.Draw(spriteBatch);
            foreach (Image img in selector)
                img.Draw(spriteBatch);
            spriteBatch.End();
        }

我放置了一个断点,它正在调用 draw 方法,但屏幕上没有任何变化,但是当我这样做时:

protected override void Draw()
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();
        tileSheet.Draw(spriteBatch);
        foreach (Image img in selector)
            img.Draw(spriteBatch);
        spriteBatch.End();

        Invalidate();
    }

有效!但问题是一切都被冻结了,而且似乎陷入了无效循环。但是为什么后者有效而前者无效?我已经为此工作了几个小时,但我不明白出了什么问题:/。

我觉得这很简单,但我无法理解它。

我也尝试过更新和刷新,但它们也不起作用。

【问题讨论】:

标签: c# winforms xna


【解决方案1】:

Invalidate 调用 Draw1,因此在混合使用 Invalidate 时,Invalidate -> Draw -> Invalidate -> Draw -> ..

“修复”是在抽签中无效。相反,仅调用 Invalidate 以响应需要 [re]draw 的 input。在“不工作”(但确实有效!)前者的情况下,请确保调用 Invalidate 适当的 - 但从绘图处理程序之外。


1 Invalidate “稍后”调用 Draw,但它是一个异步操作。它有效地发布一条消息,WinForms 进程在窗口消息循环中处理,然后调用 OnPaint,最后调用 Draw。但是,从 Draw 中调用 Invalidate 会导致“更新太多太快”。

【讨论】:

  • 我了解无效的工作原理。我的 Initialize 方法中有这个。 Application.Idle += 委托 { Invalidate(); };它确实调用了draw方法,但除非我将它放在draw方法中,否则什么都不会更新。那是我的问题
  • Invalidate 通过调用 draw 方法来完成它的工作,但没有任何东西被绘制到屏幕上。唯一被绘制的东西是如果我也将 Invalidate 放入我的 draw 方法中。
  • @CodingMadeEasy 然后听起来 Invalidate 没有被适当地调用 - 即空闲事件处理程序永远不会触发。在里面放一个断点。还可以尝试使用调用 Invalidate 的按钮。使用 Refresh 合适,因为它甚至不会进入消息队列!也就是说,从 Draw 调用 Refresh 将总是冻结/崩溃。
  • 空闲事件正在触发。它触发了触发 draw 方法的 Invalidate 事件。它通过 draw 方法,但屏幕上没有任何反应。当我在 draw 方法中设置无效时,我会看到结果,但它会冻结其他所有内容。
  • 奇怪,我的东西用完了:祝你好运!考虑更新原始帖子,包括上述 cmets 中的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多