Kagamia / WzComparerR2

Maplestory online Extractor
MIT License
406 stars 132 forks source link

MapRender 在高于 1920 x 1080 分辨率的显示器下,不会以 1920x1080 的分辨率窗口化 #251

Closed HikariCalyx closed 2 months ago

HikariCalyx commented 6 months ago

image 例如这是 3840 x 2160 的显示器,MapRender 将渲染分辨率调到 1920 x 1080 后,不会正常窗口化,而是直接在左上角显示无边框的画面。 不知道 MapRender 调整分辨率的时候,能否读取一下显示器本身的分辨率?主要是为了以防用户使用低于 1920 x 1080 分辨率的显示器,例如 1366 x 768。

总之需求就是:

HikariCalyx commented 6 months ago

目前通过修改 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: image

2560 x 1440: image

3440 x 1440: image

3840 x 2160: image

Kagamia commented 6 months ago

第一张图明显出现了程序api aware行为的不一致,程序没有识别到显示器最大显示区域是3840,而仅仅识别到了一半,建议对比不一样的dpiaware行为后重新汇报一次。 6S2C9P1B 6 $_BLB1H9CL_H

关于扩展窗口化分辨率支持,我赞同。可以给出您新增这几个分辨率的依据吗?

HikariCalyx commented 6 months ago

第一张图明显出现了程序api aware行为的不一致,程序没有识别到显示器最大显示区域是3840,而仅仅识别到了一半,建议对比不一样的dpiaware行为后重新汇报一次。 6S2C9P1B 6 $_BLB1H9CL_H

关于扩展窗口化分辨率支持,我赞同。可以给出您新增这几个分辨率的依据吗?

  1. 我是调到100% DPI 下使用的,所以应该跟这个无关。后续我再来尝试一下。 在 20240113 .NET6.0 版本下,可以正常捕捉到 3840x2160 的分辨率,但是却直接跳过了 1920x1080 的选项。 image

  2. New Age 更新后,游戏支持以下分辨率:800x600, 1024x768, 1280x720, 1366x768, 1920x1080, 1920x1200, 2560x1440, 2560x1600, 2732x1536, 3840x2160。我自己的改动中的3440x1440只是为了验证这种修改的可行性。这种改动在用户使用低于1920x1200分辨率的显示器的状态下可能不合理。 image

Kagamia commented 6 months ago

我有接到评论,游戏中真实最大分辨率只有1366768,而更高的分辨率显示内容都是对1366768的等比放大,并非pixel-perfect,也不会显示更大的地图范围,对于最新游戏版本这是事实嘛?

如果是的话,我觉得wc目前没有任何修改的必要(仅仅是必要,如果需要的话当然您可以本地修改),这会带来显著的背景布局问题,wc的大部分行为设计还是要尊重游戏本身的来。

HikariCalyx commented 6 months ago

我有接到评论,游戏中真实最大分辨率只有1366_768,而更高的分辨率显示内容都是对1366_768的等比放大,并非pixel-perfect,也不会显示更大的地图范围,对于最新游戏版本这是事实嘛?

的确如此。 1920x1080的游戏内容大概是1366x768 140%缩放,UI本身还是100%(开启界面优化的前提下)。以下截图均来自 CMS V205。 image

2560x1440是1280x720的200%缩放,UI本身200%、2732x1536的游戏元素是1366x768的200%缩放,UI本身200%、3840x2160是1366x768的280%缩放,UI本身200%。以下仅展示2732x1536。 image

如果是的话,我觉得wc目前没有任何修改的必要(仅仅是必要,如果需要的话当然您可以本地修改),这会带来显著的背景布局问题,wc的大部分行为设计还是要尊重游戏本身的来。

鉴于此,我认为至少还可以加入 1280x720 这一个选项,这个分辨率是肯定pixel-perfect的。 image