UE4插件研发 So Easy

2023-11-09

UE4插件扫盲

UE4插件是什么

UE4引擎和UE4项目是由各个模块组成的,其主要编程语言是C++。
插件也是一个模块,说到插件必须讲到耦合性与独立性,耦合性是对模块间关联程度的度量,模块间关联越强,则耦合性强,独立性差。
庞大的UE4引擎各模块相互参差作用,所以想要读懂并拆解并非易事,而创建UE4游戏项目实则只引入了引擎的部分模块,再想想如果很多游戏项目都需要用到这一个自定义功能时,是不是每个项目都要开发一次这个功能,个人或者一家公司内部还好,只要把项目代码复制给另一个项目即可,但是全球这么多的UE4开发者怎么办,开发者的结晶势必要发挥它最大的用处,把自己的研发成果分享出去,为了解决这类问题,就要使得模块独立起来,那么UE4插件就该闪亮登场了。

UE4插件的作用

举个栗子:两个人同时在设计创建机器人,A为自己的机器人造了一把枪,B却为自己的机器人造了飞行器,AB两人把自己的成果分享出来,于是高达诞生了。
UE4引擎拥有插件管理模块并提供了插件加载卸载和其他功能接口,所以UE4插件可以自定义功能,因为其独立性强可以发布共享,且使用方便。

UE4引擎、项目、插件的区别

UE4引擎由Epic官方维护与发布,源码托管在GitHub平台上,可以上官网下载EpicGamesLauncher管理下载各个UE4 Release版本。

UE4项目是基于某个版本而创建的Game项目,在Game项目中可以设计关卡、摆放场景、添加功能、发布应用程序等,发布后可以脱离引擎独立运行。

UE4插件可以增加UE4的扩展性,丰满Game项目,也可让开发应用程序变得简单且多样化,但其不能独立运行。

引擎自带的插件浏览器

UE4插件管理界面中的插件对应了UE4安装目录下的Plugins文件下的插件,列表类目名有些和文件夹名字对应不上,那是因为类目名由插件项目.uplugin文件中的Category字段内容来生成的。

1. UE4插件浏览器界面
在这里插入图片描述
2. UE4安装目录插件文件夹
在这里插入图片描述

插件目录结构

假如创建一个游戏项目叫PluginFactory,在这个游戏项目来创建一个名为PanoCam的插件则插件目录如下

  • PluginFactory
    • Plugins
      • PanoCam
        • Binaries
        • Content
        • Intermediate
        • Resources
        • Source
          • PanoCam
            • Private
              • PanoCam.cpp
            • Public
              • PanoCam.h
            • PanoCam.Build.cs
        • PanoCam.uplugin

Binaries:编译后的dll文件存放位置
Content:游戏资源Asset文件存放位置
Intermediate:编译的中间文件存放位置
Resources:一般为图片图标的存放位置
Source:代码存放位置
.uplugin文件:插件项目配置文件,JSON格式
.Build.cs文件:每个 .build.cs 文件声明派生自 ModuleRules 基类的类,并设置属性控制器从构造函数进行编译的方式。由虚幻编译工具编译,并被构造来确定整体编译环境。使用C#语法

插件配置文件说明

1. uplugin文件

{
	"FileVersion": 3,
	"Version": 1,
	"VersionName": "1.0",
	"FriendlyName": "PanoCam",
	"Description": "",
	"Category": "Other",
	"CreatedBy": "Scrat",
	"CreatedByURL": "",
	"DocsURL": "",
	"MarketplaceURL": "",
	"SupportURL": "",
	"CanContainContent": true,
	"IsBetaVersion": false,
	"Installed": true,
	"Modules": [
		{
			"Name": "PanoCam",
			"Type": "Runtime",
			"LoadingPhase": "PreDefault",
			"WhitelistPlatforms": [
				"Win32",
				"Win64"
			]
		}
	]
}

几个重点注意的标签

  1. Category:类目名即在插件浏览器中所属的类目。
  2. Installed:默认启用或禁用状态,在插件浏览器中可以控制加载卸载插件模块。
  3. Modules:描述模块名、运行类型、加载时机、支持平台等信息。
  4. Type:Runtime,RuntimeNoCommandlet,Developer,Editor,EditorNoCommandlet,Program。
  5. LoadingPhase:Default,PreDefault,PostConfigInit,PostConfigInit。
  6. WhitelistPlatforms:支持的平台
  7. BlacklistPlatforms:不支持的平台

2. Build.cs文件

