【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 : 定义 …...
【TypeScript学习】TypeScript基础学习总结二
主要记录ts中的类、接口与泛型 1.类 无论是在哪种语言中,类都是面向对象编程(OOP)的一个主要实现方式。能够实现代码更加灵活,更具有结构化。类作用都是提供一个模板,通过类可以创建多个具有相同结构的对象。 // 类的定义,与对象…...
中国电信解锁万亿参数大模型:TeleAI的创新与突破
首个由万卡集群训练出来的万亿参数大模型,已被一家央企解锁。 具体而言,为了推动纯国产人工智能的探索,带来这条新路径的正是中国电信人工智能研究院(TeleAI)。 该研究院由中国电信集团的CTO、首席科学家兼院长李学龙…...
戴尔PowerEdge R840服务器亮黄灯 不开机
最近接修到一台东莞用户的DELL PowerEdge R840 服务器因为意外断电后,无法正常开机的问题, 大概故障现象是 插上电源线 按卡机按钮无响应,无法开机,无显示输出,工程师到现场检修,经过idrac中日志分析&#…...
【前端安全】js逆向之微信公众号登录密码
❤️博客主页: iknow181 🔥系列专栏: 网络安全、 Python、JavaSE、JavaWeb、CCNP 🎉欢迎大家点赞👍收藏⭐评论✍ 随着发展,越来越多的登录页面添加了密码加密的措施,使得暴力破解变得不在简单&a…...
C# 泛型使用案例_C# 泛型使用整理
一、系统自带常用的泛型 1.字典,集合 //字典 Dictionary<string, int> dic new Dictionary<string, int>(); //泛型集合 List<int> list new List<int>(); 2.泛型委托,输入参数,输出参数 //泛型 委托---输出参…...
Docker 安装 Citus 单节点集群:全面指南与详细操作
Docker 安装 Citus 单节点集群:全面指南与详细操作 文章目录 Docker 安装 Citus 单节点集群:全面指南与详细操作一 服务器资源二 部署图三 安装部署1 创建网络2 运行脚本1)docker-compose.cituscd1.yml2)docker-compose.cituswk1.…...
Arthas redefine(加载外部的.class文件,redefine到JVM里 )
文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine(加载外部的.class文件,redefine到JVM里 )举例1:加载新的代码,jad/mc 命令使用举例2:上传 .class 文件到服务器的技巧 本人其他相关文章…...
C++教程(三):c++常用的配置文件类型
目录 1. INI 文件 2. JSON 文件 3. YAML 文件 4. XML 文件 5. TOML 文件 6. 二进制配置文件(Protocol Buffers, MessagePack, Avro 等) 总结 在 C 项目中,常用的配置文件类型有多种选择,具体选择取决于项目的复杂性、可读性…...
Arduino Uno控制雨滴传感器模块的设计方案
以下是Arduino Uno控制雨滴传感器模块的设计方案: 一、硬件准备: 1. Arduino Uno 开发板一块。 2. 雨滴传感器模块一个。 3. 杜邦线若干。 4. 9V直流电源一个。 二、硬件连接: 1. 将Arduino Uno板的Vin引脚、GND引脚分别连接到9V直流电…...
华为常见命令手册
常见命令 display ip interface brief —> 查看设备上的每个接口的IP地址【地址/掩码/状态】 display interface gi0/0/0 → 查看该接口的MAC 地址 ipconfig → 查看 PC 上面的 IP地址 display arp → 查看设备的 ARP 表 arp -a → 查看 PC 上面的 ARP 表 display m…...
北京网站建设学校/百度关键词推广公司哪家好
结合 category 工作原理分析 OC2.0 中的 runtime 绝大多数 iOS 开发者在学习 runtime 时都阅读过 runtime.h 文件中的这段代码: struct objc_class {Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__Class super_class OBJC2_UNAVAILA…...
自己网站做问卷调查问卷/seo实战培训
曾经在Red Hat Enterprise 3 下配置百兆网卡利用 ISCSI 访问 NetApp。 感觉还是比较方便。性能倒没有多留意。实战系统版本:[roottrade /]# cat /etc/redhat-releaseRed Hat Enterprise AS release 3 (Taroon Update 7)据资料介绍,redhat linux as3 从Up…...
抖音团购小程序代理/百度关键词优化企业
“视频已发布到哔哩哔哩,点击阅读原文可以直接到达,求个三连不过分吧!uniapp基础部分有文档还看什么教程?官网文档非常的详细,但是如果没有接触过的新人看文档其实是没法学的,因为他不知道要完成一个开发&a…...
有接口怎么做网站/青岛网站seo
一 准备工作建立好文件夹 tomcat文件夹地址 二 下载并解压 当然是下载了 1.centos6.5系统里面下载 解压 2.本机下载 然后利用Xftp复制到目标文件加载解压(我用的是这种,随意啦) 解压命令是 tar -zxv -f apache-tomcat-8.0.29.tar.gz 解压后会…...
asp网站域名/seo网站推广简历
由MySQL提供的模式匹配的其它类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。3. 正则表达式的使用;扩展正则表达式的一些字符是: ‘.’匹配任…...
网页制作师培训机构/安徽网站seo公司
今天在做即时通讯群聊时,调用MultiUserChat.getHostedRooms(conn, SmackTools.getInstance().conn.getServiceName());方法获取服务列表时总是出现空指针的情况。 当时出现这个错误的时候感觉是非怪的,因为参数:conn和服务名都不为空。而Mult…...