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

网站做问卷调查的问题wordpress 基础seo建站

网站做问卷调查的问题,wordpress 基础seo建站,网页访问紧急升级,前几年很火的网站建设公司Slate 组件问题排查总结简介首先是一个工作中遇到的BUG#xff1a; 用slua添加子节点到父节点上的时候#xff0c;第二次打开无法显示对应的子节点Widget。对应Lua代码如下local comboBox ui_manager.ShowUI(ui_manager.UI_Config.ui_coupon_combobox,2,price,buyUIInfo.sho…Slate 组件问题排查总结简介首先是一个工作中遇到的BUG 用slua添加子节点到父节点上的时候第二次打开无法显示对应的子节点Widget。对应Lua代码如下local comboBox ui_manager.ShowUI(ui_manager.UI_Config.ui_coupon_combobox,2,price,buyUIInfo.shopInfo.id)if comboBox thenself:AttachChildWindow(ScaleBox_Coupon,comboBox)end因为我们引入了UI对象的内存池概念很自然而然的想到了缓存住的控件是不是释放有问题。检查slua的release代码之后发现没有任何问题。基于ScaleBox 只能有1个子物体这一个机制在猜测BUG原因的时候尝试用CanvasPanel替换ScaleBox组件。发现果然能解决这个问题。但是也带来了2个新问题1、ScaleBox子物体在第一次关闭和第二次打开的时候经历了什么2、为什么CanvasPanel就可以而ScaleBox不可以为了解决以上疑问开启我们的排查过程。为了能使大家更好的了解这个流程先对Slate组件创建销毁流程进行介绍。Slate组件创建销毁流程1、将我们日常使用的一个组件ScaleBox拆出来看如下图有如下的对应关系。里面包含了 UScaleBox,UScaleBoxSlot,SscaleBox 。2、创建过程3、销毁过程问题排查针对ScaleBox进入断点调试。在第一次关闭界面的时候发现UscaleBox Release 有正常跑到下面代码部分。void UScaleBox::ReleaseSlateResources(bool bReleaseChildren){Super::ReleaseSlateResources(bReleaseChildren);MyScaleBox.Reset();}但是在第二次打开的时候发现没有进入RebuildWidgetSwidget的实例化部分也就是下面代码部分TSharedRefSWidget UScaleBox::RebuildWidget(){MyScaleBox SNew(SScaleBox).SingleLayoutPass(bSingleLayoutPass);if ( GetChildrenCount() 0 ){CastCheckedUScaleBoxSlot(GetContentSlot())-BuildSlot(MyScaleBox.ToSharedRef());}return MyScaleBox.ToSharedRef();}这是为什么呢 原来在UWidget的BUILD过程中有一个查找共享指针MyWidget的操作。这个指针虽然被UscaleBox Reset了一次。但是在ScaleBox 第二次打开时候这个指针依然存在引用。所以该实例并没有被销毁。那么在第二次打开的时候由于没有走RebuildWidget。导致了子类UScaleBox 的指针引用已经被销毁在AddChild时候调用添加了个空Object。下图代码部分TSharedRefSWidget UWidget::TakeWidget_Private(ConstructMethodType ConstructMethod){bool bNewlyCreated false;TSharedPtrSWidget PublicWidget;// If the underlying widget doesnt exist we need to construct and cache the widget for the first run.if (!MyWidget.IsValid()){PublicWidget RebuildWidget();#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST) ensureMsgf(PublicWidget.Get() ! SNullWidget::NullWidget.Get(), TEXT(Dont return SNullWidget from RebuildWidget, because we mutate the state of the return. Return a SSpacer if you need to return a no-op widget.));#endifMyWidget PublicWidget; bNewlyCreated true;}else{PublicWidget MyWidget.Pin();}那这个指针是被谁Hold住了呢 经过排查与调试发现是被UScaleBoxSlot给Hold住了导致了这份资源没有被释放。为什么在UScaleBox中的共享指针已经释放了但是UScaleBoxSlot所持有的相同指针没有被释放呢请看Slot释放的地方(下面代码模块:// If the child is a UserWidget, we should let it manage its own slate resources instead of forcing a clear here. This fixes issues such as UE-39106if (PanelSlot-Content !PanelSlot-Content-IsAUUserWidget()){const bool bReleaseChildren true;PanelSlot-ReleaseSlateResources(bReleaseChildren);}UE的注释写的很清楚了我们所Add 的子物体正是UserWidget 界面。在UE-39106版本中让UserWidget 的Slate释放控制交给了上层。在这里没有自动释放。下面是UE 39106的改动链接。https://issues.unrealengine.com/issue/UE-39106虚幻引擎UE为了补锅一个slate 被释放的问题导致了这个新问题。 我们上层缓存了这份实例销毁子物体的时候调用了RemoveFromParent。在ScaleBox被销毁的时候因为其子物体为userwidget,而不去释放PanelSlot的SlateResourse。那么在第二次打开的时候因为PanelSlot中共享指针的存在没有New一份新的子物体实例。OK问题定位了。那么之前提到的第二个问题为什么换成CanvasPanel就没有这个问题了呢既然查到了在ScaleBox 中是 ScaleBoxSlot 的指针Hold住了这份资源那么我们去CanvasPanel对应的Slot 看一下。下面代码void UCanvasPanelSlot::BuildSlot(TSharedRefSConstraintCanvas Canvas){Slot Canvas-AddSlot()[Content nullptr ? SNullWidget::NullWidget : Content-TakeWidget()];SynchronizeProperties();}明显可以看出原来CanvasPanelSlot 在Build过程中没有缓存那份实例只是做了常规引用在上面有贴出过ScaleBoxSlot build 过程的代码。所以就是ScaleBoxSlot 存住了这份指针而CanvasPanelSlot 并没有。所以在都没有Release对应掉这份资源的情况下CanvasPanel会走rebuild过程而ScaleBox不会到这里我们基本上就定位出了问题全部原因所在。解决办法这里想到了4种解决方案,都能解决这个问题这里简单说一下1、不判断指针是否还存在引用全部走Rebuild过程。2、在Remove判断是否为UserWidget过程中对本身PanelSlot做一次释放。3、删除UScaleBoxSlot中对SscaleBox指针的引用。4、将UScaleBoxSlot中的共享引用改为弱引用。第一种风险较大因为所有UMG都会走的创建过程不太保险。第二种风险小于第一种但是也在所有UMG都会走的创建过程不太保险。第三种和第四种个人感觉都是有效的方案总的来看还是第四种改动小并优雅一点。所以目前采用了第四种。
http://www.huolong8.cn/news/282246/