// Copyright 1998-2018 Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;

public class PanoCam : ModuleRules
{
	public PanoCam(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
		
		PublicIncludePaths.AddRange(
			new string[] {
				"PanoCam/Public"
				// ... add public include paths required here ...
			}
			);
				
		PrivateIncludePaths.AddRange(
			new string[] {
				"PanoCam/Private",
				// ... add other private include paths required here ...
			}
			);
			
		PublicDependencyModuleNames.AddRange(
			new string[]
			{
				"Core",
				// ... add other public dependencies that you statically link with here ...
			}
			);
			
		PrivateDependencyModuleNames.AddRange(
			new string[]
			{
				"CoreUObject",
				"Engine",
				"Slate",
				"SlateCore",
				// ... add private dependencies that you statically link with here ...	
			}
			);
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);
	}
}

配置文件中的属性说明

  1. public class PanoCam : ModuleRules 中的PanoCam为模块名,代码引用中认准这个名字
  2. PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs
    预编译标头使用显示或共享标头。
  3. PublicIncludePathModuleNames (List)
    带有标头文件的模块名称列表(无需路径),需要由模块的公共标头访问,但不需要再“导入”或链接。
  4. PublicDependencyModuleNames (List)
    公共依赖性模块名称列表(不需要路径)(自动包含私有/公共)。这些是公共源文件所需的模块。
  5. PrivateIncludePathModuleNames (List)
    带有标头文件的模块名称列表(无需路径),需要由模块的私有代码文件访问,但不需要再“导入”或链接。
  6. PrivateDependencyModuleNames (List)
    私有依赖性模块名称列表。这些是私有代码所依赖的模块,但公共include文件中没有任何依赖。
  7. DynamicallyLoadedModuleNames (List)
    此模块在运行时可能需要的附加模块。
  8. PublicSystemIncludePaths (List)
    系统/库include路径列表,通常用于外部(第三方)模块。在解析标头依赖项时未检查的公共稳定标头文件目录。
  9. PublicIncludePaths (List)
    (当前不需要此设置,因为可以从“Public”文件夹中搜索所有文件)公开给其他模块的include文件的所有路径列表。
  10. PrivateIncludePaths (List)
    此模块内部include文件的所有路径的列表,未公开给其他模块(至少有一个包含在“私有”路径中,如果要避免相对路径,可以添加更多)
  11. PublicLibraryPaths (List)
    系统/库路径列表(.lib文件的目录),通常用于外部(第三方)模块。
  12. PublicAdditionalLibraries (List)
    其他库的列表(包括扩展名的.lib文件的名称),通常用于外部(第三方)模块。

Build.cs配置文件一个重要技巧
如果插件中有依赖非UAsset文件,打包时需要手动拷贝到打包对应路径下,使用一下方法可使其自动拷贝过去

using UnrealBuildTool;
using System.IO;
public class PanoCam : ModuleRules
{
	//封装一个函数专门获取依赖文件的路径
	private string ContentSlatePath
    {
        get { return Path.GetFullPath(Path.Combine(ModuleDirectory, "../../Content/Slate/")); }
    }

	public PanoCam(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
		//遍历路径下的文件,通过RuntimeDependencies来添加运行时依赖文件
		if (Directory.Exists(ContentSlatePath))
        {
            foreach (string Picture in Directory.EnumerateFiles(ContentSlatePath, "*.*", SearchOption.AllDirectories))
            {
                RuntimeDependencies.Add(Path.Combine(ContentSlatePath, Picture));
            }
        }
	}
}

UE4插件的创建方法

开发环境:Windows、UE4.21、VistualStudio2017
前提:必须创建一个UE4 C++项目
插件创建有三种方法:

1.使用UE4自带的插件创建方法
在这里插入图片描述
2.自己手动创建插件目录及相关配置与代码文件
手动创建后需要在UE4项目的.uproject文件上右键执行Generate Vistual Studio project files来刷新代码目录结构,如果只是添加或删减少量文件的话此步骤也可以手动在VistualStudio中操作。

3.写一个插件生成插件
创建一个插件,并在插件中设置自定义的插件模板文件,在插件功能中复制对应的自定义插件模板文件到项目插件目录中,并动态修改文件夹名和文档关键字即可实现自定义插件生成器。

插件代码的执行过程

PanoCam.h的代码内容如下

#pragma once

#include "CoreMinimal.h"
#include "ModuleManager.h"

class FPanoCamModule : public IModuleInterface
{
public:

