UE4 Shipping打包开启日志的三种方法:从命令行到源码修改
1. 项目概述为什么Shipping打包默认“沉默是金”做UE4开发的朋友尤其是负责项目最终交付和线上问题排查的肯定都遇到过这个让人头疼的场景在开发阶段LogTemp、UE_LOG打印得飞起一切调试信息尽在掌握。可一旦用Shipping配置打包出来游戏瞬间变成了一个“黑盒”控制台一片空白日志文件里也空空如也。线上玩家报一个“游戏突然卡死”或者“某个功能不生效”你手头只有一个Shipping版本的exe没有PDB符号文件也没有日志排查起来简直是大海捞针。这背后的原因其实是 Epic 为了极致性能和安全而做的主动设计。Shipping配置的全称是“发运配置”它的目标就是为最终用户提供最高性能、最小体积和最安全避免泄露调试信息的游戏版本。因此在编译时大量的调试宏如UE_BUILD_SHIPPING会被定义导致很多调试辅助功能被彻底剥离或禁用其中就包括了我们最熟悉的日志输出系统。引擎源码中日志的核心函数FMsg::Logf等在Shipping下其实现常常被替换为空操作或者被条件编译直接跳过。所以标题中的需求——“UE4 Shipping打包如何开启日志输出”——不是一个简单的开关而是一场针对引擎默认行为的“定向改造”。它不是为了日常开发而是为了特殊的运营、测试或监控场景比如自动化测试需要记录测试用例执行过程中的关键步骤和断言结果。线上问题追踪在玩家客户端部署一个特殊的日志版本当发生崩溃或异常时能收集到关键上下文信息。性能监控在特定场景如大型开放世界加载中输出带时间戳的性能日志用于分析线上真实性能。外包或合作团队测试提供给他们一个能看日志的“类发布”版本便于他们报告明确的问题点。接下来我将结合实测经验详细拆解三种从易到难、适用不同场景的开启日志方法并深入源码层面解释其原理。我会假设你使用的是 UE 4.27 版本但原理通用于 4.24-4.27 等主要版本。2. 三种方法深度解析与选型指南面对 Shipping 无日志的问题我们有三种不同层级的解决思路其侵入性、灵活性和复杂度依次递增。选择哪种取决于你的具体需求、项目阶段以及对引擎源码的掌控程度。2.1 方法一利用命令行参数“唤醒”日志最快捷这是最“非侵入式”的方法不需要修改任何代码仅仅在启动打包后的游戏时通过命令行参数来动态启用日志输出。它的核心原理是引擎内部有一些控制日志输出的全局变量如GLogConsole在初始化时根据配置被设置为nullptr或关闭状态。某些命令行参数可以触发对这些变量的重新初始化或激活。实测有效的命令参数组合-log 这是最基础的参数它会强制引擎初始化日志系统并将日志输出到标准输出StdOut。对于 Windows 平台如果你直接双击exe这个输出你是看不到的。你需要通过命令行CMD 或 PowerShell启动游戏。启动命令示例YourGame.exe -log效果 在命令行窗口中你会看到滚动的日志输出类似于在编辑器中启动游戏时的输出。-stdout 这个参数与-log类似也是确保标准输出被启用。有时两者需要结合使用。启动命令示例YourGame.exe -log -stdout-FullStdOutLogOutput 这个参数更加强力它会尝试绕过一些Shipping配置下的输出限制确保所有日志通道而不仅仅是部分都能输出到标准输出。启动命令示例YourGame.exe -FullStdOutLogOutput-VeryVerbose或-Verbose 这些参数本身是控制日志详细程度的。在Shipping下默认的日志级别可能很高如Fatal,Error。加上-Verbose可以尝试输出Warning,Log,Verbose等更低级别的信息。但请注意如果日志系统本身被禁用光有它是不够的通常需要配合-log使用。启动命令示例YourGame.exe -log -VeryVerbose实操心得与注意事项组合使用 我实测在 UE4.27 的 Shipping 包中单独使用-log有时仍无输出。最稳定的组合是YourGame.exe -log -stdout。如果还不行尝试加上-FullStdOutLogOutput。输出目的地 这种方法主要激活的是控制台输出。如果你需要将日志写入文件仅靠命令行参数是不够的通常需要配合方法二或方法三。平台差异 在 Windows 上你需要通过命令行启动。在 Linux 或 Mac 上你可以直接运行可执行文件并在终端中查看。对于最终分发给玩家的包你不可能要求他们用命令行启动。因此此方法主要用于开发、测试或运维人员的本地调试或服务器环境。局限性 它无法启用那些在编译期就被条件编译完全剔除的日志调用。例如某些UE_LOG如果被#if !UE_BUILD_SHIPPING包裹那么即使日志系统被激活这些日志语句也根本不会存在于二进制文件中。方法一总结快速验证、零成本。当你拿到一个 Shipping 包需要立刻查看一些基础日志时首先尝试此方法。但它是一个“运行时补救”措施功能有限且依赖特定的启动方式。2.2 方法二修改项目构建配置平衡之道如果命令行参数满足不了需求比如你需要稳定的文件日志但又不想动引擎源码那么修改自己项目的构建配置Build.cs是一个不错的折中方案。此方法的原理是影响项目模块的编译定义。Shipping配置会定义UE_BUILD_SHIPPING宏我们可以尝试在项目配置中移除它或者添加其他宏来“欺骗”引擎的部分代码使其表现得更像Development配置。操作步骤找到你的游戏项目主模块的构建文件通常是Source/YourGame/YourGame.Build.cs。在构造函数public YourGame(TargetInfo Target)中修改编译配置。示例代码修改using UnrealBuildTool; public class YourGame : ModuleRules { public YourGame(ReadOnlyTargetRules Target) : base(Target) { PCHUsage PCHUsageMode.UseExplicitOrSharedPCHs; PublicDependencyModuleNames.AddRange(new string[] { Core, CoreUObject, Engine, InputCore }); PrivateDependencyModuleNames.AddRange(new string[] { }); // 关键修改部分针对 Shipping 配置进行特殊处理 if (Target.Configuration UnrealTargetConfiguration.Shipping) { // 移除 Shipping 宏定义谨慎 // Target.Definitions.Remove(UE_BUILD_SHIPPING); // 更安全的方式添加一个我们自己的宏用于有条件地启用日志 Target.Definitions.Add(WITH_SHIPPING_LOG1); // 强制链接日志相关的模块如果发现链接错误 // PrivateDependencyModuleNames.Add(Logging); } } }在你的 C 代码中就可以使用自定义的宏来包裹日志代码// 在你的代码文件中 #if WITH_SHIPPING_LOG UE_LOG(LogTemp, Log, TEXT(这条日志在 Shipping 配置下也会输出)); #endif实操心得与注意事项作用范围 此修改仅对你自己的游戏项目模块生效。引擎模块如Engine,Core的编译定义不受影响。这意味着引擎内部的很多日志依然不会输出但你自定义的、用WITH_SHIPPING_LOG宏保护的日志可以输出。移除UE_BUILD_SHIPPING的风险 直接移除这个宏是非常危险的。因为引擎和第三方库的代码都重度依赖此宏来进行优化和安全检查。移除它可能导致性能下降、意想不到的崩溃甚至安全漏洞。强烈不建议这样做。推荐做法 如示例所示定义自己的宏如WITH_SHIPPING_LOG是更安全、更可控的方式。你完全掌控哪些日志需要在 Shipping 中保留。这需要你提前规划对需要保留的日志手动添加宏判断。文件日志 此方法本身不直接启用文件日志。但如果你自定义的日志能输出到控制台你可以结合启动参数-abslog指定日志文件路径但此参数在纯 Shipping 下可能无效或使用方法三来启用完整的文件日志功能。方法二总结项目级可控、相对安全。适合在项目中期就规划好哪些关键路径需要保留 Shipping 日志。你需要对代码有额外的修饰工作并且无法获取引擎内部的日志。2.3 方法三修改引擎源码终极解决方案当你需要完整、原生的日志功能包括控制台输出、文件日志YourGame/Saved/Logs/YourGame.log以及所有引擎模块的日志时修改引擎源码是唯一彻底的方法。这相当于“降级” Shipping 配置的某些特性使其在日志方面表现得像 Development 配置。核心原理 在Engine/Source/目录下搜索UE_BUILD_SHIPPING宏与日志相关的代码。主要修改点集中在日志初始化、日志输出函数是否被空定义等地方。以下是基于 UE4.27 的源码修改关键点修改点 1确保日志文件被创建LogFile.cpp文件路径Engine/Source/Runtime/Core/Private/GenericPlatform/GenericPlatformFile.cpp附近但更直接的是在Engine/Source/Runtime/Core/Private/Logging/LogFile.cpp的FOutputDeviceFile::CreateLogFile函数或相关逻辑中。你需要找到在Shipping配置下阻止日志文件创建的条件判断。实际上更全局的开关在Engine/Source/Runtime/Core/Public/Logging/LogMacros.h和.../Logging/LogVerbosity.h中。但一个更直接的入口是修改FLogCategoryBase的初始化状态。修改点 2修改默认日志级别和启用状态推荐一个相对干净的方法是修改全局日志类别的默认行为。打开Engine/Source/Runtime/Core/Public/Logging/LogMacros.h。找到DEFINE_LOG_CATEGORY宏或其相关实现。但更好的位置是Engine/Source/Runtime/Core/Private/Logging/LogCategory.cpp。在FLogCategoryBase的构造函数中有根据编译配置设置默认Verbosity和Enabled的代码。我们需要修改Shipping配置下的默认行为。具体修改示例在Engine/Source/Runtime/Core/Private/Logging/LogCategory.cpp中找到FLogCategoryBase::FLogCategoryBase构造函数。你会看到类似下面的代码FLogCategoryBase::FLogCategoryBase(const TCHAR* CategoryName, ELogVerbosity::Type InDefaultVerbosity, ELogVerbosity::Type InCompileTimeVerbosity, CreateLogCategoryDelegate* InRuntimeDelegate) { // ... 其他初始化 ... #if UE_BUILD_SHIPPING // 在Shipping中默认禁用所有非Fatal/Error的日志且编译时最低级别为Error DefaultVerbosity ELogVerbosity::Error; CompileTimeVerbosity InCompileTimeVerbosity ELogVerbosity::Error ? ELogVerbosity::Error : InCompileTimeVerbosity; this-Enabled false; // 默认禁用 #else // ... Debug/Development配置的初始化 ... #endif // ... 后续处理 ... }我们可以将其修改为允许更多日志输出。注意这是一个示范直接修改这里会影响所有日志类别请谨慎评估。一种更精细的做法是只修改你关心的特定日志类别或者提供一个外部开关。修改点 3绕过FMsg::Logf的空实现在某些版本的引擎中Shipping配置下FMsg::Logf函数可能被定义为一个空宏或空函数。你需要找到其定义并修改。在Engine/Source/Runtime/Core/Public/Logging/LogMacros.h中搜索UE_LOG宏的实现。它最终会调用FMsg::Logf。确保在Shipping下这个调用没有被#if !UE_BUILD_SHIPPING之类的条件编译完全屏蔽。实操心得与注意事项源码修改的深水区备份备份备份 修改引擎源码前务必备份原文件或者使用版本管理如 Git创建一个分支。版本差异 不同版本的 UE4如 4.24, 4.26, 4.27源码结构可能有细微差别。上述文件路径和代码片段是 4.27 的你需要根据你的引擎版本进行定位。影响范围 直接修改FLogCategoryBase构造函数会影响所有日志类别包括第三方插件。这可能会输出大量你并不需要的、来自引擎内部的冗余日志略微影响性能。推荐策略 更工程化的做法不是直接修改默认值而是提供一个运行时开关。例如你可以修改引擎使其在检测到特定的命令行参数如-ForceEnableLogging时才将日志系统切换到“启用”状态。这需要更深入的改动可能涉及在引擎初始化早期如FEngineLoop::PreInit解析参数并设置一个全局标志然后用这个标志去影响日志类别的初始化。重新编译引擎 修改源码后你必须使用源码版本的 UE4 引擎并重新编译。在 Epic Games Launcher 中切换为源码版本然后运行GenerateProjectFiles.bat和编译解决方案。这是一个耗时过程。法律与许可 修改引擎源码需遵守 Epic 的 UE4 许可协议。通常这对于内部使用和调试是允许的但如果你要将修改后的引擎分发给第三方需要仔细阅读协议。方法三总结功能完整、效果彻底、改动复杂。适用于需要深度监控、且团队有引擎定制能力的项目。它提供了最接近开发版本的日志体验但代价是维护一个自定义的引擎分支。3. 三种方法实操对比与决策流程图为了更直观地帮助你选择我将三种方法的关键特性总结如下表特性维度方法一命令行参数方法二项目配置方法三引擎源码侵入性无侵入侵入项目代码侵入引擎源码修改成本零成本低需修改 Build.cs 和代码宏高需定位、修改源码并重编引擎维护成本无低随项目代码维护高引擎升级时可能需要合并或重做修改生效范围运行时对当前进程生效编译时仅对自身项目模块生效编译时对整个引擎含所有项目生效日志完整性部分取决于参数和引擎内部实现部分仅限自定义宏包裹的日志完整可恢复近乎 Development 的日志能力输出目标主要是控制台 (StdOut)依赖运行时配置通常也需命令行激活控制台、文件、其他输出设备适用场景临时调试、服务器日志查看项目预定义的、关键路径的日志收集深度调试、长期运营的线上日志收集风险无低若自定义宏中高可能引入不稳定因素升级麻烦决策流程图参考当你需要为 Shipping 包开启日志时可以按此流程思考需求是什么临时看一眼日志- 直接尝试方法一用-log -stdout启动。需要长期、稳定记录项目自身关键逻辑- 采用方法二在代码中定义WITH_SHIPPING_LOG宏来保护关键日志。需要完整的、包括引擎内部的所有日志用于分析难以复现的复杂Bug- 考虑方法三。是否愿意/能够维护引擎分支否- 止步于方法二或尝试在方法二基础上探索通过外部工具如注入 DLL 挂钩日志函数等更高级但非源码修改的手段。是- 深入使用方法三并建议将修改封装成易于开关的补丁如基于特定命令行参数方便管理。4. 进阶技巧实现可开关的 Shipping 日志系统如果你决定采用方法三修改引擎源码我强烈建议不要做“一刀切”的永久开启。一个健壮的方案是使其可配置、可开关。这里分享一个我经过实践验证的相对安全的修改思路目标是默认保持 Shipping 的静默但通过一个特殊的命令行参数来全面启用日志。核心实现步骤定义全局控制标志 在Engine/Source/Runtime/Core/Public/Logging/Logging.h或新建一个头文件中声明一个全局变量或函数用于指示是否强制启用日志。// 例如在 Logging.h 末尾添加 CORE_API extern bool GForceEnableLoggingInShipping;在引擎初始化早期解析参数 在Engine/Source/Runtime/Launch/Private/LaunchEngineLoop.cpp的FEngineLoop::PreInit函数中解析命令行参数。// 在 PreInit 函数的合适位置例如在解析其他参数后 if (FParse::Param(FCommandLine::Get(), TEXT(ForceEnableLogging))) { GForceEnableLoggingInShipping true; UE_LOG(LogInit, Log, TEXT(ForceEnableLogging flag detected. Logging will be enabled in Shipping.)); }修改日志类别初始化逻辑 回到Engine/Source/Runtime/Core/Private/Logging/LogCategory.cpp的FLogCategoryBase构造函数将原来的条件编译修改为考虑我们的全局标志。FLogCategoryBase::FLogCategoryBase(...) { // ... 其他初始化 ... #if UE_BUILD_SHIPPING if (GForceEnableLoggingInShipping) { // 当强制启用标志为真时采用类似 Development 的配置 DefaultVerbosity InDefaultVerbosity; // 使用传入的默认级别 CompileTimeVerbosity InCompileTimeVerbosity; this-Enabled true; // 启用该日志类别 } else { // 否则保持原版 Shipping 的严格限制 DefaultVerbosity ELogVerbosity::Error; CompileTimeVerbosity InCompileTimeVerbosity ELogVerbosity::Error ? ELogVerbosity::Error : InCompileTimeVerbosity; this-Enabled false; } #else // ... 非Shipping配置的原始逻辑 ... #endif // ... 后续处理 ... }确保日志文件输出设备被创建 你可能还需要检查FOutputDeviceFile的创建逻辑在LogFile.cpp中确保当GForceEnableLoggingInShipping为真时即使是在Shipping配置下也会创建日志文件。使用方法编译好自定义引擎后使用YourGame.exe -ForceEnableLogging启动 Shipping 包即可获得完整的日志功能。不加该参数则表现和原生 Shipping 完全一致。这个方案的优点安全 默认行为与官方一致不影响正常分发版本。灵活 在需要调试时通过一个参数即可获得强大日志能力。可脚本化 自动化测试框架可以轻松地带上这个参数启动游戏收集日志。5. 常见问题排查与避坑指南即使按照上述方法操作你可能还是会遇到各种问题。这里记录一些我踩过的坑和解决方案。问题1使用了-log参数但控制台仍然没有任何输出。排查步骤确认启动方式 你是否在命令行CMD/PowerShell中启动直接双击exe是不会显示控制台窗口的。尝试组合参数 单独-log可能不够尝试-log -stdout或-log -FullStdOutLogOutput。检查日志级别 你的日志调用可能是Verbose或VeryVerbose级别。尝试在启动参数中加入-VeryVerbose。检查引擎版本 极少数情况下某些引擎版本的Shipping配置可能完全移除了标准输出的后端。此时方法一可能无效必须使用方法三。验证日志语句是否存在 确认你试图输出的日志语句如UE_LOG(LogTemp, Log, TEXT(...))没有被#if !UE_BUILD_SHIPPING包裹。如果被包裹了它在 Shipping 包里根本不存在。问题2成功输出了控制台日志但Saved/Logs目录下没有生成日志文件。原因与解决 这是Shipping配置的默认行为。控制台输出和文件输出是两套不同的FOutputDevice输出设备。Shipping配置通常禁用了FOutputDeviceFile的自动创建。方法一延伸 尝试使用-abslogC:\Path\To\YourGame.log参数指定绝对路径的日志文件。但请注意这个参数在纯Shipping下也可能被忽略。终极方案 只有通过方法三修改源码才能稳定地重新启用文件日志输出。你需要确保在日志系统初始化时创建并注册了文件输出设备。问题3修改引擎源码后重新编译编译失败报错“未解析的外部符号”等链接错误。排查步骤清理并重生成 运行GenerateProjectFiles.bat重新生成解决方案文件然后彻底清理Clean解决方案后再编译。检查修改的全局变量 如果你像进阶技巧中那样声明了GForceEnableLoggingInShipping这个extern变量必须在某个.cpp文件如LogCategory.cpp中对其进行定义bool GForceEnableLoggingInShipping false;。否则会导致链接错误。检查头文件包含 确保你修改的.cpp文件包含了声明该全局变量的头文件。依赖关系 确保你修改的模块依赖关系正确。例如在Launch模块中引用了Core模块的变量这通常是允许的但要注意初始化顺序。问题4为线上版本开启日志如何平衡性能和信息安全性能 日志输出尤其是频繁的Verbose日志和文件 I/O肯定有性能开销。在线上版本中必须严格控制。使用编译时过滤 像方法二那样用自定义宏如WITH_SHIPPING_LOG严格控制哪些日志会被编译进去。使用运行时级别控制 即使日志被编译进去也可以通过LogTemp.SetVerbosity(ELogVerbosity::Warning)等方式动态调高输出级别减少运行时开销。使用异步日志 考虑实现或使用异步日志库将日志写入操作放入后台线程减少对主线程的阻塞。信息安全Shipping禁日志的另一个目的是防止泄露敏感信息如路径、内部变量值。避免记录敏感数据 确保在 Shipping 中输出的日志不包含玩家密码、密钥、服务器内部地址等。日志脱敏 对可能包含敏感信息的日志内容进行脱敏处理例如只记录错误类型和代码位置不记录具体的数据内容。问题5如何在崩溃时自动保存最后的日志这是一个非常有用的高级技巧。即使有日志如果游戏崩溃最后的几条关键日志可能还在缓冲区没来得及写入文件。方案 可以设置一个崩溃处理函数使用FPlatformMisc::SetCrashHandler在崩溃回调中手动刷新Flush日志输出设备的缓冲区。这需要你持有日志文件输出设备的指针并在崩溃时调用其Flush()方法。这通常需要对引擎的崩溃处理机制有更深的理解和定制。最后我想强调的是为Shipping开启日志是一项“非常规”操作它背离了该配置的设计初衷。因此在决定实施前务必明确你的目的。如果只是为了临时调试方法一足矣。如果需要长期的、可控的日志收集方法二是更工程化的选择。只有当问题极其复杂必须深入引擎内部时才值得付出方法三的成本。无论选择哪种都要时刻考虑其对性能、安全性和维护性的影响。