相关文章:

  • 一个云主机怎么挂两个网站邯郸信息港手机版
  • 做推广网站排名工商管理网站
  • 保定专业做网站的公司哪家好重庆高端网站设计
  • 做网站百度百科国内免备案空间
  • 万能视频解析接口网站怎么做织梦(dedecms)怎么修改后台网站默认"织梦内容管理系统"标题
  • 网站开发的框架协议网站建设600元包
  • 空间站免费版下载微信营销手机网站模板
  • 有专业做网站的吗gre考网站厨师短期培训班
  • 设置网站域名郑州设计工作室
  • 做一个简单的网站多少钱嵌入式开发软件有哪些
  • 海外域名提示风险网站吗义乌网站建设软件开发
  • 专业做能源招聘的网站如何做行业平台网站
  • 网站建设岗位将来有什么发展微信网站设计尺寸
  • 网站建设规划方案包括做同城特价的网站有哪些
  • 临沂市建设官方网站长沙有哪些网站建设公司
  • 天津铁路建设投资控股(集团)网站个人域名可以做公司网站么
  • wordpress绑域名咋弄seo的基础优化
  • 做网站你给推广网站流量排名查询工具
  • 注册网站入口深圳企业网站制作流程
  • 网站插件代码公司长沙建站
  • 广东工程建设监理有限公司网站seo怎么做优化工作
  • 做服装最好的网站温州建设管理处网站
  • 白云网站建设价格上海空灵网站设计
  • 网站文件大小怎么更改网站首页图片
  • 建筑公司网站首页图片建站之星破解版下载
  • 建国内外网站有什么区别西安最新活动轨迹
  • 云主机可以放几个网站做外贸必应网站产品曝光
  • 建设网官方网站开发网站用什么软件
  • 成都网站建设技术安徽平台网站建设设计
  • 网站开发一般用哪个浏览器wordpress伪静态linux