	/** IModuleInterface implementation */
	virtual void StartupModule() override;
	virtual void ShutdownModule() override;
};

每个独立模块都有一个这样的类且继承于 IModuleInterface,重写了插件加载卸载的方法。
.uplugin文件中Modules下的LoadingPhase字段说明了模块加载的时机,当满足这个时机时此模块StartupModule函数将被调用。
此插件的功能入口就是从这里开始。
当程序关闭或主动调用ShutdownModule函数时,模块将被卸载。

四种常用模式的插件模板

  1. Blank
    空白模板,最简洁的结构,只有模块类和加载卸载函数,一张白纸最好作画了。
  2. BlueprintLibrary
    蓝图功能库模板,都是静态函数,提供给蓝图直接调用的,如果只是单一的功能集的话,用此模板最快捷
  3. EditorToolbarButton
    编辑器工具栏按钮模板,此模板在模块加载时会在UE4编辑器工具栏中注册一个按钮,点击此按钮将触发插件模块中的PluginButtonClicked函数。
  4. EditorStandaloneWindow
    编辑器独立窗口模板,顾名思义,它将创建出一个窗口,可以在此窗口中自定义界面,像引擎编辑器的各个界面一样的效果。

第三方库的引入

UE4模块引入第三方库,只要在Build.cs中配置头文件路径及添加lib文件即可。
以zlib为例,在.uplugin同级创建ThirdParty文件夹,把第三方库文件放在其中,此处为了节省篇幅只展示一条全路径zlib/v1.2.8/include/Win64/VS2015/。
此第三方库zlib引擎自带,可根据自己的引擎安装目录获取到(如:E:\Program Files\Epic Games\UE_4.21\Engine\Source\ThirdParty\zlib),我也上传了一份到csdn资源中可供单独下载使用。
目录结构如下。

  • plugins
    • PanoCam
      • Source
      • PanoCam.uplugin
      • ThirdParty
        • zlib
          • v1.2.8
            • lib
            • include
              • Win32
              • Win64
                • VS2015
                  • zconf.h
                  • zlib.h

重新编辑Build.cs代码,引入第三方库zlib

using UnrealBuildTool;

public class PanoCam : ModuleRules
{
	public PanoCam(ReadOnlyTargetRules Target) : base(Target)
	{
		PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;

       //~~~和之前一样,此处代码不变
		
		DynamicallyLoadedModuleNames.AddRange(
			new string[]
			{
				// ... add any modules that your module loads dynamically here ...
			}
			);
			
		//此处开始配置第三方库zlib
        string zlibPath = ModuleDirectory + "../ThirdParty/zlib/v1.2.8/";
        if (Target.Platform == UnrealTargetPlatform.Win64)
        {
            string platform = "/Win64/VS2015";
            PublicIncludePaths.Add(zlibPath + "include" + platform);
            PublicLibraryPaths.Add(zlibPath + "lib" + platform);
            PublicAdditionalLibraries.Add("zlibstatic.lib");
        }

        else if (Target.Platform == UnrealTargetPlatform.Win32)
        {
            string platform = "/Win32/VS2015";
            PublicIncludePaths.Add(zlibPath + "include" + platform);
            PublicLibraryPaths.Add(zlibPath + "lib" + platform);
            PublicAdditionalLibraries.Add("zlibstatic.lib");
        }
    }
}

虽然添加了十几行代码,但重要的代码就三行

  1. PublicIncludePaths.Add(zlibPath + “include” + platform); //此行是把(.h)头文件路径引入。
  2. PublicLibraryPaths.Add(zlibPath + “lib” + platform); //此行是把(.lib)库文件路径引入。
  3. PublicAdditionalLibraries.Add(“zlibstatic.lib”); //此行是把(.lib)库文件引入。

之后就可以在你的代码中#include 第三方的(.h)文件,使用其中的功能了。

牛刀小试

创建Actor到视图插件

  1. 新建UE4 C++项目。
  2. 在UE4编辑器菜单栏Edit中打开Plugins。
  3. 新建插件,模板选择Editor Toolbar Button,插件名随意。
    在这里插入图片描述
  4. VS项目会自动加载刷新,目录结构如下
    在这里插入图片描述
  5. 在TestToolbar.cpp添加代码
//添加头文件
#include "LevelEditorViewport.h"
#include "Engine/StaticMeshActor.h"

