Unity Addressables 使用说明(一)概述

news2024/11/18 3:32:01

使用 Adressables 组织管理 Asset

Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在本地应用程序中可用还是存储在远程内容分发网络上,Addressable 系统都会定位并返回该资源。

您可以使用此包远程分发内容、在运行时管理内容加载、控制应用程序资源的托管位置以及管理资源之间的依赖关系。

Addressable Asset System 允许开发者通过资源的地址来请求资源。资源(例如预制件)标记为“Addressable”后,就会生成一个可从任何地方调用的地址。无论资源位于何处(本地还是远程),系统都会找到资源及其依赖项,然后将其返回。

Addressables 使用异步加载来支持从具有任何依赖关系集合的任何位置进行加载。无论开发者一直以来使用的是直接引用、传统资源包还是 Resource 文件夹,Addressables 都提供了一种使游戏更具动态性的简单方法。Addressables 使用了资源包,并会管理所有复杂性。

Addressables 概述

Addressables 提供了一个可以随项目扩展的系统。您可以从一个简单的设置开始,然后随着项目复杂性的增加进行重组,并且只需最少的代码更改。

例如,您可以从一组 Addressable 资源开始,Unity 会将其作为一个集合加载。然后,随着您添加更多内容,可以将资源拆分为多个组,以便在特定时间仅加载所需的资源。随着团队规模的增长,您可以创建单独的 Unity 项目来开发不同类型的资源。这些辅助项目(auxiliary projects)可以生成自己的 Addressables 内容构建,并从主项目(main project)中加载。

Addressables 系统提供了自动依赖关系和内存管理、有效的 AssetBundle 打包以及远程或本地托管资源的能力。使用这个包可以控制应用程序如何管理、加载和卸载资源。

默认情况下,Addressables 使用 AssetBundles 打包资源。您还可以实现自己的 IResourceProvider 类以支持其他访问资源的方式。

资源地址(Asset addresses)

Addressables 系统的一个关键特性是您可以为资源分配地址,并在运行时使用这些地址加载资源。Addressables 资源管理器在内容目录(content catalog)中查找地址,以确定资源的存储位置。资源可以内置到您的应用程序中、本地缓存或远程托管。资源管理器(resource manager)加载资源及其所有依赖项,如果需要,会先下载内容。

在这里插入图片描述

由于地址不与资源的物理位置绑定,因此您可以在 Unity 编辑器和运行时管理和优化资源。目录将地址映射到物理位置。

虽然最好为资源分配唯一的地址,但资源地址不一定必须唯一。在有用时,您可以将相同的地址字符串分配给多个资源。例如,如果您有资源的不同变体,可以将相同的地址分配给所有变体,并使用标签区分变体:

Asset 1: address: "plate_armor_rusty", label: "hd"
Asset 2: address: "plate_armor_rusty", label: "sd"

对于 Addressables API 中仅加载单个资源的方法(例如 LoadAssetAsync),如果您使用分配给多个资源的地址调用它们,则会加载通过该地址找到的第一个实例。其他方法,如 LoadAssetsAsync,一次加载多个资源,并加载具有指定地址的所有资源。

可以使用 LoadAssetsAsyncMergeMode 参数来加载两个键的交集。

在前面的示例中,您可以指定地址 “plate_armor_rusty” 和标签 “hd” 作为键,并将交集作为合并模式来加载资源1。然后可以将标签值更改为 “sd” 以加载资源2。

有关如何为资源分配地址的更多信息,请参阅使资源可寻址。有关如何通过键(包括地址)加载资源的信息,请参阅加载资源。

AssetReference

AssetReference 是一种可以设置为任何类型 Addressable 资源的类型。Unity 不会自动加载分配给引用(AssetReference)的资源,因此您可以更好地控制何时加载和卸载它。

MonoBehaviourScriptableObject 中使用 AssetReference 类型的字段,以指定用于该字段的 Addressable 资源(而不是使用指定地址的字符串)。AssetReference 支持拖放和对象选择器分配,使其在编辑器检查器中更方便使用。