相关新闻

STM32硬件设计全解析:从芯片选型到PCB抗干扰实战指南

STM32硬件设计全解析:从芯片选型到PCB抗干扰实战指南

1. 从零开始:为什么STM32是嵌入式开发的“硬通货”?如果你刚接触单片机,或者从51、AVR这类8位机转过来,第一次看到STM32的芯片手册和开发板,可能会有点懵。密密麻麻的引脚、动辄几十页的参考手册、还有HAL库、标准库、…

2026/8/4 5:27:12 阅读更多 →
小说配音软件推荐,2026年小说配音工作流,5款选型指南

小说配音软件推荐,2026年小说配音工作流,5款选型指南

小说配音软件推荐到底难在哪做小说推文、有声书、短剧口播的人,基本都绕不开一个问题:配音成本太高,人工录一条动辄几十上百,批量更是不现实。于是「小说配音软件推荐」成了搜索框里的高频问句,大家都在找能自动分角色…

2026/8/4 5:26:12 阅读更多 →
PHP 8.4性能优化与类型系统增强详解

PHP 8.4性能优化与类型系统增强详解

1. PHP 8.4的版本定位与核心价值PHP 8.4作为PHP语言的最新主要版本,延续了近年来PHP核心团队对性能优化和现代编程范式的持续投入。这个版本并非简单的功能堆砌,而是针对实际开发痛点进行的系统性改进。从JIT编译器优化到更严格的类型系统,再…