//修改PluginButtonClicked函数代码
void FTestToolbarModule::PluginButtonClicked()
{
	//通过当前编辑视图实例获取当前World
	UWorld *World = GCurrentLevelEditingViewportClient->GetWorld();
	if (World)
	{
		//在视图中放置StaticMeshActor
		AStaticMeshActor* Actor = World->SpawnActor<AStaticMeshActor>(FVector(0, 0, 100), FRotator::ZeroRotator);
		//加载引擎Asset资源
		UStaticMesh* ConeMesh = LoadObject<UStaticMesh>(NULL, TEXT("/Engine/BasicShapes/Cone.Cone"), NULL, LOAD_None, NULL);
		UMaterial* Mat = LoadObject<UMaterial>(NULL, TEXT("/Engine/BasicShapes/BasicShapeMaterial.BasicShapeMaterial"), NULL, LOAD_None, NULL);

		if (ConeMesh)
		{
			//设置Mesh材质
			ConeMesh->SetMaterial(0, Mat);
			//设置MeshComponent的Mesh
			Actor->GetStaticMeshComponent()->SetStaticMesh(ConeMesh);
		}
		//刷新编辑中的视图,如果不加这行,则需要鼠标触发一下视图,视图才会刷新
		GEditor->RedrawLevelEditingViewports(true);
	}
}
  1. 编译后启动项目。
  2. 点击工具栏中新注册的按钮即可。
    在这里插入图片描述
    熟悉引擎架构,利用好UE4 API可以在创造出无限可能,有好的东西自然要懂得分享,小时候妈妈经常这样教导我们,那么试试发布你的插件吧。

插件打包

  1. 打包插件之前需要先确保声明插件所支持的平台(参考上面.uplugin文件配置说明内容)
    	"WhitelistPlatforms": [
    				"Win32",
    				"Win64"
    			]
    
  2. 打包插件有两种方法(插件管理页面打包/批处理命令打包)
    2.1 在UE4插件管理页面中打包插件
    在这里插入图片描述
    2.2. 批处理命令打包插件
    "E:\Program Files\Epic Games\UE_4.27\Engine\Build\BatchFiles\RunUAT.bat" BuildPlugin -Plugin="D:\Work\UE4.27\DTPluginFactory\Plugins\DigitalTwin\DigitalTwin.uplugin" -Package="D:\Work\UE4.27\PluginsPackage" -VS2019=true -CreateSubFolder
    
    
  3. 不带源码发布
  • 纯蓝图项目
    删除插件的Intermediate和Source文件夹中的Public和Private文件夹,只保留.Build.cs文件,修改.uplugin文件
    //部分省略 ,需添加 "EnabledByDefault": false,否则启动打包程序运行将失败
    "EnabledByDefault": false, 
    "Installed": true,
    
  • C++项目
    删除插件Source文件夹中的Public和Private文件夹,只保留.Build.cs文件,需要修改.Build.cs文件内容
    //若存在bPrecompile = true; 则替换成bUsePrecompiled = true;
    //否则添加bUsePrecompiled = true;
    
    不然其他C++项目使用此插件会重编译插件失败,若编译项目后放置插件虽然能在编辑器上使用但打包会报错,报错提示需要设置这么一个东西:PrecompileForTargets = PrecompileTargetsType.None

插件发布

插件发布是指把你开发的插件分享出去给其他人使用,这时候有几个地方要注意

  1. 插件发布到哪里?(别人从哪里获取你的插件文件?)
    如果是公司内部则好办,文件传输或者公司自己的资源平台即可
    如果是发布到UE4官方商城,则需要进入www.unrealengine.com查阅虚幻商城指南,大致流程如下:
    1. 注册Epic账号并登陆。
    2. 进入发布者门户(Publisher Portal)
    3. 申请成为UE4商城卖家主要有5步,需要添加必要信息。
      1. PUBLISHER INFO(商家信息): 必须填写手机号
      2. STORE INFO(商店信息):此处可以直接下一步
      3. PAYOUT INFO(支付信息):使用PayPal或者银联卡
      4. TAX INFO(税收信息):国家 - 中国、I Report Tax Outside Of The United States、NameOnTaxID - 0、Individual/Sole Proprietor、地址信息······。
      5. OPEN SHOP(开张)
    4. 编辑商品信息。
    5. 提交商品表单,官方会在一定时间内审核。
  2. 插件编译版本
    用户使用插件时的UE4版本需要与插件编译时的UE4版本一致,不然会警告提示版本不一致而丢失插件。
    所以发布插件时要注明插件所支持的UE4版本号。
  3. 插件平台支持
    同上,如果插件支持Win32和Win64 或是 Mac 或是Android,发布时也需要注明。
  4. 插件运行类型
    .uplugin文件中的Module标签下的Type标签表明了插件运行类型,如果不是Runtime则不是运行在打包后的Game中,Developer或Editor等其他值可查阅官方资料。
  5. 插件更新机制
    如有平台支持,可设计更新机制,开发过程复杂,此处跳过

