Winパッケージでモニタが対応していない解像度を指定してフルスクリーン起動すると指定した解像度情報が失われる

お世話になっております。

仕様かもしれないのですが、解像度を指定した起動で挙動に一貫性がない部分を発見したのでご連絡です。

2Kモニタで確認しております。

手順

  • 新規BlankプロジェクトでC++のプロジェクトを作成します(PkgTest_UE5_8)
  • Win64/Devでパッケージを作成します
  • 以下のコマンドで起動します
    • フルスクリーン
      • PkgTest_UE5_8.exe -fullscreen -ResX=3840 -ResY=2160
    • ウインドウ
      • PkgTest_UE5_8.exe -windowed -ResX=3840 -ResY=2160

結果

4K解像度指定でフルスクリーンモードで起動した場合

  • 2K解像度にフォールバックされます
  • F11でウインドウモードに切り替えると、指定した解像度ではなくUGameEngine::DetermineGameWindowResolution()で計算されたモニタより小さい解像度で表示され、ユーザーが指定した解像度情報が失われます

4K解像度指定でウインドウモードで起動した場合

  • 4K解像度で表示されます
  • F11でフルスクリーンモードに切り替えると2K解像度になります
  • もう一度F11でウインドウモードに切り替えると、4K解像度にもどります

他に-forceresというオプションがあるので、これが解像度を強制固定するオプションかと思いましたが、このオプションを付けるとさらにややこしい状態になったので、いったん省いた状態で確認しています。

よろしくお願いいたします。

[Attachment Removed]

お世話になっております。

フルスクリーン時にモニタ対応の解像度へ丸める動作自体は仕様です。

ただ、丸めた後の値がUGameEngine::CreateGameWindow()からGSystemResolutionへ書き戻されるため、指定された解像度は起動時点で失われます。ユーザーが指定した値を保持しておく場所がエンジン側にありません。

F11の切り替えでは、UGameViewportClient::HandleToggleFullscreenCommand()がMonitor.DisplayRectで解像度を上書きしたうえで、bUseWorkAreaForWindowed=trueを渡してDetermineGameWindowResolution()を呼びます。この場合の上限がワークエリアになるので必ずクランプが走り、GenerateConvenientWindowedResolutions()の縮小サイズが採用されます。モニタより小さくなるのはこれが原因です。

-ForceResはクランプを外すだけで、上記の上書きには効きません。挙動が分かりにくくなるのはそのためです。

そのため、-ResXと-ResYの指定値をF11の切り替えを跨いで保持することは現状できません。

一点お願いがあります。ソース上は-windowedでの起動も同様にクランプされるはずなのですが、4Kで表示されるとのことでした。モニタのネイティブ解像度、デスクトップの解像度、起動ログに出ている実解像度をお知らせいただけますでしょうか。

お手数ですが、よろしくお願いいたします。

[Attachment Removed]

お返事ありがとうございます。

あらためてテストしたところおっしゃる通りフルスクリーンから起動しても、ウインドウモードから起動しても、モニタ解像度より大きい場合は小さい解像度にフォールバックしていました。

テストしていたコマンドを見ると-forceresもテストしていたので、おかしいと感じたときは-forceresを使用していたようです。

挙動がおかしいというのは私の勘違いでした、混乱させてしまい申し訳ありませんでした。

forceresを使用することはないと思うので、現状の仕様で問題なさそうです。

また違和感を感じたときは改めてご相談させていただきます。

こちらメモ書きとして残しておきますが、

PkgTest_UE5_8.exe -windowed -forceres -ResX=3840 -ResY=2160

とforceresを使用したときは4Kサイズのように表示されていますが内部解像度は2Kでした。

ウインドウだけがなぜか4Kサイズになるようです。

[Attachment Removed]