【资深架构师亲授】UE5中C++插件热重载技术突破:实现千级插件零重启

UE5热更新(Pak包的Cook,打包,加载,踩过的一些坑) 3.Pak包资源的虚拟路径-NewFileName,我的是"Blueprint’/Game/DLC/DLC_Cube.DLC_Cube_C’",在我们烘培的时候,直接在UE5编辑器选择资源-》复制引用,后面加上”_C“,即可得到该路径。最后派生一个Actor,调用该函数,放到场景中,将UE5编辑器的DLC文件夹删除,注意每次执行删除资源或者移动资源时,要选择内容右键修复文件夹中的重定向器,这样才能将引用,资源处理完成。先创建DLC文件夹,有一个Actor,一个贴图,一个材质,一个Mesh, 阅读详情

第一章:UE5 C++插件热重载技术概述

在Unreal Engine 5中,C++插件的热重载(Hot Reload)技术显著提升了开发效率,允许开发者在不重启编辑器的前提下重新加载已修改的C++代码。这一功能依赖于模块化架构和动态库机制,使得编译后的插件DLL被卸载并替换为新版本,随后由引擎自动重新加载。

热重载的工作机制

UE5通过Dynamically Loaded Module系统实现热重载。当用户保存并编译C++插件后,Visual Studio或命令行构建工具会生成新的DLL文件。引擎检测到该文件更新后,调用模块管理器卸载旧模块、加载新模块,并恢复运行状态。
  • 插件必须以“Shared”或“Modular”方式构建
  • 仅支持在编辑器模式下使用热重载
  • 类结构变更(如添加成员变量)可能导致热重载失败

启用与触发热重载

确保项目配置正确是成功热重载的前提。在Build.cs文件中需设置模块类型:

// MyPlugin.Build.cs
public class MyPlugin : ModuleRules
{
    public MyPlugin(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
        bPrecompile = true; // 支持预编译头
        bAllowLinkingToObjectsProducedByOtherModules = true;
    }
}
执行热重载可通过以下任一方式:
  1. 在Visual Studio中编译插件项目
  2. 使用命令行:UBT.exe MyProject Win64 Development -ModuleWithSuffix=MyPlugin
  3. 在UE5编辑器中点击“重建”按钮

热重载限制与注意事项

尽管热重载极大提升迭代速度,但仍存在若干限制:
限制类型说明
蓝图引用若C++类被蓝图引用且结构改变,可能导致崩溃
静态变量热重载后不会保留原值
全局对象析构可能无法完全释放资源
graph TD A[修改C++插件代码] --> B[编译生成新DLL] B --> C{引擎检测到更新} C -->|是| D[卸载旧模块] D --> E[加载新DLL] E --> F[恢复执行上下文] C -->|否| G[保持当前状态]

第二章:热重载机制核心原理剖析

2.1 模块化架构与动态链接基础

模块化架构通过将系统划分为独立功能单元,提升代码可维护性与复用效率。各模块在编译时可独立构建,运行时通过动态链接机制加载共享库。
动态链接的工作流程
操作系统在程序启动时解析依赖的共享库(如 Linux 下的 .so 文件),并将符号引用与实际内存地址绑定。
  • 符号解析:查找函数或变量在共享库中的位置
  • 重定位:调整模块内地址偏移以适应加载基址
  • 延迟绑定:首次调用时才完成函数地址解析

// 示例:动态链接库导出函数
__attribute__((visibility("default")))
int compute_sum(int a, int b) {
    return a + b; // 被其他模块调用的核心逻辑
}
上述代码使用 GCC 可见性属性确保函数被正确导出。参数 a 和 b 为输入值,返回其算术和,供主程序动态调用。

2.2 UE5编译系统与DLL热替换流程

UE5采用基于MSVC的模块化编译系统,通过Unreal Build Tool(UBT)管理目标平台的DLL生成。每个模块独立编译为动态链接库,便于运行时热替换。
编译流程核心机制
  • UBT解析.Build.cs文件,确定模块依赖关系
  • 生成项目文件并调用编译器输出DLL
  • 引擎运行时动态加载模块DLL
热替换实现步骤

