【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器
文章目录
- 一、Unity资源加载的几种方式
- 1、Inspector窗口拖拽
- 2、Resources
- 3、AssetBundle
- 4、Addressables(可寻址资源系统)
- 5、AssetDatabase
- 二、准备
- 三、同步加载Resources资源
- 1、Resources.Load同步加载单个资源
- 1.1、基本加载
- 1.2、加载指定类型的资源
- 1.3、使用泛型加载指定类型的资源
- 2、Resources.LoadAll同步加载多个资源
- 2.1、基本加载
- 2.2、加载指定类型的资源
- 2.3、使用泛型加载指定类型的资源
- 四、异步加载Resources文件夹中的资源
- 五、封装一个Resources资源管理器
- 1、封装异步加载资源
- 2、封装同步加载资源
- 3、封装卸载资源方法
- 六、最终代码
- 完结
一、Unity资源加载的几种方式
1、Inspector窗口拖拽
- 在脚本中用public声明变量,然后在Inspector窗口把要加载的资源拖拽给该脚本的变量。
- 不建议在大型项目使用。在公司的项目也不要用。如果你是独立游戏开发者,则可以用。
- 不支持热更新。
2、Resources
- 用Resources.Load方法、Resources.LoadAsync方法、Resources.LoadAll方法来加载资源。
- 可以在商业项目使用,包括公司的项目。但是Resources文件夹中可以存放的资源有限,大概只能存储2G左右的资源,因此要谨慎使用。
- 不支持热更新。
3、AssetBundle
- 用AssetBundle.LoadFromXXX方法来加载资源。
- 商业项目常用的资源加载方案,如果你在公司做项目,则推荐用这种方式来加载资源。
- 效率比Resources加载高,占用内存小,正式发布游戏后,资源所占用的空间也小。
- 支持热更新。
4、Addressables(可寻址资源系统)
- 可以理解为高级的AssetBundle,资源管理由Unity内部自动完成。
- 但是目前还在发展中,可能有bug。主流的商业游戏都是使用AssetBundle来做资源加载的。
- 支持热更新。
5、AssetDatabase
- 用AssetDatabase.LoadAssetAtPath方法来加载资源。
- 仅限于编辑器模式,主要用于在编辑器模式下用代码更改本地文件。
- 游戏运行时不会用这种方案加载资源。
- 不支持热更新。
二、准备
使用前必须在项目中创建一个名叫Resources的文件夹,这个名字是固定的。

