WzComparerR2
WzComparerR2 copied to clipboard
MapRender 在高于 1920 x 1080 分辨率的显示器下,不会以 1920x1080 的分辨率窗口化
例如这是 3840 x 2160 的显示器,MapRender 将渲染分辨率调到 1920 x 1080 后,不会正常窗口化,而是直接在左上角显示无边框的画面。
不知道 MapRender 调整分辨率的时候,能否读取一下显示器本身的分辨率?主要是为了以防用户使用低于 1920 x 1080 分辨率的显示器,例如 1366 x 768。
总之需求就是:
- 在低于 1920 x 1080 分辨率的显示器下,不允许将 MapRender 调节到 1920 x 1080
- 在刚刚好 1920 x 1080 分辨率的显示器下,调节到 1920 x 1080 后使用无边框全屏模式
- 在高于 1920 x 1080 分辨率的显示器下,调节到 1920 x 1080 后使用正常的窗口模式
目前通过修改 WzComparerR2.MapRender\Camera.cs 和 WzComparerR2.MapRender\FrmMapRender2.cs 暂时解决了问题,但应该不是最理想的修改方式。
Camera.cs, ln 103
private void ChangeDisplayMode()
{
switch (this.displayMode)
{
case 0:
graphics.PreferredBackBufferWidth = 800;
graphics.PreferredBackBufferHeight = 600;
break;
case 1:
graphics.PreferredBackBufferWidth = 1024;
graphics.PreferredBackBufferHeight = 768;
break;
case 2:
graphics.PreferredBackBufferWidth = 1366;
graphics.PreferredBackBufferHeight = 768;
break;
case 3:
graphics.PreferredBackBufferWidth = 1920;
graphics.PreferredBackBufferHeight = 1080;
break;
case 4:
graphics.PreferredBackBufferWidth = 2560;
graphics.PreferredBackBufferHeight = 1440;
break;
case 5:
graphics.PreferredBackBufferWidth = 3440;
graphics.PreferredBackBufferHeight = 1440;
break;
case 6:
graphics.PreferredBackBufferWidth = graphics.GraphicsDevice.DisplayMode.Width;
graphics.PreferredBackBufferHeight = graphics.GraphicsDevice.DisplayMode.Height;
break;
default:
goto case 0;
}
graphics.ApplyChanges();
}
FrmMapRender2.cs, ln 1189:
private void SwitchResolution()
{
var r = (Resolution)(((int)this.resolution + 1) % 7);
SwitchResolution(r);
}
private void SwitchResolution(Resolution r)
{
Form gameWindow = (Form)Form.FromHandle(this.Window.Handle);
switch (r)
{
case Resolution.Window_800_600:
case Resolution.Window_1024_768:
case Resolution.Window_1366_768:
case Resolution.Window_1920_1080:
case Resolution.Window_2560_1440:
case Resolution.Window_3440_1440:
gameWindow.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle;
break;
case Resolution.WindowFullScreen:
gameWindow.SetDesktopLocation(0, 0);
gameWindow.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
break;
default:
r = Resolution.Window_800_600;
goto case Resolution.Window_800_600;
}
this.resolution = r;
this.renderEnv.Camera.DisplayMode = (int)r;
this.ui.Width = this.renderEnv.Camera.Width;
this.ui.Height = this.renderEnv.Camera.Height;
engine.Renderer.ResetNativeSize();
}
private IDisposable EventDisposable<TDelegate>(TDelegate arg, Action<TDelegate> action)
{
return new Disposable<TDelegate>(action, arg);
}
enum Resolution
{
Window_800_600 = 0,
Window_1024_768 = 1,
Window_1366_768 = 2,
Window_1920_1080 = 3,
Window_2560_1440 = 4,
Window_3440_1440 = 5,
WindowFullScreen = 6,
}
1920 x 1080:
2560 x 1440:
3440 x 1440:
3840 x 2160:
第一张图明显出现了程序api aware行为的不一致,程序没有识别到显示器最大显示区域是3840,而仅仅识别到了一半,建议对比不一样的dpiaware行为后重新汇报一次。
关于扩展窗口化分辨率支持,我赞同。可以给出您新增这几个分辨率的依据吗?
第一张图明显出现了程序api aware行为的不一致,程序没有识别到显示器最大显示区域是3840,而仅仅识别到了一半,建议对比不一样的dpiaware行为后重新汇报一次。
关于扩展窗口化分辨率支持,我赞同。可以给出您新增这几个分辨率的依据吗?
-
我是调到100% DPI 下使用的,所以应该跟这个无关。~~后续我再来尝试一下。~~ 在 20240113 .NET6.0 版本下,可以正常捕捉到 3840x2160 的分辨率,但是却直接跳过了 1920x1080 的选项。
-
New Age 更新后,游戏支持以下分辨率:800x600, 1024x768, 1280x720, 1366x768, 1920x1080, 1920x1200, 2560x1440, 2560x1600, 2732x1536, 3840x2160。我自己的改动中的3440x1440只是为了验证这种修改的可行性。这种改动在用户使用低于1920x1200分辨率的显示器的状态下可能不合理。
我有接到评论,游戏中真实最大分辨率只有1366768,而更高的分辨率显示内容都是对1366768的等比放大,并非pixel-perfect,也不会显示更大的地图范围,对于最新游戏版本这是事实嘛?
如果是的话,我觉得wc目前没有任何修改的必要(仅仅是必要,如果需要的话当然您可以本地修改),这会带来显著的背景布局问题,wc的大部分行为设计还是要尊重游戏本身的来。
我有接到评论,游戏中真实最大分辨率只有1366_768,而更高的分辨率显示内容都是对1366_768的等比放大,并非pixel-perfect,也不会显示更大的地图范围,对于最新游戏版本这是事实嘛?
的确如此。
1920x1080的游戏内容大概是1366x768 140%缩放,UI本身还是100%(开启界面优化的前提下)。以下截图均来自 CMS V205。
2560x1440是1280x720的200%缩放,UI本身200%、2732x1536的游戏元素是1366x768的200%缩放,UI本身200%、3840x2160是1366x768的280%缩放,UI本身200%。以下仅展示2732x1536。
如果是的话,我觉得wc目前没有任何修改的必要(仅仅是必要,如果需要的话当然您可以本地修改),这会带来显著的背景布局问题,wc的大部分行为设计还是要尊重游戏本身的来。
鉴于此,我认为至少还可以加入 1280x720 这一个选项,这个分辨率是肯定pixel-perfect的。