修复UE4编辑器,ClearLog操作导致的崩溃
UE4 4.24.3版本,编辑器Output Log窗口中,右键--Clear Log操作很大概率会导致编辑器奔溃;
解决办法:
相关文件:
Engine\Source\Developer\OutputLog\Private\SOutputLog.cpp
Engine\Source\Developer\OutputLog\Private\SOutputLog.h
SOutputLog.h文件中添加:
bool bNeedClearLog;
void DoClearLog();
SOutputLog.cpp文件修改:
void SOutputLog::Construct( const FArguments& InArgs ){
...
bNeedClearLog = false;
}
void SOutputLog::OnClearLog()
{
bNeedClearLog = true;
}
void SOutputLog::DoClearLog() {
if (bNeedClearLog)
{
// Make sure the cursor is back at the start of the log before we clear it
MessagesTextBox->GoTo(FTextLocation(0));
MessagesTextMarshaller->ClearMessages();
MessagesTextBox->Refresh();
bIsUserScrolled = false;
bNeedClearLog = false;
}
}
void SOutputLog::Tick(const FGeometry& AllottedGeometry, const double InCurrentTime, const float InDeltaTime)
{
DoClearLog();
...
}
分析:
先前的实际Clear代码是在OnClearLog()函数中调用的,这个函数应该是在鼠标点击事件调用栈中执行的;
将实际Clear代码移动到DoClearLog()函数中,并在Tick()函数中调用,也就是移动到渲染循环中执行;
通过bNeedClearLog标识,Tick中是否需要执行真正的Clear操作;
这些改动,在实际测试中证实能够避免ClearLog操作导致Editor奔溃
猜测原因:
之前会奔溃,猜测是鼠标事件调用和渲染不是在同一个线程中,而Clear操作,实际上在清理Log列表(一个TArray对象),会比较耗时;
另外,在Editor中可以观察到,当ClearLog所在的ContentMenu打开时,Eidtor World是处于暂停状态的,点击ClearLog,ContentMenu立即关闭,Eidtor World恢复运行状态;
这里面不知道有没有调用先后关系的问题,只能等以后对Slate框架源码有更多的认识才能知道;
#2020/9/8更新
今天在UE4 QQ群里面有讨论ClearLog导致Editor崩溃的问题,有人提到,奔溃原因是输入发导致;
目前使用的是Windows10自带的微软拼音输入法,在语言栏的设置中,打开输入设置界面,关闭里面的所有开关后,同样的操作Editor确实不再崩溃了
具体是那个输入法功能导致的Editor奔溃没有一一测试;
因为没有安装其他常用输入法,就没有一一测试了;
有需要的可以尝试关闭一些输入法功能试试看;
#2020/12/17更新
距离上次更新好长一段时间了
期间一直在忍受ClearLog奔溃的问题;9/8号更新的方法:调整输入法设置并不起多大作用,或者根本不起作用吧!这个奔溃问题本来也是有概率出现的bug;
前面的操作思路是把Clear动作跳过鼠标点击回调,延迟到tick中执行;
这几天稍微改动一下,基本思路是往后延迟几帧再执行Clear动作;
添加一个帧计数:
SOutputLog.h头文件中添加:
int frameCount;
SOutputLog.cpp文件修改:
void SOutputLog::OnClearLog()
{
bNeedClearLog = true;
frameCount = 3;
} void SOutputLog::DoClearLog()
{
if (frameCount > 0)
{
frameCount--;
}
else
{
if (bNeedClearLog)
{
// Make sure the cursor is back at the start of the log before we clear it
MessagesTextBox->GoTo(FTextLocation(0)); MessagesTextMarshaller->ClearMessages();
MessagesTextBox->Refresh();
bIsUserScrolled = false;
bNeedClearLog = false;
}
}
}
不同工程尝试过几次,貌似有效;至于是不是没碰到概率事件让时间来验证;
修复UE4编辑器,ClearLog操作导致的崩溃的更多相关文章
- 给虚拟机添加新硬盘并分区,fdisk查看分区,分区,重新读取分区表信息partprobe,格式化,挂载,查看分区挂载信息,自动挂载文件/etc/fstab,/etc/fstab文件错误导致重启崩溃后的修复
1.虚拟机关机断电 2.添加硬盘 2.开机 3.fdisk -l查看刚才新添加的硬盘 [root@localhost ~]# fdisk -l 磁盘 /dev/sda:21.5 GB, 2147483 ...
- 安装glibc错误链接导致系统崩溃,u盘启动紧急救援模式下修复系统。
Sln 命令 创建动态符号链接 用法 sln source dest 故障案例:一个误操作 导致了一个不小的故障,输入所有命令都无效,直接系统无法启动. 故障描述 sln /usr/lib64/l ...
- WPF 线程中异常导致程序崩溃
一般我们WPF中都加全局捕获,避免出现异常导致崩溃. Application.Current.DispatcherUnhandledException += Current_DispatcherUnh ...
- 解决方案-问题001:物理机、虚机等等Linux操作系统/usr/bin目录权限误操作,导致无法切换root
导语:平常运维人员会误操作一些目录权限,导致一些问题,那么如何恢复呢? 问题:物理机.虚机等等Linux操作系统/usr/bin目录权限误操作,导致无法切换root? 实验环境: ip地址 是否目录正 ...
- 如何规避容器内做Java堆dump导致容器崩溃的问题
写在前边 最近公司生产环境的容器云上出了个性能问题,为了做性能分析,使用 JDK 自带的 jmap 收集堆dump,出现了内存溢出导致了容器崩溃. 本篇文章将带你探究,如何规避容器内做堆 dump 导 ...
- 线程崩溃为什么不会导致 JVM 崩溃
大家好,我是坤哥 网上看到一个很有意思的据说是美团的面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但都没答到根本原因,所以决定答一答,相信大家看完肯定会有收获,本文分以下几 ...
- WCF:没有终结点在侦听可以接受消息的*这通常是由于不正确的地址或者 SOAP操作导致的。
没有终结点在侦听可以接受消息的 http://xx.com/WebService.svc. 这通常是由于不正确的地址或者 SOAP 操作导致的.如果存在此情况,请参见 InnerException 以 ...
- WCF: 没有终结点在侦听可以接受消息的 这通常是由于不正确的地址或者 SOAP 操作导致的。
问题: 由于我这里的wcf服务是采用“BasicHttpBinding”的方式,即安全绑定模式,客户端在引用这个服务后所生成的终结点配置(endpoint )就变成了<endpoint ...
- 客服端调用自定义宿主的WCF报错"没有终结点在侦听可以接受消息的http://localhost:8085/mex。这通常是由于不正确的地址或者 SOAP 操作导致的错误"的解决方案。
没有终结点在侦听可以接受消息的http://localhost:8085/mex.这通常是由于不正确的地址或者 SOAP 操作导致的错误. 这个错误是由于没有启动元数据交换终结点(MEX)导致的.在宿 ...
随机推荐
- (一)、Docker 简介
1.Docker镜像是什么? 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件. 2.Do ...
- 单片机I/O口推挽与开漏输出详解(力荐)
推挽输出:可以输出高,低电平,连接数字器件;推挽结构一般是指两个三极管分别受两互补信号的控制,总是在一个三极管导通的时候另一个截止. 开漏输出:输出端相当于三极管的集电极. 要得到高电平状态需要上拉电 ...
- Spring Cloud Alibaba 使用Nacos作为配置管理中心
为什么需要配置中心? 动态配置管理是 Nacos 的三大功能之一,通过动态配置服务,我们可以在所有环境中以集中和动态的方式管理所有应用程序或服务的配置信息. 动态配置中心可以实现配置更新时无需重新部署 ...
- Manacher算法 求 最长回文子串
1 概述(扯淡) 在了解Manacher算法之前,我们得先知道什么是回文串和子串. 回文串,就是正着看反着看都一样的字符串.比如说"abba"就是一个回文串,"abbc& ...
- 什么是SimpleNVR流媒体服务器软件?
SimpleNVR是一款新兴流媒体服务器应用软件,占用内存少,无插件.跨平台,应用非常广泛,操作简单易上手,同时还支持一键观看,十分便捷.另外,跟其他一般流媒体服务器不同,SimpleNVR支持开发者 ...
- C++ new 运算符 用法总结
C++ new 运算符 用法总结 使用 new 运算符 分配内存 并 初始化 1.分配内存初始化标量类型(如 int 或 double),在类型名后加初始值,并用小括号括起,C++11中也支持大括号. ...
- React + 导入模块的一个错误
导入模块的时候出现这个错误: Attempted import error: 'd3' does not contain a default export (imported as 'd3'). 把导 ...
- ES6模块化引入
//a.js 导出的关键字 export export let str = "laowang"; export function add(a,b){ return a + b ; ...
- M1配置php环境完整版(用于M1芯片的Mac中,php开发环境,比如wordpress、"或wp"、emlog pro、typecho等本地开发环境的配置)
因为macbook发布的M1是基于arm架构的,导致很多软件在短时间没无法兼容,其中包括php的很多集成开发环境软件.于是需要手动配置.网上的信息也是零七八碎,故制作了这个完整的教程. 本教程基于的m ...
- 《Python语言程序设计》【第1周】Python基本语法元素
实例:温度转化 #TempConvert.py 单行注释 ''' TemConvert.py ''' # 多行注释 TempStr = input("请输入带有符号的温度值: ") ...