// 示例:模块重载触发逻辑
FModuleManager::Get().UnloadModule(TEXT("MyGameModule"));
FModuleManager::Get().LoadModule(TEXT("MyGameModule"));
该代码手动卸载并重新加载指定模块,适用于开发期间快速验证C++修改。需确保对象引用正确释放,避免内存崩溃。
阶段操作
编译UBT生成增量DLL
部署复制至Binaries/Win64
加载引擎热插拔模块

2.3 热重载中的内存布局与符号解析

在热重载机制中,新旧代码版本共存于同一进程空间,内存布局需支持动态替换。运行时系统通过符号表定位函数入口,确保调用跳转至最新编译版本。
符号解析过程
热重载时,动态链接器重新映射共享库或模块的符号地址。每个函数符号在符号表中维护版本链表,便于快速切换。
  • 旧版本函数保留在内存中直至调用栈清理
  • 新符号注册并绑定至更新后的代码段
  • 运行时调度器拦截函数调用,重定向至新版实现
内存分区示例
区域用途
.text.old存储旧版函数指令
.text.new加载新版代码
.symtab维护多版本符号映射

// 符号重绑定伪代码
void reload_symbol(const char* name, void* new_addr) {
    Symbol* sym = lookup_symbol(name);     // 查找现有符号
    sym->old_addr = sym->current_addr;     // 保留旧地址
    sym->current_addr = new_addr;          // 指向新实现
}
该逻辑确保函数指针更新原子性,避免执行中途跳转导致崩溃。

2.4 插件依赖管理与加载时序控制

在复杂系统中,插件往往存在相互依赖关系,若加载顺序不当,可能导致功能异常或运行时错误。因此,必须建立清晰的依赖解析机制。
依赖声明与解析
插件可通过配置文件声明其依赖项,系统在初始化阶段构建依赖图谱。例如,使用 JSON 格式定义插件元信息:
{
  "name": "auth-plugin",
  "version": "1.0",
  "requires": ["logger-plugin", "config-plugin"]
}
该配置表明 auth-plugin 依赖于 logger-plugin 和 config-plugin,系统需优先加载后者。
拓扑排序确保加载顺序
根据依赖关系构建有向无环图(DAG),通过拓扑排序算法确定安全加载序列。下表展示排序前后的示例:
插件名称依赖项
A[]
B[A]
C[B]
最终加载顺序为 A → B → C,避免循环依赖与未满足前置条件的问题。

2.5 跨平台热重载行为差异与兼容策略

在多平台开发中,热重载(Hot Reload)的行为常因平台实现机制不同而产生差异。例如,iOS 和 Android 在状态保留、资源加载顺序上存在细微差别,导致相同代码在不同设备上表现不一致。
常见平台差异
  • iOS 模拟器对文件变更响应更快,但真机可能延迟明显
  • Android 因插桩机制不同,部分静态字段无法正确重载
  • Web 平台支持完整 DOM 替换,但内存泄漏风险更高
统一兼容方案
// 使用条件编译适配平台差异
import 'package:flutter/foundation.dart' show kIsWeb;

void performSafeReload() {
  if (kIsWeb) {
    // Web:避免频繁重建全局服务
    resetOnlyUIState();
  } else {
    // 移动端:可安全重置业务逻辑层
    resetBusinessLogic();
  }
}
上述代码通过 kIsWeb 判断运行环境,在不同平台上执行对应的重载清理逻辑,避免状态错乱。结合平台特性设计分层重置机制,是保障热重载稳定性的关键策略。

第三章:千级插件工程化实践路径

3.1 大规模插件项目的目录结构设计

在构建大规模插件系统时,合理的目录结构是维护性和可扩展性的基础。应遵循职责分离原则,将核心逻辑、插件模块、配置与工具代码清晰划分。
标准目录布局
  • plugins/:存放所有独立插件模块
  • core/:提供插件生命周期管理、注册机制
  • shared/:跨插件共用的工具函数与类型定义
  • configs/:环境配置与插件加载清单
插件模块示例结构
plugins/
└── data-exporter/
    ├── manifest.json
    ├── index.ts
    ├── service.ts
    └── utils/
        └── formatter.ts
其中,manifest.json 定义插件元信息(名称、版本、依赖),index.ts 为入口文件,负责注册服务。
核心加载机制
插件注册 → 元数据解析 → 依赖注入 → 运行时挂载

3.2 自动化注册与反射数据同步方案