常见的问题

  1. 增删代码时,没有更新VistualStudio项目(uproject文件上右键点击Generate Vistual Studio project files可更新重载项目代码)
  2. .Build.cs代码语法错误导致编译错误。
  3. 第三方库路径配置错误,导致引入失败,头文件找不到或者链接lib文件失败。
  4. 引擎版本与插件版本不一致导致插件模块丢失不能使用。
  5. 插件的"Installed": false,或者插件浏览器中没有启动插件,导致插件模块没有找到。
  6. 插件的Module下的"Type"配置与实际项目运行类型不一致。
  7. .插件的Module下的"LoadingPhase"配置与项目实际使用插件模块时机不一致,导致插件模块没有找到。
  8. uplugin内容语法错误导致启动失败。

插件项目案例

更多插件链接,敬请关注。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4插件研发 So Easy 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 调用许多网络服务的最佳方式?

    我有 30 家子公司 每家都实施了他们的 Web 服务 使用不同的技术 我需要实现一个Web服务来聚合它们 例如 所有子公司的Web服务都有一个名为的Web方法GetUserPoint int nationalCode 我需要实现我的网络服
  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • std::list::clear 是否会使 std::list::end 迭代器无效?

    检查这个代码 include stdafx h include
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 在 Mac OS X 上安装 libxml2 时出现问题

    我正在尝试在我的 Mac 操作系统 10 6 4 上安装 libxml2 我实际上正在尝试在 Python 中运行 Scrapy 脚本 这需要我安装 Twisted Zope 现在还需要安装 libxml2 我已经下载了最新版本 2 7 7
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • 编写具有多种类型的泛型扩展方法时的类型推断问题

    我正在为 IEnumerable 编写一个通用扩展方法 用于将对象列表映射到另一个映射对象列表 这就是我希望该方法的工作方式 IList
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • WPF DataGrid - 在每行末尾添加按钮

    我想在数据网格的每一行的末尾添加一个按钮 我找到了以下 xaml 但它将按钮添加到开头 有人知道如何在所有数据绑定列之后添加它吗 这会将按钮添加到开头而不是末尾
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 使用 boost 异步发送和接收自定义数据包?

    我正在尝试使用 boost 异步发送和接收自定义数据包 根据我当前的实现 我有一些问题 tcpclient cpp include tcpclient h include
  • Emacs C++,打开相应的头文件

    我是 emacs 新手 我想知道 是否有在头文件 源文件和相应的源文件 头文件之间切换的快捷方式 是否有像通用 emacs 参考卡那样的参考卡 Thanks There s ff find other file 您可以使用以下方法将其绑定到