Addressables 还提供了一些更专门的类型,如 AssetReferenceGameObjectAssetReferenceTexture。您可以使用这些专门的子类来防止将错误的资源类型分配给 AssetReference 字段。您还可以使用 AssetReferenceUILabelRestriction 属性将分配限制为具有特定标签的资源。

请参阅使用 AssetReferences以获取更多信息。

资源加载和卸载(Asset loading and unloading)

要加载一个 Addressable 资源,您可以使用它的地址或其他键(如标签或 AssetReference)。请参阅加载 Addressable 资源以获取更多信息。您只需加载主资源(main asset),Addressables 会自动加载任何依赖资源

当您的应用程序在运行时不再需要访问某个 Addressable 资源时,必须释放它,以便 Addressables 可以释放相关的内存。Addressables 系统保持对已加载资源的引用计数,直到引用计数返回到零才会卸载资源。因此,您无需跟踪资源或其依赖项是否仍在使用中。只需确保每次显式加载资源时,在应用程序不再需要该实例时释放它。请参阅释放 Addressable 资源以获取更多信息。

依赖关系和资源管理(Dependency and resource management)

Unity 中的一个资源可以依赖于另一个资源。例如,一个场景可能引用一个或多个预制件,或一个预制件可能使用一个或多个材质。一个或多个预制件可以使用相同的材质,这些预制件可以存在于不同的 AssetBundles 中。当您加载一个 Addressable 资源时,系统会自动找到并加载它引用的任何依赖资源。当系统卸载一个资源时,它也会卸载其依赖项,除非有其他资源仍在使用它们

随着您加载和释放资源,Addressables 系统为每个 item 保持引用计数。当一个资源不再被引用时,Addressables 会卸载它。如果该资源在一个不再有任何正在使用的资源的 Bundle 中,Addressables 也会卸载该 Bundle

请参阅内存管理以获取更多信息。

Addressables 组(Group)和标签(Label)

使用 Addressables 组来组织内容。所有 Addressable 资源都属于某一个组。如果您未明确将资源分配给组,Addressables 会将其添加到默认组。

您可以设置组设置,以指定 Addressables build system 如何将组中的资源打包到 Bundle 中。例如,您可以选择将组中的所有资源打包在一个 AssetBundle 文件中。

使用标签标记您希望以某种方式一起处理的内容。例如,如果您定义了红色、帽子和羽毛的标签,可以在一个操作中加载所有带羽毛的红色帽子,无论它们是否属于同一个 AssetBundle。您还可以使用标签决定如何将组中的资源打包到 Bundle 中。

使用 Addressables 组窗口将资源添加到组中,并在组之间移动资源。您还可以在组窗口中为资源分配标签。

组纲要(Group Schema)

分配给组的 Schema 定义了用于构建组中资源的设置。不同的 schema 可以定义不同的设置组。例如,一个标准 schema 定义了如何将资源打包和压缩到 AssetBundles 中的设置(以及其他选项)。另一个标准 schema 定义了组中的资源属于的类别(可以在发布后更改和不能在发布后更改)。

您可以定义自己的 schema 以使用自定义构建脚本。

有关组架构的更多信息,请参阅 Schema 。

内容目录(Content Catalogs)

Addressables system 生成一个内容目录文件,将资源的地址映射到其物理位置。它还可以创建一个包含目录的哈希的哈希文件。如果您远程托管 Addressable 资源,系统会使用此哈希文件决定内容目录是否已更改以及是否需要下载它。请参阅内容目录以获取更多信息。

在执行内容构建时选择的配置文件决定了内容目录中的地址如何映射到资源加载路径。有关更多信息,请参阅配置文件。

有关远程托管内容的信息,请参阅远程分发内容。

内容构建(Content Builds)

Addressables 系统将 Addressable content 的构建与 player 的构建分开。内容构建生成内容目录目录哈希包含资源的 AssetBundles

由于资源格式是特定于平台的,因此在构建 player 之前,必须为每个平台进行内容构建。

请参阅构建 Addressable 内容以获取更多信息。

Player 模式脚本(Play Mode Scripts)