在微服务架构中,服务实例的动态变化要求注册与数据同步机制具备高实时性与一致性。通过自动化注册中心(如Consul或Nacos),服务启动时自动向注册中心上报元数据。
数据同步机制
服务间通过心跳检测与Watch机制实现状态感知。当服务A注册后,注册中心触发事件通知所有监听者,反射更新本地缓存。
  • 服务启动时自动生成元数据(IP、端口、标签)
  • 通过gRPC接口向注册中心注册实例
  • 注册中心广播变更事件至消息总线
// 示例:服务注册逻辑
func Register(serviceName, host string, port int) error {
    client, _ := nacos.NewNamingClient(...)
    _, err := client.RegisterInstance(vo.RegisterInstanceReq{
        Ip:          host,
        Port:        uint64(port),
        ServiceName: serviceName,
        Weight:      1.0,
    })
    return err
}
上述代码调用Nacos客户端将当前服务实例注册至注册中心,参数包含网络地址与服务名,确保服务可被发现。

3.3 构建性能优化与增量编译调优

在大型项目中,构建性能直接影响开发效率。启用增量编译可显著减少重复构建时间,仅重新编译变更部分及其依赖。
配置增量编译策略
以 Gradle 为例,可通过以下配置优化构建行为:

// gradle.properties
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.daemon=true
kotlin.incremental=true
上述参数分别启用并行构建、构建缓存、守护进程和 Kotlin 增量编译,综合提升构建速度。
构建性能监控
使用构建扫描(Build Scan)功能分析耗时任务:
  1. 执行 ./gradlew build --scan
  2. 查看各阶段执行时间分布
  3. 识别瓶颈任务并针对性优化
合理配置资源与依赖隔离,结合缓存机制,可实现秒级热重载响应。

第四章:零重启热更新关键技术实现

4.1 插件热卸载与状态保存机制

在动态插件系统中,热卸载能力允许运行时移除插件而不中断服务。为确保数据一致性,必须在卸载前完成状态持久化。
状态保存流程
  • 检测插件引用计数是否为零
  • 触发预卸载钩子(pre-unload hook)
  • 序列化当前运行时状态至共享存储
  • 释放资源并从模块注册表中注销
代码实现示例
func (p *Plugin) Unload() error {
    if p.RefCount > 0 {
        return ErrPluginInUse
    }
    // 保存运行时状态
    if err := p.SaveState(); err != nil {
        return err
    }
    p.manager.Deregister(p.Name)
    return nil
}
上述代码中,Unload 方法首先校验引用计数,防止正在使用的插件被强制卸载;SaveState() 负责将内存中的配置、会话或缓存数据写入持久化层,保障后续热加载时可恢复上下文。

4.2 运行时类重构与UObject实例迁移

在大型游戏运行过程中,热更新或模块动态加载常需对已有类结构进行重构。此时,原有UObject实例需安全迁移到新类定义下,避免引用失效或状态丢失。
实例迁移流程
迁移过程分为三步:元数据比对、字段映射、引用修复。系统首先通过反射获取新旧类的属性布局差异,再逐字段复制兼容数据。
核心代码实现

void UClass::MigrateInstance(UObject* Instance, UClass* NewClass) {
    // 保存旧实例数据
    auto OldData = Instance->GetSerializedData();
    // 创建新类实例并复制元信息
    Instance->SetClass(NewClass);
    NewClass->ReconstructObject(Instance);
    // 按字段名匹配并恢复状态
    for (auto& Prop : NewClass->GetProperties()) {
        auto OldProp = FindCompatibleProperty(Prop);
        if (OldProp) Prop->CopyValue(Instance, OldProp);
    }
}
该函数确保在类结构变更后,对象实例仍保留有效状态。参数Instance为待迁移对象,NewClass为目标类定义。关键在于属性级别的兼容性判断与值复制,避免内存越界。

4.3 蓝图接口兼容性处理与事件重绑定

在跨版本蓝图系统集成中,接口兼容性是确保模块稳定通信的关键。当底层API变更时,需通过适配层转换调用格式。
接口适配器模式应用
采用适配器模式封装旧版接口调用:

// 适配器类将新版请求转为旧版格式
class LegacyInterfaceAdapter {
public:
    void OnEventTrigger(const NewEvent& e) {
        OldEvent old = Convert(e); // 转换逻辑
        legacy->Handle(old);
    }
private:
    LegacySystem* legacy;
};
该代码通过Convert方法映射字段差异,使新事件结构兼容旧处理器。
事件重绑定机制
使用配置表动态绑定事件与处理函数:
事件名目标函数启用状态
UserLoginAuthHandler::Verifytrue
DataSaveStorage::CommitV2false
运行时根据配置加载有效绑定,实现热切换与灰度发布支持。

4.4 实时调试支持与错误恢复机制

在高可用系统中,实时调试与错误恢复是保障服务稳定的核心机制。通过内置的调试接口,开发者可在运行时动态查看状态、注入测试事件。
调试接口设计
提供HTTP端点暴露内部状态,便于远程诊断:
// 调试端点返回运行时信息
func DebugHandler(w http.ResponseWriter, r *http.Request) {
    status := map[string]interface{}{
        "goroutines": runtime.NumGoroutine(),
        "heap_usage": runtime.MemStats{},
    }
    json.NewEncoder(w).Encode(status)
}
该接口返回协程数与内存使用情况,辅助定位阻塞或泄漏问题。
自动恢复策略
采用有限状态机实现错误回退:
  • 检测到异常时进入待恢复状态
  • 执行预设的重连或回滚操作
  • 连续失败超过阈值则进入熔断模式
此机制显著提升系统在瞬态故障中的自愈能力。

第五章:未来架构演进与生态展望

服务网格的深度集成
现代微服务架构正加速向服务网格(Service Mesh)演进。以 Istio 和 Linkerd 为代表的控制平面,已逐步成为云原生基础设施的核心组件。通过将流量管理、安全认证和可观测性从应用层剥离,开发者可专注于业务逻辑。例如,在 Kubernetes 中注入 Envoy Sidecar 代理后,可通过以下配置实现细粒度流量切分:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: user-service-route
spec:
  hosts:
    - user-service
  http:
    - route:
        - destination:
            host: user-service
            subset: v1
          weight: 90
        - destination:
            host: user-service
            subset: v2
          weight: 10
边缘计算驱动的架构下沉
随着 IoT 与 5G 普及,计算正从中心云向边缘节点扩散。KubeEdge 和 OpenYurt 支持将 Kubernetes API 扩展至边缘设备,实现统一编排。某智能制造企业已部署 OpenYurt 架构,在 200+ 工厂边缘节点上运行实时质检模型,延迟降低至 50ms 以内。
Serverless 与事件驱动融合
FaaS 平台如 Knative 和 AWS Lambda 正在与事件总线(如 Apache Kafka、NATS)深度整合。典型应用场景包括文件上传触发图像处理流水线:
  • 用户上传图片至对象存储
  • 事件通知触发 Lambda 函数
  • 函数调用 AI 模型进行内容识别
  • 结果写入数据库并推送至消息队列
该模式显著提升资源利用率,某社交平台采用此架构后,峰值请求处理成本下降 68%。
UE5蓝图与C++高效协作:UBlueprintFunctionLibrary实战指南 本文是UE5蓝图与C++高效协作的实战指南,重点解析UBlueprintFunctionLibrary的核心价值与使用方法。文章通过创建工具库、编写蓝图可调用函数、应用进阶技巧(如纯函数、执行流控制)及实战案例,系统讲解如何架起C++与蓝图间的沟通桥梁,从而提升团队开发效率与代码质量,实现性能与灵活性的最佳平衡。 阅读详情

相关推荐

ue5使用UnrealSharp插件编译c#代码

ue5使用UnrealSharp插件编译c#代码的第一步

AgilityBaby的博客 4338

UE中的热重载

本人使用的UE版本为5.4.4,在该版本中,虚幻提供了两种热重载方法,一种是旧的,另一种是新的。至于两者的区别,虚幻文档中写道,新的Live Coding比原本旧的Hot Reload更加快速和灵活,因为我受不了老是弹出一个窗口,还有关不掉消息提示,所以我使用的是旧版。切记热重载只是实时修补二进制文件,并不是持久性的,只有关掉编辑器重新编译后才是持久性的。关于热重载的正确使用方法,文档中也有提到,结合文档我将使用分为以下几种情况。

vjsopmh 1393

UE5 原生热更新实践笔记

UE5 原生热更新实践笔记

weixin_38377747的博客 3857

UE5 热重载

在UE编辑器中 CTRL+ALT+F11。

