当前位置: 首页 > news >正文

Unreal:多屏幕全屏后只有一个屏幕显示怎么办

这里讨论的是,多个屏幕时,用N卡的Surround融合为一个屏幕,当开始游戏后发生的问题

原因

这里的代码截图是Unreal5.3.2版本

当全屏时,会获得一个最大分辨率,这个分辨率是你主屏幕的分辨率,即使是通过Surround融合成了一个大屏,这里也只获取之前单屏的分辨率,这是造成这个问题的根本原因

然后就是这里,会检测命令行里有没有ForceRes,如果没有并且你设置的分辨率大于你的最大分辨率,也就是单屏分辨率,就强制设置为单屏分辨率,UE全屏有个问题,就是当你的分辨率不比单屏分辨率大的时候,强制使用一个屏幕,这个问题还没有找到在哪里
所有我们能做的最简单的处理办法就是让这里读到ForceRes,来避免使用单屏幕分辨率

修改方案

方案一:程序快捷方式后面加-Fullscreen,这个是默认全屏,但是有个问题,加了这个再设置为无边框时也只有一个显示器能用,所以如果程序只这是全屏可以使用这个方案
方案二:程序快捷方式后面加-ForceRes,这个是强制分辨率,这样就可以完美避免这个问题
方案三:如果说程序不方便使用添加快捷方式的解决办法,那可以找个合适的地方调用

FString CommandLine = FCommandLine::Get();CommandLine += " -ForceRes";FCommandLine::Set(*CommandLine);if(const UGameUserSettings* GameUserSettings = GEngine->GetGameUserSettings();GameUserSettings && GameUserSettings->GetFullscreenMode() == EWindowMode::Type::Fullscreen){const FIntPoint IntPoint = GameUserSettings->GetScreenResolution();GameUserSettings->RequestResolutionChange(IntPoint.X, IntPoint.Y, EWindowMode::Type::Fullscreen, true);}

我这里是加到了EngineSubsystem中,因为这个地方要尽可能的早
这里是把-ForceRes加入到命令行中,在下次修改为全屏的时候就可以检测到-ForceRes这个命令
下面的则是处理第一次,也就是游戏一开始时的状态,如果是全屏开始,则手动调用一下分辨率改变函数,来保证-ForceRes可以被应用

如何获取合适的分辨率

	Resolutions.Empty();ResolutionsFullscreen.Empty();ResolutionsWindowed.Empty();ResolutionsWindowedFullscreen.Empty();FDisplayMetrics InitialDisplayMetrics;FSlateApplication::Get().GetInitialDisplayMetrics(InitialDisplayMetrics);FScreenResolutionArray ResArray;RHIGetAvailableResolutions(ResArray, true);auto Screen = [&](const TFunctionRef<bool(FVector2f const& Point)>& Fn, TArray<TSharedPtr<FScreenResolutionEntry>>& ResolutionArray){for(const auto& [Width, Height, RefreshRate] : ResArray){if(Fn(FVector2f(Width, Height))){TSharedRef<FScreenResolutionEntry> Entry = MakeShared<FScreenResolutionEntry>();Entry->Width = Width;Entry->Height = Height;ResolutionArray.Emplace(Entry);}}};const FVector2f MinResolution(1280, 720);const FVector2f MaxResolution(InitialDisplayMetrics.PrimaryDisplayWidth, InitialDisplayMetrics.PrimaryDisplayHeight);const float AspectRatio = MaxResolution.X / MaxResolution.Y;int32 MaxResolutionX = InitialDisplayMetrics.PrimaryDisplayWidth;int32 MaxResolutionY = InitialDisplayMetrics.PrimaryDisplayHeight;if (InitialDisplayMetrics.MonitorInfo.Num() > 0){for (const FMonitorInfo& MonitorInfo : InitialDisplayMetrics.MonitorInfo){if (MonitorInfo.bIsPrimary){MaxResolutionX = MonitorInfo.MaxResolution.X;MaxResolutionY = MonitorInfo.MaxResolution.Y;if (MaxResolutionX == 0 || MaxResolutionY == 0){MaxResolutionX = MonitorInfo.NativeWidth;MaxResolutionY = MonitorInfo.NativeHeight;}break;}}}auto AddRes = [&](FVector2f Res){Res.X = MaxResolution.X * Res.Y / MaxResolution.Y;FScreenResolutionRHI RHI;RHI.Width = Res.X;RHI.Height = Res.Y;for(int32 i = 0; i < ResArray.Num(); ++i){if(ResArray[i].Width == RHI.Width && ResArray[i].Height == RHI.Height){return;}else if(ResArray[i].Width == RHI.Width && ResArray[i].Height > RHI.Height){ResArray.Insert(RHI, i);return;}else if(ResArray[i].Width > RHI.Width){ResArray.Insert(RHI, i);return;	}}ResArray.Push(RHI);};// 常用分辨率添加,并且适配多屏AddRes(FVector2f(1920, 1080));AddRes(FVector2f(2560, 1440));AddRes(FVector2f(3840, 2160));Screen([&](FVector2f const& Point)->bool{if(Point.X >= MinResolution.X && Point.Y >= MinResolution.Y && Point.X <= MaxResolution.X && Point.Y <= MaxResolution.Y&& AspectRatio == Point.X / Point.Y){return true;}return false;	},ResolutionsWindowed);Screen([&](FVector2f const& Point)->bool{if(Point.X >= MinResolution.X && Point.Y >= MinResolution.Y && Point.X <= MaxResolution.X && Point.Y <= MaxResolution.Y&& AspectRatio == Point.X / Point.Y && Point.X > MaxResolutionX){return true;}return false;	},ResolutionsFullscreen);Screen([&](FVector2f const& Point)->bool{if( Point.X == MaxResolution.X && Point.Y == MaxResolution.Y){return true;}return false;	},ResolutionsWindowedFullscreen);	

