Direct2D、WPF D3D10 图像在调整大小时模糊
Direct2D, WPF D3D10 image blurs on resizing
我正在开发一个 WPF 应用程序,它使用 DirectX 为我的应用程序绘制背景和边框。我使用了这里的代码:Using Direct2D with WPF
代码工作正常,但是当我绘制一个矩形并且没有填充矩形时,在调整大小时它会模糊。
这是问题的截图。
window 周围的红色边框是我绘制的矩形。我对代码所做的唯一更改如下:
protected override void OnRender() {
// Calculate our actual frame rate
this.frameCount++;
if (DateTime.UtcNow.Subtract(this.time).TotalSeconds >= 1) {
this.fps = this.frameCount;
this.frameCount = 0;
this.time = DateTime.UtcNow;
}
// This is what we're going to draw. We'll animate the width of the
// elipse over a span of five seconds (ElapsedTime / 5).
this.widthRatio += this.ElapsedTime / 5;
if (this.widthRatio > 1) // Reset
{
this.widthRatio = 0;
}
var size = this.RenderTarget.Size;
float width = (float)((size.Width / 3.0) * this.widthRatio);
var ellipse = new D2D.Ellipse(new D2D.Point2F(size.Width / 2.0f, size.Height / 2.0f), width, size.Height / 3.0f);
var rect = new D2D.RectF();
rect.Height = size.Height;
rect.Width = size.Width;
rect.Top = 0;
rect.Left = 0;
// This draws the ellipse in red on a semi-transparent blue background
this.RenderTarget.BeginDraw();
this.RenderTarget.Clear(new D2D.ColorF(0, 0, 0, 1f));
this.RenderTarget.FillEllipse(ellipse, this.redBrush);
// Draw a little FPS in the top left corner
string text = string.Format("FPS {0}", this.fps);
this.RenderTarget.DrawRectangle(rect, redBrush, 10f);
this.RenderTarget.DrawText(text, this.textFormat, new D2D.RectF(10, 10, 100, 20), this.whiteBrush);
// All done!
this.RenderTarget.EndDraw();
}
我认为问题是由于 WPF 在调整大小时无法调整 D3D10 图像的大小。有什么办法可以解决这个问题吗
最后我找到了一个很简单的答案。 Direct2D 控件只不过是一个普通的图像控件。问题是图像无法及时调整大小。我给定的代码使用 DispatcherTimer
调整了图像的大小,这会导致延迟。所以我将 ResizeTimerTick()
函数中的代码复制到一个新的 public 函数,并在我的 window 上的 OnSizeChanged()
事件中调用了该函数。这是我使用过的代码。
public void onResize() {
if (this.Scene != null) {
// Check we don't resize too small
int width = Math.Max(1, (int) this.ActualWidth);
int height = Math.Max(1, (int) this.ActualHeight);
this.Scene.Resize(width, height);
this.imageSource.Lock();
this.imageSource.SetBackBuffer(this.Scene.Texture);
this.imageSource.Unlock();
this.Scene.Render();
}
}
在 MainWindow.cs:
private void Window_SizeChanged(object sender, SizeChangedEventArgs e) {
d2DControl.onResize();
}
注意:此方法消耗的内存稍微多一点(差不多74MB)
我正在开发一个 WPF 应用程序,它使用 DirectX 为我的应用程序绘制背景和边框。我使用了这里的代码:Using Direct2D with WPF
代码工作正常,但是当我绘制一个矩形并且没有填充矩形时,在调整大小时它会模糊。 这是问题的截图。
window 周围的红色边框是我绘制的矩形。我对代码所做的唯一更改如下:
protected override void OnRender() {
// Calculate our actual frame rate
this.frameCount++;
if (DateTime.UtcNow.Subtract(this.time).TotalSeconds >= 1) {
this.fps = this.frameCount;
this.frameCount = 0;
this.time = DateTime.UtcNow;
}
// This is what we're going to draw. We'll animate the width of the
// elipse over a span of five seconds (ElapsedTime / 5).
this.widthRatio += this.ElapsedTime / 5;
if (this.widthRatio > 1) // Reset
{
this.widthRatio = 0;
}
var size = this.RenderTarget.Size;
float width = (float)((size.Width / 3.0) * this.widthRatio);
var ellipse = new D2D.Ellipse(new D2D.Point2F(size.Width / 2.0f, size.Height / 2.0f), width, size.Height / 3.0f);
var rect = new D2D.RectF();
rect.Height = size.Height;
rect.Width = size.Width;
rect.Top = 0;
rect.Left = 0;
// This draws the ellipse in red on a semi-transparent blue background
this.RenderTarget.BeginDraw();
this.RenderTarget.Clear(new D2D.ColorF(0, 0, 0, 1f));
this.RenderTarget.FillEllipse(ellipse, this.redBrush);
// Draw a little FPS in the top left corner
string text = string.Format("FPS {0}", this.fps);
this.RenderTarget.DrawRectangle(rect, redBrush, 10f);
this.RenderTarget.DrawText(text, this.textFormat, new D2D.RectF(10, 10, 100, 20), this.whiteBrush);
// All done!
this.RenderTarget.EndDraw();
}
我认为问题是由于 WPF 在调整大小时无法调整 D3D10 图像的大小。有什么办法可以解决这个问题吗
最后我找到了一个很简单的答案。 Direct2D 控件只不过是一个普通的图像控件。问题是图像无法及时调整大小。我给定的代码使用 DispatcherTimer
调整了图像的大小,这会导致延迟。所以我将 ResizeTimerTick()
函数中的代码复制到一个新的 public 函数,并在我的 window 上的 OnSizeChanged()
事件中调用了该函数。这是我使用过的代码。
public void onResize() {
if (this.Scene != null) {
// Check we don't resize too small
int width = Math.Max(1, (int) this.ActualWidth);
int height = Math.Max(1, (int) this.ActualHeight);
this.Scene.Resize(width, height);
this.imageSource.Lock();
this.imageSource.SetBackBuffer(this.Scene.Texture);
this.imageSource.Unlock();
this.Scene.Render();
}
}
在 MainWindow.cs:
private void Window_SizeChanged(object sender, SizeChangedEventArgs e) {
d2DControl.onResize();
}
注意:此方法消耗的内存稍微多一点(差不多74MB)