随机推荐

  • 知识图谱相关会议之观后感分享与学习总结

    2015年6月27日 清华大学FIT楼多功能报告厅 中国中文信息学会青年工委系列学术活动 知识图谱研究青年学者研讨会 由于我毕设是与知识图谱 实体消歧 实体对齐 知识集成相关的 所以去听了这个报告 同时报告中采用手写笔记 所以没有相应的PP
  • HDU-2063过山车

    题目链接 http acm hdu edu cn showproblem php pid 2063 解题思路 匈牙利算法 二分图模板 代码 include
  • Win11未检测到Logitech Unifying接收器的解决方法

    Logitech Unifying接收器利用罗技先进的2 4 GHz无线连接技术 并配有优联接收器连接 此款罗技鼠标可同时带给用户线束的可靠性和无线的方便与自由 今天小编将为大家带来Win11未检测到Logitech Unifying接收器
  • 云计算的三种服务模式:IaaS,PaaS和SaaS

    云 其实是互联网的一个隐喻 云计算 其实就是使用互联网来接入存储或者运行在远程服务器端的应用 数据 或者服务 云也是分层的 任何一个在互联网上提供其服务的公司都可以叫做云计算公司 其实云计算分几层的 分别是Infrastructure 基础
  • InnoDB 和 MyISAM 的索引实现有什么区别 ?

    面试官问 InnoDB 和 MyISAM 的索引实现有什么区别 InnoDB 和 MyISAM 底层都是 B 树的实现啊 难道还有区别吗 虽说二者的底层实现都是 B 树 但是二者却完全不同 主键索引文件存储不同 MyISAM 引擎的索引文件
  • 物联网平台如何为OPC服务器创造新生命力

    在前一篇的 OPC服务器简介和入门介绍 中为大家介绍了OPC的体系结构 传统opc服务器具有的如下几个优势特点 1 支持与不同的供应商沟通 2 消除系统中对自定义驱动程序的需求 3 减少设备负载 4 方便访问数据 这让我们在纷繁的工业设备和
  • Python中的AES解密和加密,爬虫时碰见AES加密怎么办?

    coding utf 8 from Crypto Cipher import AES import base64 import time import json class Decrypt def init self key iv self
  • ARM NEON编译优化

    NEON被设计为附加的加载 存储架构 以提供良好的矢量化 编译器对c c 等语言有良好的支持 这样可以实现很高水平的并行性 开发者可以为需要高性能的应用程序编写NEON指令来实现相应功能 最重要的是它实现了访问交叉存储在内存中的多个数据流并
  • 对解数独问题的归纳

    解数独 我们都可能玩过或者了解知道 就是数独游戏 数独是一种运用纸 笔进行演算的逻辑游戏 玩法 在空格里填入数字1到9 使得每一行 每一列和每一个用粗线围起来的3 3的九个单元格里 填数都包含1到9各一个 而利用电脑怎样实现呢 怎样将我们的
  • xshell链接服务器报错To escape to local shell, press ‘Ctrl+Alt+]‘

    关掉代理即可
  • C语言学习日记(2)——写个Hello,World测试一下

    感觉工具已经安装好了 但到底怎么样还要试过才知道 那就写一个经典的Hello World程序测试一下吧 首先打开vscode 新建一个文件 输入代码 代码字体颜色全都是白色的 看到状态栏右下角 原来文件格式还是Plain Text 设置一下
  • 2021各厂免费云服务器申请攻略(阿里云/腾讯云/华为云)

    阿里云腾讯云华为云一直都有免费云服务器提供 企业用户个人用户可以申请的免费云服务器配置及免费时长都不同 云服务器吧来详细说下阿里云免费云服务器 腾讯云免费云服务器和华为云免费服务器申请地址 申请条件及申请攻略 阿里云免费云服务器 阿里云免费
  • RabbitMQ-推(push)模式

    推 push 模式 采用Basic Consume进行消费 关键代码
  • Python3学习笔记:Python中的None和空字符串''

    一 定义 None python中的内建常数 是NoneType中唯一的值 且不能赋值 一般用于函数中表示参数的缺省 空字符串 代表是字符串 None print type None print bool None 执行结果
  • CSDN竞赛第37期题解

    CSDN竞赛第37期题解 1 题目名称 幼稚班作业 幼稚园终于又有新的作业了 老师安排同学用发给同学的4根木棒拼接成一个三角形 当然按照正常的逻辑 如果不能拼 接成三角形 必然要折断某个木棍来拼接三角形 可是懒惰的小艺当然不会费力了 如果拼
  • 从男士正装切入服装租赁领域,The Black Tux 获 2500 万美元 B 轮融资

    近日 自营男士正装租赁品牌The Black Tux宣布获 2500 万美元 B 轮融资 本轮由 Stripes Group 领投 该机构还对时尚品牌 Reformation 进行过注资 其他投资方还包括 First Round Capit
  • Eslint-plugin-vue 报警告问题解决

    问题描述 eslint plugin vue vue valid v for Custom elements in iteration require 提示警告 解决办法 修改首选项的默认用户设置 如下图 设置将Eslint vetur 校
  • 【Grafana】CentOS下安装Grafana

    Grafana CentOS下安装Grafana 本文主要是在CentOS下对Grafana的安装和配置等进行介绍 以及一些踩过的坑 文章目录 Grafana CentOS下安装Grafana 一 基本介绍 二 安装方法 1 从YUM存储库
  • c# uint[]和int[] 转 byte[]的几种方式

    uint UintArray byte ByteArray 1 for循环转 for int i 0 i
  • UE4插件研发 So Easy

    UE4插件研发 UE4插件扫盲 UE4插件是什么 UE4插件的作用 UE4引擎 项目 插件的区别 引擎自带的插件浏览器 插件目录结构 插件配置文件说明 UE4插件的创建方法 插件代码的执行过程 四种常用模式的插件模板 第三方库的引入 牛刀小