【真机Bug】异步加载资源未完成访问单例导致资源创建失败

news2024/9/24 5:25:02

1.错误表现描述

抽卡时,10抽展示界面为A。抽取内容可能是整卡或者碎片,抽到整卡,会有立绘展示和点击详情的按钮。
点击详情后出现详情页B。【此时界面A预制体被销毁,卡片数据进入数据缓存池】
点击页面B的返回按钮,单例的HuanLingRewardController读取DataPool的内容加载界面。
Bug表现:10抽的抽卡展示界面没有出现。
【P.S. 测试发现,问题在游戏引擎平台上没有任何问题,在真机中稳定复现
image.png

2.错误排查阶段

因为界面B没有显示,那么就可能有下面几种情况

  1. 界面B的最大一级预制体没有创建/或者被隐藏
  2. Grid下的每个Item可能没有被创建成功/或者被隐藏

通过对指定卡片的GameObject进行addWatches 监视 和 对于SetActive位置进行断点。
首先排除了,物品未被激活导致不显示的问题。

然后从返回按钮的点击事件回调,追踪了一下上下文结构。在机器适配过程中发现,代码中并没有专门为webgl编写相关的宏分支。那么初步可以判断问题不是出现在机型适配导致的。

接下来,我在CreateItem方法和HuanLingRewardController脚本的Awake和OnEnable阶段断点。
查看堆栈。追踪一下上下文。
image.png
在绘制界面的必经方法中打印了日志(真机调试,用日志输出)
然后。
对比正常创建10抽界面(第一次十抽后显示)和 详情页返回10抽界面(Bug不显示)的日志
image.png
上图为正常加载界面,可以看到碎片都成功加载了。
image.png
上图为不显示界面的情况。发现HuanLingRewardController.awake 阶段在showDrawResult后执行的。
看看awake做了什么事

 private void Awake()
    {
        Debug.LogWarning("HuanLingRewardController.Awake()执行了");
        m_Instance = this;
        if (!CheckUI()) return;
        m_LiHuiView.PlayFinished = OnPlayFinished;
        m_LiHuiView.UpdateActiveTips = OnUpdateActiveTips;
        m_AutoActiveTipsTweeners = m_AutoActiveTips.GetComponents<UITweener>();
        m_AutoActiveTips.gameObject.SetActive(false);
    }

他对Instance实例初始化了。
因为实际上awake在后面执行,所以此时m_Instace == null ,然后在if (!m_Instance) return; 返回了

 public static void ShowDrawResult(GC_SPIRITS_LOTTERY packet, bool playTweenAnimation = true)
    {
        Debug.LogWarning("ShowDrawResult执行了");
        if (!m_Instance) return;
        m_Instance.InnerShowDrawResult(packet, playTweenAnimation);
    }

3.错误分析

那么为什么作为单例的Controller的awake阶段会在他的静态方法执行后才初始化。
之前的写法是

 public static void ShowLastReward()
    {
        Debug.LogWarning("ShowLastReward()执行了");
        if (m_LastSpiritsLotteryPacket == null) return;
        ShowUI(SubPage.Reward,true);
        HuanLingRewardController.ShowDrawResult(m_LastSpiritsLotteryPacket);
    }

如果ShowUI是同步加载资源的话,是没有问题的但实际上showUI的基类会调用

private static bool DoShowUI(bool bSync, UIPathData pathData, OnOpenUIDelegate delOpenUI = null, object param = null)

 AssetManager.LoadUI(pathData.path, m_instance.LoadUIBundleFinish, pathData);
//主要是调用了LoadUI
pathData.onOpenUI = delOpenUI;
pathData.param = param;
AssetManager.LoadUI(pathData.path, m_instance.LoadUIBundleFinish, pathData);

而LoadAsset是一个异步加载的原型

public static void LoadAsset(BundleType type, string name, Action<IAssetRef, object> callback, object param)
    {
        if (string.IsNullOrEmpty(name))
            return;
#if USE_AB
        BundleTask task = new BundleTask(OnLoadRemoteAssetFinished);
        task.AddParam(param);
        task.AddParam(callback);
        task.Add(type, name);
        LoadBundle(task, AssetLoader.LoadQueueType.KEYRES);
#else
        if (RemoteBundleManager.IsRemoteBundle(type, name))
        {
            BundleTask task = new BundleTask(OnLoadRemoteAssetFinished);
            task.AddParam(param);
            task.AddParam(callback);
            task.Add(type, name);
            LoadBundle(task, AssetLoader.LoadQueueType.KEYRES);
        }
        else if (Zeus.Framework.Asset.LocalAssetStatus.Ready == Zeus.Framework.Asset.AssetManager.GetAssetStatus(GetAssetPath(type, name), GetAssetType(type)))
        {
            if (callback != null)
                callback(Zeus.Framework.Asset.AssetManager.LoadAsset(GetAssetPath(type, name), GetAssetType(type)), param);
        }
        else
        {
            Zeus.Framework.Asset.AssetManager.LoadAssetAsync(GetAssetPath(type, name), GetAssetType(type), callback, param);
        }
#endif
    }

