【问题标题】:How to resize a directx window without flicker?如何在不闪烁的情况下调整directx窗口的大小?
【发布时间】:2012-02-07 14:22:09
【问题描述】:

我有一个简单的 directx 应用程序,它显示一些预先转换的几何图形,我希望窗口在调整大小时不会闪烁,并且我希望图纸不会随着窗口大小而拉伸。

我注意到拉伸问题,如果我在 WM_SIZING 中重置设备,则绘图的实际尺寸会保留。但是每次调整窗口大小时都重置设备似乎是一项昂贵的操作。实际上,我想使用directx创建一些简单的GUI,但是调整窗口大小似乎会擦除前端缓冲区数据,因此会出现flicks。我看到许多使用opengl自定义gui的应用程序允许调整大小,WPF应用程序也允许调整大小。我该怎么做?

另外我想知道,如果我无法实现实时调整大小而不闪烁和重新定位绘制元素的效果,那么 WPF 应用程序如何做到这一点?

另外我想问一下,如果您要使用 directx 设计 GUI(非游戏)系统并希望像任何其他应用程序一样实现调整大小支持,您会选择什么?

【问题讨论】:

    标签: directx resize flicker


    【解决方案1】:

    我希望窗口在调整大小时不闪烁

    不要处理 WM_ERASEBACKGROUND 和类似的消息。把所有的画留给DirectX,就不会出现闪烁了。任何闪烁基本上都是您(或您的控件)先绘制一些东西,然后 DirectX 在上面绘制它的图片。

    而且我希望图纸不会随着窗口大小而拉伸。

    不可能(至少没有黑客)。假设您使用 DirectX 9,则必须重新初始化设备以更改其分辨率,这很慢。

    我可以考虑一些变通方法来尝试,例如,更改您的投影矩阵,以便在视口分辨率保持不变(不重新初始化)的同时,您通过视口看到的东西反映了窗口大小。

    换句话说,您将视口初始化为 640x480 并保持不变,但如果用户将窗口大小调整为 1024x768,您会将 1024x768 的内容打包到 640x480 视口中,然后将其拉伸以填充 1024x768 窗口。

    这应该给人一种“调整”视口大小的印象,但由于实际上它是缩放的,所以图片质量会下降。这就是为什么您可能希望在用户完成调整窗口大小后最终重新初始化视口。这样您就可以先快速调整大小,然后再快速调整图片质量。

    【讨论】:

      猜你喜欢
      • 2013-07-20
      • 2011-05-18
      • 2010-09-25
      • 1970-01-01
      • 2015-08-29
      • 2014-12-29
      • 2012-11-17
      • 2018-05-11
      • 2016-03-19
      相关资源
      最近更新 更多