LanQ的博客 729

从UE5蓝图到C++:高效项目转换的完整指南

本文为UE5开发者提供了从蓝图项目高效转换到C++项目的完整指南。详细阐述了转换的必要性、关键准备工作、分步操作流程,以及将蓝图逻辑迁移至C++的核心策略与混合编程最佳实践,旨在帮助开发者提升项目性能、可维护性与开发灵活性。

weixin_29007243的博客 540

UE4 C++入门之路5-热重载Compile(编译项目的三种方式)

UE4 C++入门之路5-热重载Compile(编译项目的三种方式) UE4 自动编译 Live Coding

TurboQ珞珈 5128

UE5 热更新方案

C:\UE5.0\UnrealEngine\Engine\Build\BatchFiles\RunUAT.bat 为UE安装路径下脚本文件。在虚幻打包中他只会带入UE的资源文件,而我们要带入的是Json文件,所以需要在这里声明Json文件(基础包的版本文件)所在的路径。C:\Work\AndroidProject\AndroidProject.uproject 为工程路径下可执行程序。执行完成后会在C:\Work\Release\Android_ASTC\下生成apk文件,其就是需要的整包。

dongdong7_77的博客 3923

SGO基线解算软件(南方测绘UI设计最美观的一款新版)

不多说,先放地址: 下载地址:https://www.southgnss.com/download_view.asp?did=361 SGO是南方测绘集团广州南方卫星导航仪器有限公司自主研发新一代南方地理数据处理平台软件,对南方特有数据格式文件(STH格式文件)、标准数据格式文件(RINEX格式文件)进行静态数据处理、动态数据后处理和进行RTK结果检验,新增加了北斗数据处理和摄影测量模块,并围绕南方的不同类型测量产品集成多款测绘领域所需的小工具,实现测绘内业数据处理一体化。 相关概念 G..

heirenqiaoke的博客 1万+

UE4使用HotReload推荐方式

艾孜尔江的博客 1万+

周立功CAN盒二次开发实录:用QT5.1.0解析汽车CAN报文(附数据可视化技巧)

本文详细介绍了基于QT5.1.0和周立功USBCAN-E-U设备进行汽车CAN总线二次开发的实战过程。核心内容包括利用CANdb++数据库解析原始报文并转换为物理值,以及通过QCustomPlot库实现高性能实时数据可视化,为车载诊断与车联网开发提供了一套完整的工程实践方案。

sugar的博客 1057

ColorOS13系统账户锁与密码锁破解全指南:从恢复模式到激活绕过

本文针对ColorOS13系统用户,详细解析了忘记锁屏密码(数字/图案锁)和遭遇OPPO账户锁(激活锁)的合法解决方案。核心是通过官方恢复模式进行格式化操作清除锁屏密码,并强调账户锁需通过密码找回或官方售后等正规途径解除。文章旨在帮助设备合法所有者恢复使用权,并提供了安全操作指南与数据备份建议。

weixin_28304023的博客 962

蓝图转CPP备忘录

不同名的CPP变量,不用加 "_C",因为只有 variables for config 才需要暴露到蓝图, 内部变量和计算变量不需要暴露。3.4 Collapse Nodes 一旦创建,无法在 "My Blueprint Window"中调整顺序,提前创建一大堆,按需改名。5.3 更复杂,有些炫技成分,并且新的override链也会形成一套额外的记忆负担。修改蓝图函数名,保留CPP函数名,会有编译错误来发现所有需要修改的地方。原则:保持蓝图中的蓝图接口,转发给C实现的接口。

踏入神的领域 977

Altium Designer差分走线实战:从规则设置到阻抗匹配的完整流程

本文详细讲解了在Altium Designer中进行差分走线的完整实战流程,涵盖从原理图定义差分对、PCB布局管理、关键设计规则设置,到利用阻抗计算工具确定线宽与间距,以及布线技巧与等长处理等核心步骤。文章旨在帮助工程师掌握高速PCB设计中差分信号传输的关键技术,确保信号完整性并实现精确的阻抗匹配。

weixin_29163857的博客 254

【亲测免费】 HotPatcher:一站式虚幻引擎热更新解决方案