说明代码逻辑是先生成的窗口预制体然后,去缓存池中读上一次抽卡保存的结果,然后加载数据刷新面板。
所以现在是异步加载未完成然后就调用了后续的静态方法导致被迫中止。

4.问题解决

所以

HuanLingRewardController.ShowDrawResult(m_LastSpiritsLotteryPacket);

刷数据的逻辑应该放在ShowUI 执行成功的回调函数里。
于是,给方法新增标记,判断是否是第二次加载

HuanLingRewardController.ShowDrawResult(m_LastSpiritsLotteryPacket, false);

ShowUI.cs中

public static void ShowUI(SubPage defaultPage,bool isSecondEnter = false)
    {
        // 针对绘卷UI进行特殊处理
        if (StoryScrollMainView.GetInstance())
        {
            StoryScrollMainView.GetInstance().NeedShowMenu = false;
        }

        if (StoryScrollSubView.GetInstance())
        {
            StoryScrollSubView.GetInstance().NeedShowMenu = false;
        }
        
        UIManager.ShowUI(UIInfo.HuanLingRoot, (isSuccess, _) =>
        {
            if (isSuccess && Instance)
            {
                Instance.OnShow(defaultPage);
            }
            if (isSecondEnter)
            {
                HuanLingRewardController.ShowDrawResult(m_LastSpiritsLotteryPacket, false);
            }
        });
    }

在UIManager.ShowUI 执行成功的回调中加入上述代码即可。
这样就保证了在界面预制体加载完成后,才会走刷数据的流程。
出现这样的问题也是因为,手机端异步加载资源的速度受到网络延迟,服务器结点的影响很大。用同步加载的逻辑去思考异步功能肯定是不行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024理解这几个安全漏洞,你也能做安全测试!

如今安全问题显得越来越重要&#xff0c;一个大型的互联网站点&#xff0c;你如果每天查看日志&#xff0c;会发现有很多尝试攻击性的脚本。 如果没有&#xff0c;证明网站影响力还不够大。信息一体化的背后深藏着各类安全隐患&#xff0c;例如由于开发人员的不严谨导致为Web应…

【计算复杂性理论】证明复杂性(九):命题鸽巢原理的指数级归结下界——更简短的证明

往期文章&#xff1a; 【计算复杂性理论】证明复杂性&#xff08;Proof Complexity&#xff09;&#xff08;一&#xff09;&#xff1a;简介 【计算复杂性理论】证明复杂性&#xff08;二&#xff09;&#xff1a;归结&#xff08;Resolution&#xff09;与扩展归结&#xff…

基于springboot实现二手图书交易平台系统项目【项目源码+论文说明】

基于springboot实现二手图书交易平台系统演示 摘要 本文讲述了基于B/S模式的校园二手交易网站统的设计与实现。所谓的校园二手交易网站统是通过网站推广互联企业的二手物品和技术服务&#xff0c;并使客户随时可以了解企业和企业的产品&#xff0c;为客户提供在线服务和订单处…

【2024最新版】我用python代码带你看最绚烂的烟花,浪漫永不过时!

2024年就快要到了&#xff0c;提前用python代码给自己做一个烟花秀庆祝一下。本次介绍的python实例是实现一个简易的烟花秀。 一、步骤分析 总的来说&#xff0c;要实现烟花秀的效果&#xff0c;需要以下几个步骤&#xff1a; 1.1、创建一个类&#xff0c;包含烟花各项粒子的…

Golang 调度器 GPM模型

Golang 调度器 GPM模型 1 多进程/线程时代有了调度器需求 在多进程/多线程的操作系统中&#xff0c;就解决了阻塞的问题&#xff0c;因为一个进程阻塞cpu可以立刻切换到其他进程中去执行&#xff0c;而且调度cpu的算法可以保证在运行的进程都可以被分配到cpu的运行时间片。这…