当您在 play 模式下运行游戏或应用程序时,每次按下 Player 按钮之前都执行内容构建会很麻烦且缓慢。同时,您希望能够在尽可能接近 build player 的状态下运行游戏。Addressables 提供了三个选项,决定 Addressables 系统如何在 Player 模式下定位和加载资源:

  • 使用资源数据库(Asset Database):Addressables 直接从资源数据库加载资源。如果您同时进行代码和资源更改,此选项通常提供最快的迭代速度,但最不像生产构建(production build)。
  • 使用现有构建:Addressables 从您最后的内容构建中加载内容。此选项最像生产构建,如果您不更改资源,则提供快速的迭代周转。
  • 模拟(无构建):此选项在不执行实际构建的情况下模拟内容构建,适合快速测试。

有关更多信息,请参阅play 模式脚本。

Addressables 工具

Addressables 系统提供以下工具和窗口,帮助您管理 Addressable 资源:

  • Addressable Groups window:用于管理资源、组设置和构建的主界面。
  • 配置文件窗口(Profiles window:帮助设置构建使用的路径。
  • 构建布局报告(Build layout report:描述内容构建生成的 AssetBundles。

安装 Addressables

要在项目中安装 Addressables 包,请使用 Package Manager(包管理器):

  1. 打开 Package Manager(菜单:Window > Package Manager)。
  2. 将包列表设置为显示来自 Unity Registry 的包。
  3. 在列表中选择 Addressables 包。
  4. 点击安装(在 Package Manager 窗口的右下角)。

安装后要在项目中设置 Addressables 系统,请打开Windows/Addressables/Groups窗口并点击 Create Addressables Settings

初始化 Addressables 系统前的 Addressables Groups 窗口当你选择 Create Addressables Settings 时,Addressables 系统会创建一个名为 AddressableAssetsData 的文件夹,用于存储设置文件和其他资源,这些文件是包用来跟踪 Addressables 配置的。将此文件夹中的文件添加到你的版本控制系统中。随着你更改 Addressables 配置,Addressables 包可能会创建其他文件。更多信息,请参阅 Addressables Settings 。

配置项目以使用 Addressables

安装包后,你需要为资源分配地址并重构任何运行时加载代码。

虽然你可以在项目开发的任何阶段集成 Addressables,但最佳实践是在新项目中立即开始使用 Addressables,以避免在开发后期进行不必要的代码重构和内容规划更改。

转换为 Addressables

使用 Addressables 构建的内容仅引用在该 Addressables build 中 build 的其他资源。通过场景数据(Scene data)和资源文件夹(Resource folders)包含在 Addressables 和 Player 构建中的内容在磁盘和内存中都会被重复加载。因此,你必须将所有场景数据和资源文件夹转换为 Addressables 构建系统。这将减少因重复而产生的内存开销,并意味着你可以使用 Addressables 管理所有内容。这也意味着内容可以是本地的或远程的,你可以通过内容更新(content update)构建来更新它。

要将项目转换为 Addressables,你需要根据当前项目引用和加载资源的方式执行不同的步骤:

  • Prefabs(预制件):有关如何将预制件数据升级到 Addressables ,请参阅 Convert prefabs 。
  • AssetBundles(资源包):有关如何将 AssetBundles 升级到 Addressables,请参阅 Convert AssetBundles 。
  • StreamingAssets(流媒体资源):Unity 会将 StreamingAssets 文件夹中的任何文件按原样包含在构建的 Player应用程序中。

StreamingAssets 文件夹中的文件

当你使用 Addressables 系统时,可以继续从 StreamingAssets 文件夹加载文件。然而,这个文件夹中的文件不能是 Addressable,也不能引用项目中的其他资源。

Addressables 系统在构建期间将其运行时配置文件和本地 AssetBundles 放置在 StreamingAssets 文件夹中。Addressables 在构建过程结束时会删除这些文件,你不会在 Unity Editor 中看到它们。

转换场景数据

要将场景数据转换为 Addressable,需要将场景从构建设置列表中移出并将这些场景设为 Addressable。构建设置列表中必须有一个场景,这是 Unity 在应用程序启动时加载的场景。你可以创建一个新场景,该场景仅用于加载第一个 Addressable 场景。

转换场景的步骤:
  1. 创建一个新的初始化场景。
  2. 打开 Build Settings 窗口(菜单:File > Build Settings)。
  3. 将初始化场景添加到场景列表中。
  4. 从列表中移除其他场景。
  5. 在项目列表中选择每个场景,并在其 Inspector 窗口中启用 Addressable 选项。或者,你可以将场景资源拖到 Addressables Groups 窗口中的某个组中。不要将新的初始化场景设为 Addressable
  6. 更新用于加载场景的代码,使用 Addressables 类的场景加载方法,而不是 SceneManager 方法。

你现在可以将一个大的 Addressable 场景组拆分为多个组。最佳方式取决于项目目标。你可以将场景移到它们自己的组中,以便可以独立加载和卸载每个场景。通过使资源本身成为 Addressable,可以避免复制被两个不同 AssetBundle 引用的同一资源。通常,最好将共享资源移动到它们自己的组中,以减少 AssetBundles 之间的依赖性。

在非 Addressable 场景中使用 Addressable 资源

对于你不想设为 Addressable 的场景,仍然可以通过 AssetReferences 将 Addressable 资源作为场景数据的一部分使用。

当你将一个 AssetReference 字段添加到自定义 MonoBehaviour 或 ScriptableObject 类中时,可以在 Unity 编辑器中将一个 Addressable 资源分配给该字段,方式类似于直接引用资源。主要区别在于,你需要为类添加代码以加载和释放分配给 AssetReference 字段的资源(而 Unity 在实例化场景中的对象时会自动加载直接引用)。

将直接引用替换为 AssetReferences

要在自定义类中用 AssetReferences 替换直接引用,请执行以下步骤:

  1. 用 AssetReferences 替换对象的直接引用(例如,将 public GameObject directRefMember; 替换为 public AssetReference assetRefMember;)。
  2. 将资源拖到组件的 Inspector 中,方式类似于直接引用。
  3. 添加运行时代码,使用 Addressables API 加载分配的资源。
  4. 添加代码,在不再需要时释放加载的资源。

转换 Prefab

要将预制件(prefab)转换为 Addressable 资源,请在其 Inspector 窗口中启用 Addressables 选项,或将其拖到 Addressables Groups 窗口中的某个组中。

在 Addressable 场景中使用预制件时,不总是需要将预制件设为 Addressable。Addressables 会自动将你添加到场景层次结构中的预制件包含在场景的 AssetBundle 数据中如果在多个场景中使用同一个预制件,请将该预制件设为 Addressable 资源,以避免在每个使用它的场景中重复预制件数据。如果你希望在运行时动态加载和实例化预制件,也必须将其设为 Addressable。

转换 Resources 文件夹

如果你的项目在 Resources 文件夹中加载资源,可以将这些资源迁移到 Addressables 系统:

  1. 将资源设为 Addressable:要实现这一点,可以在每个资源的 Inspector 窗口中启用 Addressable 选项,或者将资源拖到 Addressables Groups 窗口中的某个组。
  2. 更改运行时代码:将使用 Resources API 加载资源的任何代码更改为使用 Addressables API 加载资源。
  3. 添加代码释放资源:在不再需要时释放加载的资源。

如果将以前在 Resources 文件夹中的所有资源保存在一个组中,可以期望获得类似的加载和内存性能。

当你将 Resources 文件夹中的资源标记为 Addressable 时,Unity 会自动将资源移动到项目中名为 Resources_moved 的新文件夹中。移动后的资源的默认地址是旧路径,不包含文件夹名称。例如,你的加载代码可能会从:

Resources.LoadAsync<GameObject>("desert/tank.prefab");

更改为:

Addressables.LoadAssetAsync<GameObject>("desert/tank.prefab");

在将项目更改为使用 Addressables 系统后,可能需要以不同方式实现 Resources 类的某些功能。

例如,如果运行如下命令 Resources.LoadAll<SampleType>("MyPrefabs"); 从 Resources/MyPrefabs/ 文件夹加载资源,Unity 会加载 Resources/MyPrefabs/ 中所有与 SampleType 类型匹配的资源。

由于 Addressables 系统不支持这种确切的功能,需要更改工作流程以适应 Addressables 系统。在这种情况下,可以使用Addressable labels实现类似的效果。

转换 AssetBundles

当你第一次打开 Addressables Groups 窗口时,Unity 会提供将所有 AssetBundles 转换为 Addressables Group 的选项。这是将 AssetBundle 设置迁移到 Addressables 系统的最简单方法。不过,你仍然需要更新运行时代码,以使用 Addressables API 加载和释放资源。

如果你想手动转换 AssetBundle 设置,请点击 Ignore 按钮。手动将 AssetBundles 迁移到 Addressables 的过程与场景和 Resources 文件夹的转换类似:

  1. 将资源设为 Addressable:通过在每个资源的 Inspector 窗口中启用 Addressable 属性,或者将资源拖到 Addressables Groups 窗口中的某个组,来将资源设为 Addressable。Addressables 系统会忽略现有的 AssetBundle 和标签设置。
  2. 更改运行时代码:将使用 AssetBundle 或 UnityWebRequestAssetBundle API 加载资源的任何代码更改为使用 Addressables API 加载资源。你不需要显式加载 AssetBundle 对象或资源的依赖项;Addressables 系统会自动处理这些方面。
  3. 添加代码释放资源:在不再需要时释放加载的资源。

如果你选择了自动转换选项或手动将资源添加到相应的 Addressables 组中,那么根据你的组设置,最终会得到包含相同资源的一组 bundle 。不过,bundle 文件本身可能不会完全相同。

使 Asset 成为 Addressable

你可以通过以下方式之一使资源成为 Addressable:

  • 在资源的 Inspector 窗口中启用 Addressable 属性。
  • 在 Inspector 窗口中将资源分配给 AssetReference 字段。
  • 将资源拖到 Addressables Groups 窗口中的某个组。
  • 在 Project 窗口中将资源移动到标记为 Addressable 的文件夹中。

一旦你将资源设为 Addressable,除非你将它放在特定的组中,Addressables 系统会将它添加到默认组中。当你构建内容时,Addressables 会根据你的组设置将组中的资源打包到 AssetBundles 中。你可以使用 Addressables API 加载这些资源。

Addressables 示例

Addressables 包含一些示例,你可以下载到项目中。要访问这些示例,请转到 Window > Package Manager > Addressables

这些示例包括如何在构建过程中禁用资源导入、创建自定义构建和 Play 模式脚本,以及提供 AddressableUtility 类的示例。

下载并导入示例后,它们会被放置在项目中的 Assets/Samples/Addressables/{AddressablesVersionNumber} 路径下。

示例描述
Addressables Utility包含一组 Addressables 的实用函数。脚本包含一个静态方法 GetAddressFromAssetReference,该方法提供用于内部引用给定AssetReference的 Addressable 地址。
ComponentReference创建一个受限于包含特定组件的 AssetReference。有关详细信息,请参阅位于 Addressables Samples 仓库中的 ComponentReference 示例项目。
Custom Build and Playmode Scripts包含两个 custom scripts :* 示例中的 Editor/CustomPlayModeScript.cs 中的自定义 Play 模式脚本。此脚本的工作方式类似于已经包含的“Use Existing Build(需要 built groups )” Play 模式脚本。添加的方法是 CreateCurrentSceneOnlyBuildSetupRevertCurrentSceneSetup,位于 CustomBuildScript 中。示例中的 Editor/CustomBuildScript.cs 中的自定义构建脚本。此自定义构建脚本创建一个仅包含当前打开场景的构建。自动创建引导场景,并添加一个脚本,在启动时加载构建的场景。对于这些示例,默认使用的构建和加载路径分别是 [UnityEngine.AddressableAssets.Addressables.BuildPath]/[BuildTarget]{UnityEngine.AddressableAssets.Addressables.RuntimePath}/[BuildTarget]。此类的 ScriptableObject 已经创建,但你可以使用Create菜单再创建一个 ScriptableObject 。对于这个CustomPlayModeScript,创建菜单路径是Addressables > Content Builders > Use CustomPlayMode Script。默认情况下,这会创建一个 CustomPlayMode.asset ScriptableObject。CustomBuildScript 也遵循相同的步骤。
Disable Asset Import on Build(Deprecated)提供一个脚本,在玩家构建期间禁用资源导入。这样可以提高构建性能,因为在构建时,AssetBundles 会被复制到 StreamingAssets。此示例仅适用于 2021.2 之前的编辑器版本。在 2021.2+ 版本中,编辑器提供了将 Assets/ 之外的文件夹包含到 StreamingAssets 中的能力。导入示例到项目后,可以通过新的菜单项 Build/Disabled Importer Build 触发不导入资源的玩家构建。构建输出默认放置在 DisabledImporterBuildPath/{EditorUserBuildSettings.activeBuildTarget}/ 中。可以编辑示例类 DisableAssetImportOnBuild 来修改构建路径。
Import Existing Group包含一个工具,可以将组资源(例如自定义 package 中的资源)导入到当前项目中。该工具位于 Window/Asset Management/Addressables/Import Groups 下。窗口需要 AddressableAssetGroup.asset scriptable object 的路径、组名以及与导入的 AddressableAssetGroup 相关的任何 schemas 文件夹。
Prefab Spawner提供一个基本脚本,用于实例化和销毁预制件 AssetReference。要使用此示例,将提供的脚本 PrefabSpawnerSample 附加到场景中的某个 GameObject 上。将一个 Addressable 资源分配给该脚本的 AssetReference 字段。如果使用“使用现有构建(Use Existing Build)” Play 模式脚本,确保已构建 Addressable 内容。然后进入 Play 模式。

参考

  1. com.unity.addressables
  2. Addressables-Sample
  3. addressables-planning-and-best-practices
  4. Why use Addressables? - Unity Learn course.

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

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

相关文章

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【PWN · 栈溢出 | GOT劫持】[2024 · 长城杯]consumption

通过代码审计&#xff0c;找到栈溢出漏洞点&#xff0c;覆盖关键栈变量&#xff0c;实现任意地址写 前言 本题主要是套壳了Cjson&#xff0c;实则是约定了输入格式。通过仔细代码审计&#xff0c;即可找到栈溢出&#xff0c;并实现利用 一、题目 查阅网上资料&#xff0c;得知…

如何提取视频中的音频?新手也能轻松搞定

在数字媒体处理中&#xff0c;从视频文件中提取音频是一个常见需求。无论你是希望为视频制作单独的音频版本&#xff0c;还是想将某段视频的背景音乐用于其他项目&#xff0c;掌握音频提取技术都至关重要。本文将详细介绍几种提取视频中音频的方法&#xff0c;帮助你轻松实现这…

【自考zt】【软件工程】【21.04】(部分)

一、单选 二、填空 三、简答 四、应用 小结&#xff1a;

DeepSeek缓存命中技术,成本降低10倍

DeepSeek系列升级&#xff1a; DeepSeek发布最新的缓存命中技术&#xff0c;有效降低成本至0.1元/百万tokens&#xff0c;适用于文件读取和固定提示词。 点评&#xff1a;由于token消耗大部分是在系统提示词中&#xff0c;妥善使用确实可以极大降低成本&#xff0c;同时还能保证…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…

[git操作] git创建仓库上传github报错

操作流程如下 使用 git init使用 git remote add origin 项目ssh链接git add . 报错如下 Bus error (core dumped)然后执行任何别的操作都会报错&#xff1a; fatal: Unable to create path .. /.git/index.lock: File exists.Another git process seems to be running in …

​全国计算机软件中级资料分享

全国计算机软件中级资料分享 软考资料分析 软件设计师中间 免费资料 链接:https://pan.baidu.com/s/1GqbgIq_D0uZd-uuhIhG-Sg?pwd2atp 提取码:2atp 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 求个免费关注不过分吧。

vue实现评论滚动效果

vue插件实现滚动效果 一、安装组件 官网地址&#xff1a;https://chenxuan0000.github.io/vue-seamless-scroll/ 1、vue2安装 npm install vue-seamless-scroll --savevue3安装 npm install vue3-seamless-scroll --save二、组件引入 <template><div v-if"…

OpenCV 与 Matplotlib 的结合使用:轮毂检测与目标跟踪

目录 绘制轮廓图像 实现思路 1. 读取图像并转换为灰度图像 2. 二值化处理 3. 查找轮廓 4. 绘制轮廓 5. 显示结果 代码实现 效果展示 动态逐步显示轮廓结果 实现思路 1. 读取图像并缩放 2. 转换为灰度图像 3. 二值化处理 4. 查找轮廓 5. 动态显示轮廓 6. 显示最…

基于图神经网络的最大独立集问题的目标分支

文章目录 Abstract1 Introduction2 Related Work分支顶点选择图神经网络Abstract 分支归约方法结合了分支约束原则和归约规则,在处理以前无法管理的现实世界实例方面特别成功。分支策略决定下一个要在哪个顶点上进行分支。最近,最广泛使用的策略是选择最高度的顶点。 在这项…

C++为什么要引入智能指针?

智能指针的必要性 C 引入智能指针主要是为了解决手动管理动态分配内存时可能出现的几个问题&#xff0c;特别是内存泄漏、野指针和异常安全等问题。智能指针通过封装原始指针的操作&#xff0c;提供自动化的内存管理机制&#xff0c;以减少这些问题的发生。 具体来说&#xff…

c++基础补充

c基础补充 函数补充函数声明函数的分文件编写 指针补充占用大小空指针坏指针野指针 C内存分区模型 函数补充 函数声明 #include <iostream> using namespace std;int max(int a,int b);int main() {int result max(1,3);cout << result << endl;return 0;…

皮肤表皮层

表皮层的细胞大都是由基底层细胞分裂分化而来, 1:角质层 2:透明层 3:颗粒层 4:棘状层 5:基底层角质层 组成:由10-20 死细胞组成 细胞膜很厚 细胞核及胞器消失 细胞间隙被脂质连接 透明层 只出现在手掌和脚掌中 颗粒层 2-4层细胞角质细胞 活细胞 棘状层 有免疫…

chapter13-常用类——(Date、Calendar、LocalDate)—day17

目录 488-Date介绍 489-Date应用实例 490-Calendar介绍 491-Calendar应用实例 492-第三代日期使用 493-第三代日期方法 494-String翻转 495-注册处理题 496-字符串统计 497-String内存布局测试题 488-Date介绍 IDEA里面的properties是set/get方法 489-Date应用实例 49…

网络编程(UDP)

UDP编程 UDP&#xff1a;全双工通信、面向无连接、不可靠 UDP&#xff08;User Datagram Protocol&#xff09;用户数据报协议&#xff0c;是不可靠的无连接的协议。在数据发送前&#xff0c;因为不需要进行连接&#xff0c;所以可以进行高效率的数据传输。 适用场景 发送小尺寸…

transforemr网络理解

1.transformer网络中数据的流动过程&#xff1a; 2.transformer中残差的理解&#xff1a; 残差连接&#xff08;Residual Connection&#xff09; 的核心思想就是通过将输入与经过变化的输出相加&#xff0c;来最大限度地保留原始信息。 transforemr中注意力层网络和前馈神经…

国行 iPhone 15 Pro 开启苹果 Apple Intelligence 教程

一、前言苹果在 iOS 18.1 测试版上正式开启了 Apple Intelligence 的内测&#xff0c;但国行设备因政策原因不支持&#xff0c;且国行设备在硬件上被锁定。不过&#xff0c;我们可以通过一些方法来破解国行 iPhone 15 Pro&#xff0c;使其能够开启 Apple Intelligence。 以下是…

六、深入理解JVM 执行引擎

文章目录 前端编译与后端编译字节码指令是如何执行的解释执行与编译执行热点代码识别客户端编译器与服务端编译器 后端编译优化技术方法内联 Inline逃逸分析 Escape Analysis锁消除 lock elision 从计算机程序出现的第一天起&#xff0c;对执行效率的追求就是程序员天生的坚定信…