三、同步加载Resources资源
1、Resources.Load同步加载单个资源
1.1、基本加载
Resources.Load(string 要加载的资源的路径)
返回值是Object型。
如果有多个相同路径的资源,则只会返回找到的第一个资源。
调用案例
GameObject go = Resources.Load("Prefabs/Cube") as GameObject;
1.2、加载指定类型的资源
Resources.Load(string 要加载的资源的路径, System.Type 要加载的资源的类型的Type对象)
返回值是Object型。
如果有多个相同类型且相同路径的资源,则只会返回找到的第一个资源。
调用案例
GameObject go = Resources.Load("Prefabs/Cube", typeof(GameObject)) as GameObject;
1.3、使用泛型加载指定类型的资源
Resources.Load<要加载的资源的类型>(string 要加载的资源的路径)
返回值是T型。
返回值是要加载的资源的类型。如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。
调用案例
GameObject go = Resources.Load<GameObject>("Prefabs/Cube");
2、Resources.LoadAll同步加载多个资源
2.1、基本加载
Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径)
返回值是Object[]型。
同步加载Resources文件夹中指定路径的文件夹中的所有资源,包括其中子孙文件夹中的所有资源,然后返回到一个Object[]型数组。
如果该路径是一个文件,则只会加载该文件,并返回到一个Object[]型数组。如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。
调用案例
Object[] gos = Resources.LoadAll("Prefabs");
for (int i = 0; i < gos.Length; i++)
{Instantiate(gos[i] as GameObject);
}
2.2、加载指定类型的资源
Resources.LoadAll(string 要加载的资源的文件夹路径或文件路径,System.Type 要加载的资源的类型的Type对象)
返回值是Object[]型。
同步加载Resources文件夹中指定路径的文件夹中的指定类型的所有资源,包括其中子孙文件夹中的该类型的所有资源,然后返回到一个Object[]型数组。
如果该路径是一个该指定类型的文件,则只会加载该文件,并返回到一个Object[]型数组。如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。
调用案例
Object[] gos = Resources.LoadAll("Prefabs", typeof(GameObject));
for (int i = 0; i < gos.Length; i++)
{Instantiate(gos[i] as GameObject);
}
2.3、使用泛型加载指定类型的资源
Resources.LoadAll<泛型T类型>(string 要加载的资源的文件夹路径或文件路径)
返回值是T[]型。
同步加载Resources文件夹中指定路径的文件夹中的指定类型的所有资源,包括其中子孙文件夹中的该类型的所有资源,然后返回到一个T[]型数组。
如果该路径是一个该指定类型的文件,则只会加载该文件,并返回到一个T[]型数组。如果没有加载到任何资源,则返回一个没有任何元素的T[]型数组。
调用案例
GameObject[] gos = Resources.LoadAll<GameObject>("Prefabs");
for (int i = 0; i < gos.Length; i++)
{Instantiate(gos[i]);
}
四、异步加载Resources文件夹中的资源
Resources.LoadAsync异步加载单个资源方法
使用泛型加载指定类型的资源
Resources.LoadAsync<泛型T类型>(string 要加载的资源的路径)
返回值是ResourceRequest类型。
一般配合协程来使用。在协程中可以使用yield return来等待资源加载。
如果有多个相同路径的资源,则只会加载找到的第一个资源。
调用案例
void Start()
{StartCoroutine(LoadAsyncCoroutine());
}IEnumerator LoadAsyncCoroutine(){//开始异步加载资源ResourceRequest rr = Resources.LoadAsync<GameObject>("Prefabs/Cube");//等待资源加载完毕yield return rr;//加载完成执行逻辑Instantiate(rr.asset);
}
五、封装一个Resources资源管理器
1、封装异步加载资源
注意这个脚本依赖Mono管理器:【unity进阶知识2】Mono管理器
public class ResourcesManager : Singleton<ResourcesManager>
{/// <summary>/// 异步加载Resources文件夹中指定类型的资源/// </summary>public void LoadAsync<T>(string path, UnityAction<T> callback = null) where T : Object{MonoManager.Instance.StartCoroutine(LoadAsyncCoroutine(path, callback));}IEnumerator LoadAsyncCoroutine<T>(string path, UnityAction<T> callback = null) where T : Object{ResourceRequest resourceRequest = Resources.LoadAsync<T>(path);yield return resourceRequest;callback?.Invoke(resourceRequest.asset as T);}
}
调用,效果和前面一样
ResourcesManager.Instance.LoadAsync<GameObject>("Prefabs/Cube", Callback);void Callback(GameObject obj){Instantiate(obj);
}
或者
ResourcesManager.Instance.LoadAsync<GameObject>("Prefabs/Cube", (obj)=>{Instantiate(obj);
});
2、封装同步加载资源
同步加载封装虽然是一样的,但是好处是自己封装可以统一管理和进行自定义注释
/// <summary>
/// <para>同步加载Resources文件夹中指定类型的资源。</para>
/// <para>如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。</para>
/// </summary>
/// <typeparam name="T">要加载的资源的类型</typeparam>
/// <param name="path">要加载的资源的路径。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>
public T Load<T>(string path) where T : Object
{return Resources.Load<T>(path);
}
调用
GameObject[] gos = ResourcesManager.Instance.LoadAll<GameObject>("Prefabs");
for (int i = 0; i < gos.Length; i++)
{Instantiate(gos[i]);
}
3、封装卸载资源方法
通过Resources加载的资源,就算销毁了,但是它还是占在内存里面,没有释放,所以我们需要卸载资源,比如切换场景的时候
/// <summary>
/// <para>异步卸载所有用Resources方式加载到内存中且当前没有被任何地方使用的资源。</para>
/// <para>例如要卸载某一个用Resources方式加载的预制体,则必须确保场景中所有这个预制体创建的物体都被销毁了,且这个预制体资源没有赋值给任何脚本中的任何变量。</para>
/// <para>如果有,可以把该变量也赋值为null,这样本方法才能成功释放它。</para>
/// </summary>
/// <param name="callback">资源卸载完毕后执行的逻辑</param>
public void UnloadUnusedAssets(UnityAction callback = null)
{MonoManager.Instance.StartCoroutine(UnLoadUnusedAssetsCoroutine(callback));
}
IEnumerator UnLoadUnusedAssetsCoroutine(UnityAction callback = null)
{//异步操作对象,记录了异步操作的数据。AsyncOperation asyncOperation = Resources.UnloadUnusedAssets();//等待资源卸载while (asyncOperation.progress < 1)yield return null;//资源卸载完毕后执行的逻辑callback?.Invoke();
}
调用
ResourcesManager.Instance.UnloadUnusedAssets(() =>
{Debug.Log("异步卸载所有资源成功");
});
六、最终代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using XYFrame;/// <summary>
/// Resources资源加载管理器
/// 这个脚本依赖Mono管理器。
/// 要加载的资源必须放到项目中名叫Resources的文件夹中。项目中可以有多个名叫Resources的文件夹,但如此一来,必须避免资源的路径相同。
/// </summary>
public class ResourcesManager : Singleton<ResourcesManager>
{#region 同步加载单个资源/// <summary>/// <para>同步加载Resources文件夹中的资源。</para>/// <para>如果有多个相同路径的资源,则只会返回找到的第一个资源。</para>/// </summary>/// <param name="path">要加载的资源的路径。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>public Object Load(string path){return Resources.Load(path);}/// <summary>/// <para>同步加载Resources文件夹中指定类型的资源。</para>/// <para>如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。</para>/// </summary>/// <param name="path">要加载的资源的路径。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>/// <param name="systemTypeInstance">要加载的资源的类型的Type对象。例如typeof(GameObject)表示要加载的资源的类型是GameObject型。</param>/// <returns></returns>public Object Load(string path, System.Type systemTypeInstance){return Resources.Load(path, systemTypeInstance);}/// <summary>/// <para>同步加载Resources文件夹中指定类型的资源。</para>/// <para>如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。</para>/// </summary>/// <typeparam name="T">要加载的资源的类型</typeparam>/// <param name="path">要加载的资源的路径。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>public T Load<T>(string path) where T : Object{return Resources.Load<T>(path);}#endregion#region 同步加载多个资源/// <summary>/// <para>同步加载Resources文件夹中指定路径的文件夹中的所有资源,包括其中子孙文件夹中的所有资源,然后返回到一个Object[]型数组。</para>/// <para>如果该路径是一个文件,则只会加载该文件,并返回到一个Object[]型数组。</para>/// <para>如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。</para>/// </summary>/// <param name="path">要加载的文件夹或文件的路径。例如"Prefabs"表示Resources文件夹中的Prefabs文件夹。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>public Object[] LoadAll(string path){return Resources.LoadAll(path);}/// <summary>/// <para>同步加载Resources文件夹中指定路径的文件夹中指定类型的所有资源,包括其中子孙文件夹中的该类型的所有资源,然后返回到一个Object[]型数组。</para>/// <para>如果该路径是一个该指定类型的文件,则只会加载该文件,并返回到一个Object[]型数组。</para>/// <para>如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。</para>/// </summary>/// <param name="path">要加载的文件夹或文件的路径。例如"Prefabs"表示Resources文件夹中的Prefabs文件夹。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>/// <param name="systemTypeInstance">要加载的资源的类型的Type对象。例如typeof(GameObject)表示要加载的资源的类型是GameObject型。</param>public Object[] LoadAll(string path, System.Type systemTypeInstance){return Resources.LoadAll(path, systemTypeInstance);}/// <summary>/// <para>同步加载Resources文件夹中指定路径的文件夹中指定类型的所有资源,包括其中子孙文件夹中的该类型的所有资源,然后返回到一个Object[]型数组。</para>/// <para>如果该路径是一个该指定类型的文件,则只会加载该文件,并返回到一个Object[]型数组。</para>/// <para>如果没有加载到任何资源,则返回一个没有任何元素的Object[]型数组。</para>/// </summary>/// <typeparam name="T">要加载的资源的类型</typeparam>/// <param name="path">要加载的文件夹或文件的路径。例如"Prefabs"表示Resources文件夹中的Prefabs文件夹。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>public T[] LoadAll<T>(string path) where T : Object{return Resources.LoadAll<T>(path);}/// <summary>/// <para>同步把Resources文件夹中指定路径的文件夹及其所有子孙文件夹中所有指定类型的资源添加到一个新建的字典中,并返回该字典。</para>/// <para>应保证Prefabs文件夹中以及它的子孙文件夹中没有重名的资源,如果有重名的,则只会添加找到的第一个资源进字典,其它重名的资源不会进到字典中。</para>/// </summary>/// <typeparam name="T">要加载的资源类型</typeparam>/// <param name="path">资源的路径。例如"Folder/Res"表示Resources文件夹中的Folder文件夹中的Res文件夹</param>public Dictionary<string, T> LoadAllIntoDictionary<T>(string path) where T : Object{Dictionary<string, T> dic = new Dictionary<string, T>();T[] temp = Resources.LoadAll<T>(path);for (int i = 0; i < temp.Length; i++){if (!dic.ContainsKey(temp[i].name))//字典不存在该键,才添加进去。这样可以防止字典的键名重复而报错。{dic.Add(temp[i].name, temp[i]);}else//如果字典已经存在该键,则跳过这个资源,并输出警告,不将它加入到字典中{Debug.LogWarning(string.Format("Resources/{0}的子孙文件夹的资源{1}与已经添加到字典中的资源重名,因此无法将它添加到字典中,请确保加载的资源的名字是唯一的。", path, temp[i].name));}}return dic;}/// <summary>/// <para>同步把Resources文件夹中指定路径及其所有子孙文件夹中所有指定类型的资源添加到指定的字典中</para>/// </summary>/// <typeparam name="T">要加载的资源类型</typeparam>/// <param name="path">资源的路径。例如"Folder/Res"表示Resources文件夹中的Folder文件夹中的Res文件夹</param>/// <param name="dictionary">指定的字典</param>public void LoadAllIntoDictionary<T>(string path, Dictionary<string, T> dictionary) where T : Object{T[] temp = Resources.LoadAll<T>(path);for (int i = 0; i < temp.Length; i++){if (!dictionary.ContainsKey(temp[i].name))//字典不存在该键,才添加进去。这样可以防止字典的键名重复而报错。{dictionary.Add(temp[i].name, temp[i]);}else//如果字典已经存在该键,则跳过这个资源,并输出警告,不将它加入到字典中{Debug.LogWarning(string.Format("Resources/{0}的子孙文件夹的资源{1}与已经添加到字典中的资源重名,因此无法将它添加到字典中,请确保加载的资源的名字是唯一的,并且传入参数的字典中不包含该名字的资源。", path, temp[i].name));}}}#endregion#region 异步加载单个资源/// <summary>/// <para>异步加载Resources文件夹中的资源。</para>/// <para>如果有多个相同路径的资源,则只会加载找到的第一个资源。</para>/// </summary>/// <param name="path">要加载的资源的路径。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>/// <param name="callback">资源加载完毕后要执行的逻辑。参数表示加载的资源。</param>public void LoadAsync(string path, UnityAction<Object> callback = null){MonoManager.Instance.StartCoroutine(LoadAsyncCoroutine(path, callback));}IEnumerator LoadAsyncCoroutine(string path, UnityAction<Object> callback = null){ResourceRequest resourceRequest = Resources.LoadAsync(path);yield return resourceRequest;callback?.Invoke(resourceRequest.asset);}/// <summary>/// <para>异步加载Resources文件夹中指定类型的资源。</para>/// <para>如果有多个相同类型,且相同路径的资源,则只会加载找到的第一个资源。</para>/// </summary>/// <param name="path"></param>/// <param name="type">要加载的资源的类型的Type对象。例如typeof(GameObject)表示要加载的资源的类型是GameObject型。</param>/// <param name="callback">资源加载完毕后要执行的逻辑。参数表示加载的资源。</param>public void LoadAsync(string path, System.Type type, UnityAction<Object> callback = null){MonoManager.Instance.StartCoroutine(LoadAsyncCoroutine(path, type, callback));}IEnumerator LoadAsyncCoroutine(string path, System.Type type, UnityAction<Object> callback = null){ResourceRequest resourceRequest = Resources.LoadAsync(path, type);yield return resourceRequest;callback?.Invoke(resourceRequest.asset);}/// <summary>/// <para>异步加载Resources文件夹中指定类型的资源。</para>/// <para>如果有多个相同类型,且相同路径的资源,则只会加载找到的第一个资源。</para>/// </summary>/// <typeparam name="T">加载的资源的类型</typeparam>/// <param name="path">要加载的资源的路径。例如"Prefabs/Cube"表示Resources文件夹中的Prefabs文件夹中的名叫Cube的资源。</param>/// <param name="callback">资源加载完毕后要执行的逻辑</param>public void LoadAsync<T>(string path, UnityAction<T> callback = null) where T : Object{MonoManager.Instance.StartCoroutine(LoadAsyncCoroutine(path, callback));}IEnumerator LoadAsyncCoroutine<T>(string path, UnityAction<T> callback = null) where T : Object{ResourceRequest resourceRequest = Resources.LoadAsync<T>(path);yield return resourceRequest;callback?.Invoke(resourceRequest.asset as T);}#endregion#region 卸载资源/// <summary>/// <para>异步卸载所有用Resources方式加载到内存中且当前没有被任何地方使用的资源。</para>/// <para>例如要卸载某一个用Resources方式加载的预制体,则必须确保场景中所有这个预制体创建的物体都被销毁了,且这个预制体资源没有赋值给任何脚本中的任何变量。</para>/// <para>如果有,可以把该变量也赋值为null,这样本方法才能成功释放它。</para>/// </summary>/// <param name="callback">资源卸载完毕后执行的逻辑</param>public void UnloadUnusedAssets(UnityAction callback = null){MonoManager.Instance.StartCoroutine(UnLoadUnusedAssetsCoroutine(callback));}IEnumerator UnLoadUnusedAssetsCoroutine(UnityAction callback = null){//异步操作对象,记录了异步操作的数据。AsyncOperation asyncOperation = Resources.UnloadUnusedAssets();//等待资源卸载while (asyncOperation.progress < 1)yield return CoroutineTool.WaitForFrame();//资源卸载完毕后执行的逻辑callback?.Invoke();}/// <summary>/// <para>同步卸载指定的资源。</para>/// <para>只能卸载非GameObject类型和Component类型,例如Mesh、Texture、Material、Shader。如果卸载了不让卸载的资源,则会报错。</para>/// <para>如果随后加载的任何场景或资源引用了该资源,将导致从磁盘中加载该资源的新实例。此新实例将与先前卸载的对象相互独立。</para>/// </summary>/// <param name="assetToUnload">要卸载的资源</param>public void UnloadAsset(Object assetToUnload){Resources.UnloadAsset(assetToUnload);}#endregion
}
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
好了,我是向宇,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关文章:
【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器
文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables(可寻址资源系统)5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…...
ThreadLocal内存泄漏分析
一、ThreadLocal内存泄漏分析 1.1 ThreadLocal实现原理 1.1.1、set(T value)方法 查看ThreadLocal源码的 set(T value)方法,可以发现数据是存在了ThreadLocalMap的静态内部类Entry里面 其中key为使用弱引用的ThreadLocal实例,value为set传入的值。核…...
第 30 章 XML
第 30 章 XML 1.IE 中的 XML 2.DOM2 中的 XML 3.跨浏览器处理 XML 随着互联网的发展,Web 应用程序的丰富,开发人员越来越希望能够使用客户端来操作 XML 技术。而 XML 技术一度成为存储和传输结构化数据的标准。所以,本章就详细探讨一下 Ja…...
VMware下的ubuntu显示文字太小的自适应显示调整
我的情况 我使用的是4K的32寸显示器,分辨率为 3840 x 2160,ubuntu版本为18.04,默认的情况下系统分辨率为 3466 x 1842。 此时,显示的文字很小,虽然可以看清,但也比较吃力,在VMware窗口…...
外贸网站怎么搭建对谷歌seo比较好?
外贸网站怎么搭建对谷歌seo比较好?搭建一个网站自然不复杂,但要想搭建一个符合谷歌seo规范的网站,那就要多注意了,你的网站做的再酷炫,再花里胡哨,但如果页面都是js代码,或者页面没有源代码内容…...
如何创建网络白名单
网络白名单(Whitelist)是指允许通过网络访问的特定设备、IP地址、应用程序或网站。与黑名单(Blacklist)相反,白名单机制默认阻止所有连接,只有在白名单中明确允许的访问才能通过。这种策略可以提高网络的安…...
前端动态创建svg不起效果?
document.createElement(path);诸如此类的创建一般都是不太行的 我在创建这个之后,虽然在网页上是有相应的结构,但是完全不显示 一般正确的创建方式为 document.createElementNS(http://www.w3.org/2000/svg,path);在使用document.createElementNS(“ht…...
三、Drf request对象
3.1django和drf中的request的区别 django中的request:用户请求对象和参数 drf中的request:将django中的request加了一层封装,又加了一些其它的参数 drf中的request._requestdjango中的request 3.2创建url路由和CBV class UserView(APIView):def get(self,requ…...
CMIS5.2_光模块切应用(Application Selection and Instantiation)
目录 重要概念 DP配置、应用声明、应用码的区别 Control Set Provision 和 Commission ApplyDPInit 和 ApplyImmediate 判断应用是否切换成功 以800G光模块的3个应用对应的DP配置举例 1*800G应用: 2*400G应用: 8*100G应用: 应用声明…...
网络安全 DVWA通关指南 DVWA Weak Session IDs(弱会话)
DVWA Weak Session IDs(弱会话) 文章目录 DVWA Weak Session IDs(弱会话)Low LevelMedium LevelHigh LevelImpossible Level 参考文献 WEB 安全靶场通关指南 相关阅读 Brute Force (爆破) Command Injection(命令注入…...
828华为云征文|华为云 Flexus X 实例初体验
一直想有自己的一款的服务器,为了更好的进行家庭娱乐,甚至偶尔可以满足个人搭建开发环境的需求,直到接触到了华为云 Flexus X 云服务器。Flexus 云服务器 X 实例是面向中小企业和开发者打造的轻量级云服务器。提供快速应用部署和简易的管理能…...
欧科云链OKLink相约TOKEN2049:更全面、多元与安全
过去几日,OKLink 与全球 Web3 从业者与爱好者们相约狮城。在多场激动人心的活动上分享了我们的产品进展、有关于链上数据的专家观点以及打磨产品的经验。同时也听到了很多来自行业的宝贵声音。跟随我们的脚步,捕捉这充实一周的精彩瞬间: 1、…...
遥感影像-语义分割数据集:云数据集详细介绍及训练样本处理流程
原始数据集详情 简介:该云数据集包括150张RGB三通道的高分辨率图像,在全球不同区域的分辨率从0.5米到15米不等。这些图像采集自谷歌Earth的五种主要土地覆盖类型,即水、植被、湿地、城市、冰雪和贫瘠土地。 KeyValue卫星类型谷歌Earth覆盖区…...
【有啥问啥】SimAM(Similarity-Aware Activation Module)注意力机制详解
SimAM(Similarity-Aware Activation Module)注意力机制详解 引言 在计算机视觉领域,注意力机制通过引导模型关注图像中的关键区域,显著提升了模型处理和理解图像的能力。SimAM(Similarity-Aware Activation Module&a…...
鸿蒙应用开发,如何保存登录信息
在鸿蒙应用开发中,保存登录信息是实现用户自动登录、个性化展示等功能的基础。以下是一些常用的保存登录信息的方法: 一、全局状态管理 对于简单的应用,可以在全局范围内定义一个类(如UserManager),使用单…...
★ C++进阶篇 ★ map和set
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将继续和大家一起学习C进阶篇第四章----map和set ~ ❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️❄️ 澄岚主页:椎名澄嵐-CSDN博客 C基础篇专栏:★ C基础篇 ★_椎名澄嵐的博客-CSDN博…...
Python知识点:如何使用Nvidia Jetson与Python进行边缘计算
开篇,先说一个好消息,截止到2025年1月1日前,翻到文末找到我,赠送定制版的开题报告和任务书,先到先得!过期不候! 如何使用Nvidia Jetson与Python进行边缘计算 Nvidia Jetson平台是专为边缘计算设…...
动态分配内存
目录 前言 一.malloc,free函数 1.malloc,free函数原型 2.使用方法 3.具体实例 4.注意事项 二.calloc函数 1.calloc函数原型 2.主要特点 3.使用案例 三.realloc函数 1.realloc函数原型 2.使用案例 3.注意事项 前言 动态内存是指在程序运行时,按需分配和…...
Unity Input System自动生成配置
参考视频 创建及配置新输入系统 New Input System|Unity2022.2 最新教程《勇士传说》入门到进阶|4K_哔哩哔哩_bilibili ProjectSettings设置 Unity编辑器菜单栏选择Edit->Project Settings->Player->Other Settings,将Api Compatibility Level…...
【Windows】在任务管理器中隐藏进程
在此前的一篇,我们已经介绍过了注入Dll 阻止任务管理器结束进程 -- Win 10/11。本篇利用 hook NtQuerySystemInformation 并进行断链的方法实现进程隐身,实测支持 taskmgr.exe 的任意多进程隐身。 任务管理器 代码: // dllmain.cpp : 定义 …...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