Springboot项目实战

文章目录 SpringBootVue后台管理系统所需软件下载、安装、版本查询Vue搭建一个简单的Vue项目 *Spring项目项目架构 SpringBootVue后台管理系统 学习视频&#xff1a; https://www.bilibili.com/video/BV1U44y1W77D/?spm_id_from333.337.search-card.all.click&vd_sourcec…

搜索算法(算法竞赛、蓝桥杯)--DFS迭代加深

1、B站视频链接&#xff1a;B25 迭代加深 Addition Chains_哔哩哔哩_bilibili 题目链接&#xff1a;Addition Chains - 洛谷 #include <bits/stdc.h> using namespace std; int n,d;//d为搜索的深度 int a[10005];//存储加成的序列bool dfs(int u){//搜索第u层 if(ud)r…

【论文阅读】基于图像处理和卷积神经网络的板式换热器气泡识别与跟踪

Bubble recognizing and tracking in a plate heat exchanger by using image processing and convolutional neural network 基于图像处理和卷积神经网络的板式换热器气泡识别与跟踪 期刊信息&#xff1a;International Journal of Multiphase Flow 2021 期刊级别&#xff1a;…

【Spring Boot 源码学习】BootstrapRegistry 初始化器实现

《Spring Boot 源码学习系列》 BootstrapRegistry 初始化器实现 一、引言二、往期内容三、主要内容3.1 BootstrapRegistry3.2 BootstrapRegistryInitializer3.3 BootstrapRegistry 初始化器实现3.3.1 定义 DemoBootstrapper3.3.2 添加 DemoBootstrapper 四、总结 一、引言 前面…

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 题目源码&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…

2024年腾讯云优惠政策_腾讯云TOP10优惠活动

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…

医学大数据|文献阅读|有关“胃癌+机器学习”的研究记录

目录 1.基于32基因特征构建的机器学习模型可有效预测胃癌患者的预后和治疗反应 2.胃癌患者术后90天死亡率的机器学习风险预测模型 3.使用机器学习模型预测幽门螺杆菌根除患者胃癌患病风险 4.利用初始内窥镜检查和组织学结果进行个性化胃癌发病率预测 1.基于32基因特征构建的…

马斯克指控OpenAI违背成立协议,要求恢复开源;Automattic否认向AI公司出售用户数据

&#x1f989; AI新闻 &#x1f680; 马斯克指控OpenAI违背成立协议&#xff0c;要求恢复开源 摘要&#xff1a;马斯克近日在旧金山高等法院对OpenAI及其CEO阿尔特曼提起诉讼&#xff0c;指控他们违反最初促进AI技术造福人类非营利方向的成立协议。马斯克声称&#xff0c;Ope…

租房招聘平台新篇章:Java+SpringBoot技术革新

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

探索数据结构:深入了解顺序表的奥秘

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元…

购买腾讯云服务器请先领取代金券,2024腾讯云优惠

腾讯云优惠代金券领取入口共三个渠道&#xff0c;腾讯云新用户和老用户均可领取8888元代金券&#xff0c;可用于云服务器等产品购买、续费和升级使用&#xff0c;阿腾云atengyun.com整理腾讯云优惠券&#xff08;代金券&#xff09;领取入口、代金券查询、优惠券兑换码使用方法…

C++真题列表

题目解析&#xff1a;RAM是闪存&#xff0c;只要一关机一拔电&#xff0c;就会丢失数据 题目解答&#xff1a;A 题目解析&#xff1a;TXT格式是文本文档 题目解答&#xff1a;B 题目解析&#xff1a;IP地址中每一个字节的取值范围是[0~255]&#xff0c;是不可能有256的 题目…

完美解决Iframe嵌入帆软报表出现跨域cookie写不进去的问题

随着google chrome对第三方cookie的限制越来越狠,现在发现之前使用iframe嵌入的帆软报表已经不好使了。官方现在解决iframe嵌入帆软报表出现跨域导致cookie写不进去的方案是主推 统一主域名的方案(谷歌浏览器单点登录失败- FineReport帮助文档 - 全面的报表使用教程和学习资料…

java 基础(核心知识搭配代码)

前言 java的学习分为了上部分以及下部分进行学习&#xff0c;上部分就是对于java的基础知识&#xff0c;面向对象上&#xff0c;面向对象下&#xff0c;异常操作&#xff0c;javaApi&#xff1b;下部主要是集合&#xff0c;泛型&#xff0c;反射&#xff0c;IO流&#xff0c;J…