**HotPatcher** 是一款专为虚幻引擎(UE4/UE5)量身打造的热更新管理和资源打包插件。此项目采用 **C++** 为主要编程语言,具备高度灵活性与强大功能性,满足游戏开发中的热更新需求,广泛应用于多个知名游戏项目中。 ## 核心功能 HotPatcher 提供了一套全面的资源管理框架,其核心特性包括: - **热更新管理**: 跟踪原始资源变更,轻松管理版本间的热更。 - **跨...

gitblog_07334的博客 1077

上机笔试题目:取出指定条件二维数组的子数组

取出指定条件二维数组的子数组: 1)传入参数为: 参数一:String[][]sArray2字符串二维数组 参数二:Stringkey字符串 参数三:StringkeyFormat含匹配符的字符串,如下:%0-%1,其中%x含义如为:一维数据列序号为x的值。 keyFormat 可以为 %0-%1-%2,%0-%3-%8-%x...... 例子如下...

91奔跑的蜗牛 635

【知识点总结】电路原理 第一讲

大家好,从今天起,我将开始更新自上大学以来所学到的各种知识,之所以选择更新它们是因为最近我一直在收拾整理自己自上大学以来所收获到的各种知识,看着那厚厚一沓的书本心里不由得犯愁。如果我想找到特定的知识,那岂不是得翻到猴年马月。俗话说得好,下雨天打鞋子,闲着也是闲着,为此我设置一个专栏,将知识点一一分类总结,目的在于更好的整理所学的知识。本人学艺不精,有一些知识点地方可能存在瑕疵,希望各位大佬可以多多指教。以下是本篇文章正文内容虚断:一般通用性运算放大器的正反向输入端之间的电阻非常非常的大。

weixin_51130221的博客 4万+

UE4/5如何将蓝图工程转换为UEc++工程(新手向)

ue4和ue5如果一开始选择了蓝图工程,在后期如何转换为c++工程。这样子,ue引擎就会将c++项目需要的东西加载到你的项目中去。然后,你就能看见你新建的c++类,你可以选择删除,或者继续。然后,我们要如何将蓝图工程,转换为c++工程。里面有简单的在ue创建c++的运用。详情创建可以看作者之前写的。

多方通行8的博客 1万+

Playwright爬虫实战:破解动态网页懒加载与无限滚动

本文介绍了使用Playwright处理懒加载和无限滚动页面的完整解决方案。摘要如下: 问题分析:传统爬虫无法获取JS动态渲染内容,Playwright能模拟真实浏览器行为解决此类问题。 核心原理: 懒加载:资源延迟加载,滚动触发 无限滚动:滚动到底部异步加载新内容 技术方案: 分段滚动页面并等待加载 动态监测页面高度变化 合理设置等待和终止条件 代码实现: 提供图片懒加载和无限滚动列表的完整可运行代码 包含异常处理和性能优化建议 关键优势: 比传统爬虫更可靠 支持复杂交互场景 完善的错误处理机制 该方法已在

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 523

【UE5 C++】C++代码调用蓝图方法或事件

此方法为:先创建C++类MyTest,再以MyTest类为父类创建蓝图;在其他类中,可以通过MyTest调用蓝图对应方法。

boyZhenGui的博客 1804

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

UE5 C++ 蓝图交互调用

【代码】UE5 C++ 蓝图交互调用。

qq_44731395的博客 3711

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

UE5以后实现PAK热更新系统时所需的引擎功能的具体用法和参数的整理。

本文记录了在UE5环境下PAK文件热更新系统的设计与实现过程,重点关注资源加载、卸载和高效管理的技术路径。

guochaer的博客 1415

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

虚幻5入门教程:如何在虚幻5中创建一个C++的Plugin

虚幻官方授权讲师老王将以图文并茂的形式手把手教大家如何从零创建一个C++的Plugin

开发游戏的老王 2104

UE5 C++ 进阶学习 —— 01 - 基础知识

【编辑】-【编辑器偏好设置】【通用】-【源代码】

CandyU2的博客 792

【UE5C++】游戏内按键生成蓝图Actor实例

【代码】【UE5C++】游戏内按键生成蓝图Actor实例。

weixin_48329116的博客 871
上一篇: 从零搭建低代码平台:6步实现JavaScript可视化开发(1024限时公开)
下一篇: 【Go性能优化面试题库】:腾讯阿里历年真题+高效解题思路全公开
FastSolve
博客等级 码龄1年 155粉丝 2011原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值