2026/8/4 5:26:12 阅读更多 →

最新新闻

Auto-tuning

Auto-tuning

Auto-tuning(自动调优 / 自动自动性能优化) 是现代 AI 编译系统(如 TVM、Triton、Ansor、Halide、XLA 等)和高性能计算(HPC)中的核心技术。 它的主要目标是:针对特定的硬件架构(如 G…

2026/8/4 6:15:30 阅读更多 →
济南商场广告物料制作安装全解析:从设计到落地的实战指南

济南商场广告物料制作安装全解析:从设计到落地的实战指南

商场广告物料的隐形战场走进任何一家济南商场,首先映入眼帘的往往是琳琅满目的广告物料。这些看似简单的展架、灯箱、导视牌,其实是商场营销中不可或缺的利器。记得有次在泉城路某商场,看到一个创意十足的立体广告牌,不仅吸引了顾…

2026/8/4 6:15:30 阅读更多 →
智能体从模拟到现实的挑战与工程实践:构建稳健AI系统的核心技术

智能体从模拟到现实的挑战与工程实践:构建稳健AI系统的核心技术

1. 项目概述:当智能体开始“学步”“Agent 跌跌撞撞进入世界”这个标题,精准地捕捉了当前人工智能领域一个既令人兴奋又充满挑战的核心议题:智能体(Agent)如何从封闭的、受控的模拟环境,走向开放、复杂且充…

2026/8/4 6:15:30 阅读更多 →
AI 芯片 ISA

AI 芯片 ISA

AI 芯片(又称 AI 加速器、NPU、TPU 等)的指令集架构(Instruction Set Architecture, ISA)与传统通用 CPU(如 x86、ARM)或 GPU 的指令集存在本质区别。 传统 CPU 针对复杂的标量分支逻辑设计,GPU…

2026/8/4 6:15:30 阅读更多 →
FFmpeg视频编辑核心能力与实战技巧详解

FFmpeg视频编辑核心能力与实战技巧详解

1. FFmpeg视频编辑核心能力解析FFmpeg作为开源音视频处理工具链中的瑞士军刀,其命令行工具在视频编辑领域有着不可替代的地位。不同于专业非线性编辑软件的图形界面操作,FFmpeg通过命令行参数实现高效精准的媒体处理,特别适合自动化处理、批量…

2026/8/4 6:15:30 阅读更多 →
UE4性能优化:深入解析GUObjectAllocator与GC策略解决间歇性卡顿

UE4性能优化:深入解析GUObjectAllocator与GC策略解决间歇性卡顿

1. 项目概述:从一次卡顿排查说起最近在为一个UE4 4.26版本的项目做性能优化,团队反馈在长时间运行后,尤其是在打开大型关卡或频繁切换场景时,会出现明显的间歇性卡顿,帧时间图上能看到周期性的“毛刺”。这种卡顿不像G…

2026/8/4 6:14:30 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →