我在一个窗口中的 SlimDX 中设置了 Direct3D11 场景。渲染在单独的线程中完成。
有没有办法让渲染器在绘制到调整大小的控件时不拉伸图像?我试过ModeDescription.Scaling = DisplayModeScaling.Centered
了,好像没什么效果。有什么我想念的吗?
(我已经在更新渲染目标大小。我问这个的原因是,当我调整控件大小时,它会拉伸图像以在渲染目标更新为新大小之前填充控件一瞬间。结果是当我调整它的大小时,它会严重闪烁。如果我可以稍微快一点地重置渲染目标,它可能会消除闪烁。将图像保持在角落而不缩放它是非常好的,因为最终它根本不会缩放。 )
解决方法 1: 可以将渲染目标放在控件中。当窗口调整大小时,仅通过一种特殊方法调整控件的大小,该方法首先停止渲染,然后更新缓冲区并再次开始渲染。不过,这有点骇人听闻。我必须等待渲染周期完成,然后阻止它,然后调整大小,然后解除阻止。
解决方法 2:类似的解决方法是检查渲染循环中的调整大小标志,而不是中断它。渲染器应该能够直接绘制而无需缩放。这在性能方面更容易接受。但是,必须对 UI 线程进行阻塞调用才能执行实际的调整大小。
解决方法 3:与其完全调整控件的大小,不如将其设置为尽可能大,但会被裁剪(在窗口内)。无需调整大小,但必须以与上述解决方法类似的方式维护剪刀矩形,除非您不介意渲染大量屏幕外像素。渲染 20 左右额外的像素行和列确实具有在窗口重新变大时在边缘提供即时图像的有利效果。
理想情况下,调整大小应该直接从 UI 线程完成(不要鬼混延迟它并从渲染线程重新进入 UI 线程)。这不是渲染线程的责任,它会减慢它的速度。同样,缓冲区调整大小应该在渲染线程中完成以获得最佳性能(不要胡乱等待/阻塞/调整大小/解除阻塞)。这不起作用的唯一原因是如果在调整缓冲区大小之前完成调整大小,则渲染线程会缩放。
所以我的问题仍然存在:有没有一种方法可以在不缩放的情况下进行渲染?