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

UE小:UE5的Pixelstreaming在捕获画面的时候没办法显示非Viewport的Slate区域按钮的ToolTip

原始代码

首先,让我们看看原始代码片段:

// Some widgets might want to provide an alternative Tooltip Handler.
if (bCanSpawnNewTooltip || !NewTooltip)
{
    TSharedPtr<SWidget> NewTooltipWidget = NewTooltip ? NewTooltip->AsWidget() : TSharedPtr<SWidget>();
    for (int32 WidgetIndex = WidgetsToQueryForTooltip.Widgets.Num() - 1; WidgetIndex >= 0; --WidgetIndex)
    {
        const TSharedRef<SWidget>& CurWidget = WidgetsToQueryForTooltip.Widgets[WidgetIndex].Widget;
        if (CurWidget->OnVisualizeTooltip(NewTooltipWidget))
        {
            // Someone is taking care of visualizing this tooltip
            NewTooltipVisualizer = CurWidget;
            break;
        }
    }
}

修改后的代码

现在,我们来看一下修改后的版本:

// Some widgets might want to provide an alternative Tooltip Handler.
if (bCanSpawnNewTooltip || !NewTooltip)
{
    TSharedPtr<SWidget> NewTooltipWidget = NewTooltip ? NewTooltip->AsWidget() : TSharedPtr<SWidget>();
#if (UE_BUILD_SHIPPING || UE_BUILD_DEBUG)
    FVector2D WindowInitialDesiredSize =  SlateApp.GetTopLevelWindows()[0]->GetInitialDesiredSizeInScreen();
    FVector2D  ViewportSize = SlateApp.GetTopLevelWindows()[0]->GetViewport()->GetSize();
    FWidgetPath WidgetsUnderCursor = SlateApp.LocateWindowUnderMouse(FVector2D (ViewportSize.X-170,63), SlateApp.GetInteractiveTopLevelWindows(), /*bIgnoreEnabledStatus =*/true, UserIndex);
    for (int32 WidgetIndex = WidgetsUnderCursor.Widgets.Num() - 1; WidgetIndex >= 0; --WidgetIndex)
    {
        const TSharedRef<SWidget>& CurWidget = WidgetsUnderCursor.Widgets[WidgetIndex].Widget;
        if (CurWidget->OnVisualizeTooltip(NewTooltipWidget))
        {
            // Someone is taking care of visualizing this tooltip
            NewTooltipVisualizer = CurWidget;
            break;
        }
    }
#else
    for (int32 WidgetIndex = WidgetsToQueryForTooltip.Widgets.Num() - 1; WidgetIndex >= 0; --WidgetIndex)
    {
        const TSharedRef<SWidget>& CurWidget = WidgetsToQueryForTooltip.Widgets[WidgetIndex].Widget;
        if (CurWidget->OnVisualizeTooltip(NewTooltipWidget))
        {
            // Someone is taking care of visualizing this tooltip
            NewTooltipVisualizer = CurWidget;
            break;
        }
    }
#endif
}

主要原因

主要看当前的要显示ToolTip的区域是否有一个SVirtualWindow,如果有就将ToolTip显示在SVirtualWindow之内就行,否则的话NewTooltipVisualizer将不会赋值,导致的后果就是他会新生成一个SWindow,独立于Pixelstreaming的TargetWindow,而Pixelstreaming只捕获TargetWindow画面,所以导致看到的画面中没有ToolTip并且伴随着闪烁,如果显卡能力稍弱一点可能会导致崩溃

image.png

image.png

解决的办法

就是将调用显示ToolTip的逻辑中插入每次都检测一个固定位置,这个固定位置是一定包含SVirtualWindow的就行(比如我就是将WidgetsToQueryForTooltip替换为了我自己通过位置检测的位置获得的FWidgetPath,这个位置是在Viewport中放置的一个按钮)


http://www.kler.cn/news/356972.html

相关文章:

  • 51单片机的仓库管理系统【proteus仿真+程序+报告+原理图+演示视频】
  • 一次使用LD_DEBUG定位问题的经历
  • 【论文速读】|PROMPTFUZZ:利用模糊测试技术对大语言模型中的提示注入进行鲁棒性测试
  • 文本数据可视化
  • Kettle9.4支持Clickhouse数据源插件开发以及性能测试
  • 基于因果推理的强对流降水临近预报问题研究
  • adb使用命令记录
  • hadoop启动的命令
  • 【LeetCode算法笔记】Day1:动态规划基础
  • 【CTF-SHOW】Web入门 Web14 【editor泄露-详】【var/www/html目录-详】
  • JavaScript 第22章:SVG 与矢量图形
  • Redis Search系列 - 第三讲 拼写检查
  • CentOS 8 Stream环境下通过yum安装Mysql
  • Spring MVC文件请求处理-MultipartResolver
  • 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-19
  • 通过监控和警报驯服人工智能野兽
  • HL7协议简介及其在STM32上的解析实现
  • [计算机视觉]chapter1
  • Django 序列化serializers
  • 聊聊Go语言的异常处理机制