这个是在项目中拷贝出来的片段,仅供参考

http://www.hskmm.com/?act=detail&tid=40569

相关文章:

  • MyEMS 的智慧大脑:从能耗建模到预测性维护的全流程技术逻辑
  • Linux-按下开机键后,究竟发生了什么
  • 用Go语言从零开始开发一个Prometheus Exporter
  • AI基础概念扫盲:人工智能入门指南
  • K8s v1.2到v1.34:从容器编排到 AI/ML 的云原生未来
  • 根据名称排序(中文、英文、数字)等
  • 2025年贵州推拿正骨培训机构权威推荐榜单:小儿按摩培训/小儿推拿培训/穴位敷贴培训源头机构精选
  • Docker存储驱动OverLay2介绍
  • 2025年哈尔滨ISO环境体系认证渠道权威推荐榜单:辽宁ISO20000质量管理体系认证/沈阳ISO20000质量管理体系/大连ISO三体系认证源头公司精选
  • 2025.10.29——1绿1蓝
  • 2025年北京配电室试验方案公司权威推荐:天津配电室打压试验/河北配电室静电地板试验/石家庄配电室高压保护试验服务机构精选
  • ASP.NET Core Web API 需要先发布到 IIS 服务器才能运行
  • TPT-X-2025.09 焕新上线!汽车电子测试效率再升级,解决测试痛点!
  • Windows11由22H2升级至25H2后,VSCode出现“扩展主机意外终止”问题及解决
  • 2025年数控对头钻批发厂家权威推荐:数控龙门镗铣床/数控双面镗/数控双面镗铣床源头厂家精选
  • 设置E8流程中相关资源无法查看,防止附件被查看
  • GO_gorm
  • Air8000模块CAN接口硬件连接指南,来啦!
  • 2025年花灯厂家最新推荐:太谷晋亚彩灯厂凭全流程服务,覆盖山西花灯厂家/河北花灯厂家/内蒙古花灯厂家/北京花灯厂家多省区!
  • 【IEEE出版 | 快至会后3个月完成检索 | 会议历史优秀】第五届人工智能、机器人和通信国际会议(ICAIRC 2025)
  • 2025年10月兰花油品牌推荐榜:五大品牌综合对比与深度解析
  • 2025年河北注册公司系统权威推荐:衡水公司注册公司/河北企业注册优化/衡水公司注销方案服务平台精选
  • 2025年10月兰花油品牌推荐榜:五款精选产品深度对比与选购指南
  • 2025年专用管道式轴流风机工厂权威推荐:便捷壁式轴流风机/安全防爆轴流风机/耐高温特种轴流风机源头厂家精选
  • 2025标识标牌公司推荐排行榜:富盛达标识领跑行业
  • 2025年10月OKR管理系统推荐:五款优秀工具对比榜单
  • Java 循环结构
  • 2025年10月OKR管理系统推荐榜:五大工具横向对比与深度解析
  • [题解]CF1733E Conveyor
  • 2025年10月优立AI系统排行:权威机构测评数据全面解析