我正在开发一个使用WPF 4.6.2和Direct3D 11的CAD应用程序,它们通过D3DImage互操作。当在4K 3840x2160显示器上最大化窗口时,应用程序渲染3D内容非常慢,我得到大约1 FPS。我认为“嗯,屏幕上有太多的像素,这可能是正常的”。
然而,如果我调整窗口大小以使其不再最大化但只比最大化的小几个像素,则3D渲染工作正常,我得到大约20 FPS。相同的场景,相同的渲染设置,相同的一切,唯一的区别是全屏与窗口。
我的窗口使用自定义镶边,即 @Override
protected void onDraw(Canvas c) {
CanvasWidth = c.getWidth();
CanvasHeight = c.getHeight();
Paint myPaint = new Paint();
myPaint.setStyle(Paint.Style.FILL);
myPaint.setColor(getResources().getColor(R.color.colorTeal1));
myPaint.setStrokeWidth(10);
c.drawRect(160, 60, 800, 110, myPaint);
c.drawRect(160, 160, 250, 210, myPaint);
c.drawRect(160, 260, 400, 310, myPaint);
brush.reset();
brush.setColor(getResources().getColor(R.color.colorTeal1));
brush.setTextSize(36);
brush.setTypeface(Typeface.DEFAULT_BOLD);
c.drawText("1 Day:", 20, 100, brush);
c.drawText("2 Days:", 20, 200, brush);
c.drawText("3 Days:", 20, 300, brush);
brush.setColor(getResources().getColor(R.color.colorTeal3));
c.drawText("5", 167, 99, brush);
c.drawText("15", 167, 198, brush);
c.drawText("25", 167, 298, brush);
}
和自定义标题栏&系统按钮。我已将问题缩小到WindowChrome XAML的事情。
我认为问题是本机Win32窗口在这种状态下太大,甚至大于4K,需要剪切到屏幕上。 Spy ++为我的最大化窗口显示了以下矩形:<WindowChrome CornerRadius="0" GlassFrameThickness="0" UseAeroCaptionButtons="False" />
为什么(-11,-11)-(3851,2111), 3862x2122 (Maximized)
API会对我的窗口执行此操作?有没有办法让它尊重我的屏幕尺寸并停止调整窗口大小?
更新:好的,正如评论中所提到的,最大化的窗口大小比屏幕更大是正常的,我确认它仍然是没有自定义chrome的情况。
然而,不正常的是窗口客户端矩形大于屏幕。
在杀死Direct3D性能的错误状态下,该窗口的客户端矩形为SystemCommands.MaximizeWindow()
。
处于良好状态(但系统提供了chrome),客户端矩形为(-5,-6)-(3857,2166), 3862x2122
。