记一个Unity的异常问题

今天同事给我反馈了一个Unity使用ThreadStatic的问题,问题如下:

    [ThreadStatic]private static Dictionary<int, Mesh> dic;IEnumerator Start(){dic = new Dictionary<int, Mesh>();dic.Add(0, new Mesh());yield return Resources.UnloadUnusedAssets();Debug.Log(dic[0] == null);yield return null;}

这段代码,会打印true。也就是Resource.UnloadUnusedAssets会把持有引用的Mesh对象给回收掉。

如果去掉字典的ThreadStatic属性,就没有问题。

ThreadStatic会将静态字段标记为线程安全的,也就是每个线程将有一份自己的该字段存储。

我们推测,Resources.UnLoadUnsedAssets方法是在别的线程执行的,在那个线程里,垃圾收集器并没有检测到Mesh的引用,于是就把Mesh的Native内存给销毁了。这些目前还都支持推测,因为没有源码,也看不到具体的逻辑。

查了一些资料,最早Unity官方是有发文说,不要使用ThreadStatic,会引发Crash,不过我们用了也没有引发Crash。

所以目前成了一个有结论但不确定原因的技术问题了。

总而言之:

1、用可以用,但是只针对纯C#的数据结构进行使用。不要对继承自Unity.Ojbect的对象相关使用ThreadStatic标记

2、如果想要使用,可以在Resource.UnloadUnsedAssets之前写上一句

var refDic = dic;

即便只是局部变量对字典产生了引用,就又没有这个问题了。因为垃圾回收除了静态变量,Hirerachy里,还有调用栈上的引用。

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

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

相关文章

Flutter应用在苹果商店上架前的准备工作与注意事项

引言 &#x1f680; Flutter作为一种跨平台的移动应用程序开发框架&#xff0c;为开发者提供了便利&#xff0c;使他们能够通过单一的代码库构建出高性能、高保真度的应用程序&#xff0c;同时支持Android和iOS两个平台。然而&#xff0c;完成Flutter应用程序的开发只是第一步…

构建开源可观测平台

企业始终面临着确保 IT 基础设施和应用程序全年可用的压力。现代架构&#xff08;容器、混合云、SOA、微服务等&#xff09;的复杂性不断增长&#xff0c;产生大量难以管理的日志。我们需要智能应用程序性能管理 (APM) 和可观察性工具来实现卓越生产并满足可用性和正常运行时间…

算法错题本

这里写目录标题 错题本注意数据的耦合性对于无解情况的处理思路一组数据以0为结束标记&#xff0c;如何输入到数组中&#xff0c;并计数多个数据进行比较链表删除重复元素的启发循环体里谨慎写类型定义并初始化&#xff08;一般写上就是错&#xff09;队列中读取队尾元素数组当…

实现3D模型无变形的减面渲染方法---模大狮模型网

在进行3D模型渲染时&#xff0c;减面(或降面)是一种常用的优化技术&#xff0c;用于降低模型的复杂度&#xff0c;提高渲染效率。然而&#xff0c;在减面过程中&#xff0c;若不小心可能会引起模型的形变或细节丢失。模大狮将介绍一些方法和技巧&#xff0c;帮助您在减面渲染时…

在 Kubernetes 中使用 Traefik 作为入口点并将流量路由到您的应用程序服务

在 Kubernetes 中使用 Traefik 作为入口点并将流量路由到您的应用程序服务 您可以按照以下步骤操作&#xff1a; 1. 确保您已经在 Kubernetes 集群中部署了 Traefik。 在Kubernetes集群中部署Traefik&#xff0c;您可以按照以下步骤操作&#xff1a; 1. 创建一个Traefik C…

安卓主板MT8390(Genio 700)_MTK联发科Linux开发板方案

MediaTek Genio 700 &#xff08;MT8390&#xff09;是一款高性能的边缘 AI 物联网平台&#xff0c;专为智能家居、互动零售、工业与商业应用而设计。提供快速响应的边缘计算能力、先进的多媒体功能、广泛的传感器和连接方式&#xff0c;且支持多任务操作系统。 MT8390安卓核心…

IDA Pro *(_QWORD *)和*(_BYTE *)表达式解释

在IDA Pro&#xff08;一个交互式的反汇编器和调试器&#xff09;或其他类似的低级代码分析工具中&#xff0c;*(_QWORD *) 这种表达式通常用于类型转换和解引用。 这里的 _QWORD 通常表示一个64位的无符号整数类型&#xff08;在64位系统上&#xff09;。* 是解引用操作符&am…

在Linux或类Unix系统中获取帮助的命令

man <name>&#xff1a;该命令显示指定命令或主题的手册页面。例如&#xff0c;man ls 显示 ls 命令的手册页面。man <section> <name>&#xff1a;此命令允许你为手册页面指定一个部分编号。例如&#xff0c;man 2 open 显示位于手册第 2 部分的 open 系统调…

如何同时使用多个Gmail账号而不被关联?

您的业务活动需要多个 Gmail 帐户吗&#xff1f;出海畅游&#xff0c;Gmail账号是少不了的工具之一&#xff0c;可以关联到Twitter、Facebook、Youtube、Chatgpt等等平台&#xff0c;可以说是海外网络的“万能锁”。但是大家都知道&#xff0c;以上这些平台注册多账号如果产生关…

Linux:入门篇

文章目录 前言1. Linuxd的安装环境2.Linux的简单介绍2.1 新建目录2.2 新建文件 3.指令到底是什么&#xff1f;4.shell命令以及运行原理5.总结 前言 很多人对于Linux的学习总是感觉无法下手&#xff0c;不知道从何开始学习&#xff0c;相信这篇文章将会为你提供一个清晰的思路。…

如何在Python中实现多线程和多进程?

如何在Python中实现多线程和多进程&#xff1f; 在Python中&#xff0c;多线程和多进程是实现并发编程的两种主要方式。它们各自有其特点和适用场景。下面将分别介绍如何在Python中实现多线程和多进程&#xff0c;并探讨它们的优缺点。 一、多线程 Python的标准库提供了thre…

【SpringBoot整合系列】SpirngBoot整合EasyExcel

目录 背景需求发展 EasyExcel官网介绍优势常用注解 SpringBoot整合EaxyExcel1.引入依赖2.实体类定义实体类代码示例注解解释 3.自定义转换器转换器代码示例涉及的枚举类型 4.Excel工具类5.简单导出接口SQL 6.简单导入接口SQL 7.复杂的导出&#xff08;合并行、合并列&#xff0…

C++小代码

//新生训练 //欧几里得法求最大公约数 #include <bits/stdc.h> #include <iostream> #include <algorithm> using namespace std; int main(){int a,b;cin>>a>>b;int r a%b;while (r!0){a b;b r;r a%b;}cout<<b<<endl;return …

碧昂丝的新专辑《Cowboy Carter》是对人工智能音乐的反对声明

碧昂丝的《牛仔卡特》才发行几天&#xff0c;但很明显我们将在未来几年里谈论它——它打破了流媒体平台的记录&#xff0c;艺术家本人称其为“最好的音乐[她是 ] 做过。” 但在《牛仔卡特》的新闻稿中&#xff0c;碧昂斯出人意料地发表了反对人工智能在音乐中日益增长的声明。 …

音视频处理相关基础概念

1. RTP协议 RTP协议&#xff0c;即实时传输协议&#xff08;Real-time Transport Protocol&#xff09;&#xff0c;是一种用于实时传输音频和视频数据的协议。它运行在UDP协议之上&#xff0c;通过将音频和视频数据分成小的数据包&#xff0c;并添加一些头部信息&#xff08;…

mysql 本地电脑服务部署

前提&#xff1a; 下载mysql 新建配置文档 在安装mysql目录新建 my.ini [mysqld] # 设置3306端口 port3306#设置mysql的安装目录 basedirC:\Program Files\MySQL\MySQL Server 8.3 #切记此处一定要用双斜杠\\,单斜杠我这里会出错&#xff0c;不过看别人的教程&#xff0c;有…

Docker容器与虚拟化技术:OpenEuler 部署 Docker UI

目录 一、实验 1.环境 2.OpenEuler 部署 docker-compose-ui 2.OpenEuler 部署 docker ui 3.使用cpolar内网穿透 二、问题 1.docker run -w 的作用 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 系统架构版本IP备注LinuxopenEuler22.03 LTS SP2 192.168…

动态规划——计数类dp

例题&#xff1a;acwing900整数划分 完全背包解法 #include <iostream> #include <algorithm>using namespace std;const int N 1010, mod 1e9 7;int n; int f[N];int main() {cin >> n;f[0] 1;for (int i 1; i < n; i )for (int j i; j < n; …

Golang 哈希表底层实现原理

1、本文讨论Golang的哈希表 Golang哈希表的实现&#xff0c;底层数据结构是数组单链表&#xff0c;链表节点由8个key、value和键的高八位组成的。为了方便理解&#xff0c;先简单看一个图快速理解。 我们来看一下Golang哈希表的结构体定义 简单介绍一下结构体中几个关键的…

C#的await常用和扩展方法

await 是 C# 中用于等待异步操作完成的关键字。它通常与 async 一起使用&#xff0c;用于异步方法中等待异步操作的完成&#xff0c;并且在异步操作完成后&#xff0c;恢复执行该方法。 下面是对 await 的详细介绍以及一些示例代码&#xff1a; 1. 基本用法&#xff1a; await…