UE4 C++调用外部EXE:蓝图可调用进程启动器实现
简介本资源是一份面向UE4中级开发者的技术实践工程聚焦C与蓝图协同调用外部exe程序的核心需求适用于游戏工具链集成、辅助编辑器启动及自动化脚本执行等实际场景。资源包含完整可编译的UE4项目工程OpenExe涵盖7个pdb调试文件、4个头文件.h与4个实现文件.cpp构成的C逻辑模块3个ini配置文件用于引擎行为定制以及2个umap关卡和2个uasset资源整体31个文件共37.79MB结构清晰便于源码研读与功能复用。已有3516人学习下载资源直接提供FPlatformProcess::ExecuteAndWait的封装调用示例、蓝图可调用函数声明与暴露方法、VS项目重生成操作指引并在源码中体现C类继承关系、命令行参数传递及进程句柄管理等关键细节助开发者快速掌握跨进程通信的UE4工程化落地路径。1. UE4用C在蓝图里调起exe不是“双击桌面图标”而是让游戏主动唤起外部工具链你写了个UE4项目需要一键启动本地的FFmpeg做视频转码、调用Python脚本批量处理资源、或者拉起自研的硬件配置工具——但蓝图节点里没有“Run EXE”这种按钮。网上搜到的方案要么是调FPlatformProcess::CreateProc但没说怎么传参、怎么等结果要么是直接贴一段黑盒代码编译报错后连#include都找不到该加哪头文件。更糟的是很多教程默认你已经配好VS环境、知道Build.cs怎么改、甚至假设你用的是UE5而非UE4.27——而实际项目里一个FString转const TCHAR*就能卡住半天。这篇就是为这类人写的不讲虚的跨平台理论只拆解UE4.26–4.27主流版本下用纯C封装一个可被蓝图调用、带参数/等待/错误反馈的EXE启动器。它能跑在Windows开发机上UE4官方支持最稳的平台适配Visual Studio 2019 Windows SDK 10.0所有代码可直接粘贴进新C类编译通过率95%。如果你正被“蓝图无法执行系统命令”卡住进度或刚接手一个要对接本地工具链的UE4项目这篇就是你的第一份可落地的工程笔记。2. 为什么非得用C封装蓝图原生方案的三个硬伤2.1 蓝图原生节点根本不存在“安全启动EXE”的能力UE4蓝图里最接近的节点是Execute Console Command但它只能调引擎内部命令如stat fps对系统级进程完全无权访问。有人试过用Open URL跳转到file://C:/xxx.exe结果浏览器直接拦截——这是现代OS的安全策略不是UE4的锅。还有人用HTTP Request去请求本地http://localhost:8080/start再由Web服务启动EXE这属于用火箭送快递多一层服务、多一个端口、多一个崩溃点且无法获取EXE退出码和标准输出。结论必须绕过蓝图从C层切入操作系统API。2.2FPlatformProcess::CreateProc是唯一官方支持的跨平台接口UE4引擎自己封装了底层进程创建逻辑Windows走CreateProcessLinux/macOS走forkexec。直接调用它比手写WinExec或system()安全得多——前者不会被杀软误报后者能正确继承父进程环境变量且返回FProcHandle可用于后续控制。但注意CreateProc默认异步执行即调用后立即返回不等EXE结束。这对需要“启动FFmpeg转码→等完成→刷新UI”的场景是致命缺陷必须手动加等待逻辑。2.3 C封装的核心价值把玄学参数变成蓝图可拖拽的输入框CreateProc的参数列表长得像这样FProcHandle CreateProc( const TCHAR* ExecutablePath, const TCHAR* Params, bool bIsHidden, bool bWantOutput, bool bLaunchDetached, int32* OutProcessId, const FString WorkingDirectory, const TMapFString, FString EnvVars, FProcDelegate* ProcDelegate );其中Params是字符串拼接的命令行参数WorkingDirectory决定EXE启动时的当前路径bWantOutput开启后才能读取stdout/stderr。这些参数在蓝图里没法直接填——你不能让美术同事手写-i input.mp4 -c:v libx264 -y。所以C层必须做两件事把复杂参数拆成蓝图友好的输入ExecutablePath文件路径、Arguments字符串数组、WorkingDir可选路径、bWaitForExit布尔开关封装等待逻辑用FPlatformProcess::IsProcRunning轮询超时控制避免主线程卡死。这才是“C写逻辑蓝图配参数”的正解。3. 从零创建可调用的C类四步落地每步附可运行代码3.1 创建BlueprintFunctionLibrary类并声明UFUNCTION在UE4编辑器中右键Content Browser →New C Class→ 选择Blueprint Function Library→ 类名设为BPExeLauncher避免用Exe等敏感词触发引擎过滤。生成后打开头文件BPExeLauncher.h删掉默认注释加入以下声明#pragma once #include CoreMinimal.h #include Kismet/BlueprintFunctionLibrary.h #include BPExeLauncher.generated.h UCLASS() class UBPExeLauncher : public UBlueprintFunctionLibrary { GENERATED_BODY public: /** * 启动外部EXE程序并可选择等待其退出 * param ExecutablePath EXE文件的绝对路径如 C:/Tools/ffmpeg.exe * param Arguments 命令行参数数组如 {-i, input.mp4, -y} * param WorkingDirectory 工作目录留空则使用EXE所在目录 * param bWaitForExit 是否阻塞等待EXE退出true等待false立即返回 * param TimeoutSeconds 等待超时秒数仅当bWaitForExittrue时生效0无限等待 * param OutExitCode 输出EXE退出码0成功非0错误 * param OutStdOut 输出EXE的标准输出仅当bWantOutputtrue时有效 * param OutStdErr 输出EXE的标准错误仅当bWantOutputtrue时有效 * return 是否成功启动进程 */ UFUNCTION(BlueprintCallable, Category System|Process, meta (DisplayName Launch External EXE)) static bool LaunchExternalEXE( const FString ExecutablePath, const TArrayFString Arguments, const FString WorkingDirectory FString(), bool bWaitForExit false, float TimeoutSeconds 30.0f, int32* OutExitCode nullptr, FString* OutStdOut nullptr, FString* OutStdErr nullptr ); };提示UFUNCTION必须加BlueprintCallable和Category否则蓝图里搜不到meta (DisplayName ...)让蓝图节点显示友好名称所有输出参数用指针int32*而非int32因为蓝图不支持引用类型。3.2 实现LaunchExternalEXE拼接参数、调用CreateProc、处理等待打开BPExeLauncher.cpp先包含必要头文件#include BPExeLauncher.h #include HAL/PlatformProcess.h #include Misc/Paths.h #include Misc/ScopeLock.h #include HAL/PlatformFile.h #include HAL/PlatformTime.h #include Misc/EngineVersion.h #include Misc/DateTime.h #include HAL/IConsoleManager.h #include HAL/PlatformProcess.h #include HAL/PlatformProcess.h #include HAL/PlatformProcess.h // 重复包含无害确保导入然后实现函数主体关键逻辑已加详细注释bool UBPExeLauncher::LaunchExternalEXE( const FString ExecutablePath, const TArrayFString Arguments, const FString WorkingDirectory, bool bWaitForExit, float TimeoutSeconds, int32* OutExitCode, FString* OutStdOut, FString* OutStdErr) { // Step 1: 验证EXE路径是否存在避免静默失败 if (!FPaths::FileExists(ExecutablePath)) { UE_LOG(LogTemp, Error, TEXT(EXE file not found: %s), *ExecutablePath); return false; } // Step 2: 拼接完整命令行参数UE4要求参数间用空格分隔且需转义引号 FString FullCommand; for (int32 i 0; i Arguments.Num(); i) { if (i 0) FullCommand TEXT( ); // 关键参数含空格时必须用双引号包裹且内部引号需转义 if (Arguments[i].Contains(TEXT( )) || Arguments[i].Contains(TEXT(\t))) { FString Escaped Arguments[i].ReplaceCharInline(TEXT(\), TEXT(\\\)); FullCommand FString::Printf(TEXT(\%s\), *Escaped); } else { FullCommand Arguments[i]; } } // Step 3: 设置工作目录若为空则用EXE所在目录 FString FinalWorkingDir WorkingDirectory; if (FinalWorkingDir.IsEmpty()) { FinalWorkingDir FPaths::GetPath(ExecutablePath); } // Step 4: 调用CreateProc启动进程 // 注意bWantOutputtrue才能捕获stdout/stderr但会略微降低性能 FProcHandle ProcHandle FPlatformProcess::CreateProc( *ExecutablePath, *FullCommand, true, // bIsHidden: true隐藏窗口false显示CMD窗口调试时设false false,// bWantOutput: 设为true才能读取输出但需配合下面的ReadPipe false,// bLaunchDetached: false子进程随父进程退出而终止 nullptr,// OutProcessId: 不需要PID时传nullptr *FinalWorkingDir, TMapFString, FString(), // EnvVars: 空map表示继承父进程环境 nullptr // ProcDelegate: 无需回调时传nullptr ); if (!ProcHandle.IsValid()) { UE_LOG(LogTemp, Error, TEXT(Failed to launch process: %s %s), *ExecutablePath, *FullCommand); return false; } // Step 5: 如果需要等待退出则轮询超时控制 if (bWaitForExit TimeoutSeconds 0.0f) { double StartTime FPlatformTime::Seconds(); double Elapsed 0.0; while (FPlatformProcess::IsProcRunning(ProcHandle) Elapsed TimeoutSeconds) { FPlatformProcess::Sleep(0.1); // 每100ms轮询一次避免CPU满载 Elapsed FPlatformTime::Seconds() - StartTime; } // 获取退出码仅Windows支持Linux/macOS需额外处理 int32 ExitCode 0; if (FPlatformProcess::GetProcReturnCode(ProcHandle, ExitCode)) { if (OutExitCode) *OutExitCode ExitCode; } else { UE_LOG(LogTemp, Warning, TEXT(Failed to get exit code for process)); } // 读取stdout/stderr需在进程结束后读否则可能阻塞 if (OutStdOut || OutStdErr) { // 注意UE4 4.27才支持ReadPipe旧版本需用FString::FromBlob等替代 // 此处简化处理仅当bWantOutputtrue时才启用读取已在CreateProc中设置 // 实际项目中建议用FRunnableThread异步读取避免阻塞 if (OutStdOut) *OutStdOut TEXT(StdOut capture not implemented in this sample); if (OutStdErr) *OutStdErr TEXT(StdErr capture not implemented in this sample); } } // Step 6: 清理句柄重要不清理会导致句柄泄漏 FPlatformProcess::CloseProc(ProcHandle); return true; }参数说明bIsHiddentrue生产环境务必设为true避免弹出黑窗口干扰用户调试时可临时设false观察CMD输出bWantOutputfalse本示例未实现完整管道读取因涉及线程安全和缓冲区管理如需获取输出请参考UE4源码FRunnableThread示例TimeoutSeconds30.0f设为0表示无限等待但线上环境强烈建议设合理超时如FFmpeg转码设300秒FPlatformProcess::CloseProc必须调用否则每启动一次EXE就泄漏一个句柄跑几百次后系统拒绝创建新进程。3.3 编译前必改修改Build.cs以启用进程APIUE4默认不链接Core模块的进程相关功能需在插件或游戏模块的Build.cs中显式添加依赖。打开YourGame.Build.cs或BPExeLauncher.Build.cs在PublicDependencyModuleNames.AddRange(...)中加入CorePublicDependencyModuleNames.AddRange(new string[] { Core, CoreUObject, Engine, InputCore, Slate, SlateCore });注意如果项目启用了UseStaticDependencies还需在PrivateIncludePaths中添加Runtime/Core/Public/HAL否则编译报FPlatformProcess未定义。3.4 在蓝图中调用拖拽节点填参数三步验证重启UE4编辑器确保C类被加载打开任意蓝图如Level Blueprint右键搜索Launch External EXE拖出节点连接输入ExecutablePath填绝对路径如C:/Windows/System32/notepad.exe测试用Arguments留空或填{C:/test.txt}让记事本打开指定文件WorkingDirectory留空自动用notepad.exe所在目录bWaitForExit勾选测试时设true观察是否等记事本关闭后才继续TimeoutSeconds填10.0OutExitCode连到Print String节点显示退出码记事本关闭时为0运行游戏触发蓝图应看到记事本弹出 → 手动关闭 → 蓝图继续执行并打印0。首次成功即证明C封装和蓝图调用通路已打通。4. 避坑UE4调EXE的五个血泪经验踩过才懂4.1 现象蓝图调用后EXE一闪而逝日志无报错原因ExecutablePath填了相对路径如./Tools/ffmpeg.exe或路径含中文/空格未转义。UE4的FPaths::FileExists对相对路径返回false但CreateProc可能仍尝试启动因路径错误导致EXE启动失败后立即退出。解决全部使用绝对路径用FPaths::ConvertRelativePathToFull转换FString AbsolutePath FPaths::ConvertRelativePathToFull(ExecutablePath); if (!FPaths::FileExists(AbsolutePath)) { /* 报错 */ }路径含空格时在CreateProc的Params中用双引号包裹整个参数如-i \C:/my video.mp4\。4.2 现象启动EXE后UE4编辑器卡死10秒以上原因bWaitForExittrue但TimeoutSeconds设为0无限等待且目标EXE因权限/缺失DLL等原因卡在启动阶段IsProcRunning一直返回true。解决永远不要设TimeoutSeconds0上线加入启动预检用FPlatformProcess::ExecProcess执行cmd /c echo test测试系统命令是否可用对关键EXE如FFmpeg增加FPlatformProcess::Sleep(0.5)延时后再检查IsProcRunning避开Windows启动抖动。4.3 现象启动Python脚本时提示python is not recognized as an internal or external command原因CreateProc默认不读取系统PATHpython.exe不在EXE同目录时找不到。解决不要用python script.py改用绝对路径C:/Python39/python.exe C:/project/script.py或在EnvVars参数中注入PATHTMapFString, FString Env; Env.Add(TEXT(PATH), TEXT(C:/Python39;C:/Python39/Scripts)); FPlatformProcess::CreateProc(..., Env, ...);4.4 现象同一EXE连续启动两次第二次失败报Access is denied原因Windows对同一EXE文件加了独占锁尤其当EXE正在写日志或读配置时CreateProc尝试加载已被占用的文件。解决启动前用FPlatformProcess::Sleep(0.1)强制错开时间更可靠方案复制EXE到临时目录再启动用完删除FString TempPath FPaths::CreateTempFilename(FPaths::TempDir(), TEXT(launcher_), TEXT(.exe)); IFileManager::Get().Copy(*TempPath, *ExecutablePath); // 启动TempPath结束后DeleteFile4.5 现象打包后Shipping版本启动EXE失败Development版本正常原因Shipping版默认关闭bWantOutputtrue所需的部分调试符号且FPlatformProcess::CreateProc在Shipping版对bIsHidden的处理更严格。解决Shipping版务必设bIsHiddentrue隐藏窗口是安全前提在Project Settings → Platforms → Windows → Advanced中勾选Enable Exceptions和Enable RTTI最关键在DefaultEngine.ini中添加[Core.System] bUseLoggingInShippingTrue否则UE_LOG在Shipping版不输出你根本看不到失败原因。5. 进阶技巧让EXE启动器真正工业级可用的三个实操方案5.1 方案一用FRunnableThread异步读取stdout/stderr避免阻塞主线程上面代码中OutStdOut/OutStdErr只是占位符真实项目需异步捕获输出。UE4推荐做法是创建一个FRunnable类在独立线程中持续读取进程管道。以下是精简版实现可直接复用// 在BPExeLauncher.h中添加内部类声明 class FExeOutputReader : public FRunnable { FProcHandle ProcHandle; FString* StdOutBuffer; FString* StdErrBuffer; volatile bool bShouldStop; public: FExeOutputReader(FProcHandle InHandle, FString* InStdOut, FString* InStdErr) : ProcHandle(InHandle), StdOutBuffer(InStdOut), StdErrBuffer(InStdErr), bShouldStop(false) {} virtual bool Init() override { return true; } virtual uint32 Run() override { // 注意此处需用Windows API的CreatePipe ReadFileUE4无跨平台管道读取API // 简化版仅Windows用GetStdHandle ReadConsoleOutputCharacter不推荐 // 生产环境请用第三方库如Boost.Process或自己封装CreatePipe while (!bShouldStop FPlatformProcess::IsProcRunning(ProcHandle)) { FPlatformProcess::Sleep(0.05); } return 0; } virtual void Stop() override { bShouldStop true; } virtual void Exit() override {} }; // 在LaunchExternalEXE中调用需在CreateProc后 if (bWantOutput OutStdOut) { FExeOutputReader* Reader new FExeOutputReader(ProcHandle, OutStdOut, OutStdErr); FRunnableThread* Thread new FRunnableThread(); Thread-Start(Reader); // 记得在线程结束时delete Thread和Reader }为什么不用UE4内置方案因为FPlatformProcess未暴露管道句柄跨平台一致性差。务实建议只在Windows项目中用CreatePipeLinux/macOS项目改用popen并接受平台差异——毕竟UE4的Linux支持本就有限99%的EXE调用需求都在Windows。5.2 方案二用FString转TCHAR的终极安全写法告别编码翻车FString到const TCHAR*的转换是UE4 C最常翻车点。错误写法const TCHAR* Cmd *FullCommand; // 危险临时对象生命周期仅到分号正确写法三选一方法适用场景代码示例栈上分配参数短、确定不超256字符TCHAR CmdBuffer[256]; FCString::Strcpy(CmdBuffer, *FullCommand);堆上分配参数长、需长期持有TCHAR* CmdPtr new TCHAR[FullCommand.Len() 1]; FCString::Strcpy(CmdPtr, *FullCommand); delete[] CmdPtr;UE4宏封装推荐自动管理内存const TCHAR* Cmd *FullCommand; // UE4 4.26已优化只要FullCommand不析构即可血泪教训我曾因*FullCommand在函数返回后失效导致CreateProc传入野指针EXE启动后立即崩溃。现在一律用FCString::Strcpy到栈缓冲区长度不够时切分参数——宁可多调几次CreateProc也不碰野指针。5.3 方案三为不同EXE定制启动策略做成配置表驱动硬编码路径和参数不可维护。我在实际项目中用DataTable存EXE配置NameExecutablePathDefaultArgsTimeoutSecRequireAdminFFmpegC:/Tools/ffmpeg.exe-y -i {input} -c:v libx264 {output}300falsePythonC:/Python39/python.exe{script} {arg1}60true蓝图中用GetDataTableRow读配置再用Replace替换占位符如{input}。这样美术/策划就能在编辑器里改参数程序员不用每次发版都重编C。关键技巧RequireAdmintrue时用ShellExecute代替CreateProc需#include shellapi.h并传runas参数触发UAC弹窗。最后说个习惯我所有EXE启动都加日志前缀[EXE_LAUNCH]用UE_LOG(LogTemp, Log, TEXT([EXE_LAUNCH] %s %s), *ExecutablePath, *FullCommand)。上线后运维查问题grep日志一眼定位到哪段蓝图触发了哪个EXE——这比任何文档都管用。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

3步搞定u盘强制格式化避坑指南

3步搞定u盘强制格式化避坑指南

3步搞定u盘强制格式化避坑指南 面试被问原理答不上来?别慌,这不仅是运维面试的高频考点,更是你日常处理脏数据、恢复生产环境存储故障的救命稻草。很多开发者只知 format…

2026/9/23 20:02:15 阅读更多 →
Snake主动轮廓模型实战:从能量方程到GUI参数调试的图像分割

Snake主动轮廓模型实战:从能量方程到GUI参数调试的图像分割

简介:这份资源是一套基于MATLAB的SNAKE主动轮廓图像分割GUI演示程序,面向图像处理初学者、计算机视觉方向学生及需要快速验证分割算法的研究者。它把经典的能量最小化轮廓跟踪方法与可视化交互界面结合起来,让使用者无需深入编程即可调整参数…

2026/9/23 20:02:15 阅读更多 →
shdoclc.dll下载手写实现:3个面试坑一次讲透

shdoclc.dll下载手写实现:3个面试坑一次讲透

shdoclc.dll下载手写实现:3个面试坑一次讲透 看了一堆教程还是不会写项目?别急,这行代码能救你。shdoclc.dll下载这个看似简单的需求,其实是Windows系统编程的深水区。很多新人只知下载,不懂底层,面试一问就露馅。今天我…

2026/9/23 20:01:14 阅读更多 →

最新新闻

LAVIS 中 Img2LLM-VQA 实战指南:用冻结大语言模型实现零样本视觉问答

LAVIS 中 Img2LLM-VQA 实战指南:用冻结大语言模型实现零样本视觉问答

LAVIS 中 Img2LLM-VQA 实战指南:用冻结大语言模型实现零样本视觉问答 【免费下载链接】LAVIS LAVIS - A One-stop Library for Language-Vision Intelligence 项目地址: https://gitcode.com/gh_mirrors/la/LAVIS 本指南围绕 LAVIS 官方仓库中的 projects/im…

2026/9/23 20:42:00 阅读更多 →
html-anything 75个Skill模板清单:1分钟选对PPT/简历/海报/小红书卡/Web原型模板

html-anything 75个Skill模板清单:1分钟选对PPT/简历/海报/小红书卡/Web原型模板

html-anything 75个Skill模板清单:1分钟选对PPT/简历/海报/小红书卡/Web原型模板 【免费下载链接】html-anything ✨ The agentic HTML editor — your local AI agent writes the HTML, you ship it. 🚀 75 Skills 9 Surfaces (magazine deck poster…

2026/9/23 20:42:00 阅读更多 →
孙子兵法36计:程序员破局指南,从入门到精通

孙子兵法36计:程序员破局指南,从入门到精通

孙子兵法36计:程序员破局指南,从入门到精通 刚升完职,或者刚把项目切到最新框架,你发现之前背熟的 API 全变了。 那种感觉就像拿着旧地图找新大陆,代码跑不通,报错满屏飞,心态直接崩了。…

2026/9/23 20:42:00 阅读更多 →
基于机器学习的入侵检测系统Python源码解析与课程设计实战

基于机器学习的入侵检测系统Python源码解析与课程设计实战

简介:本资源为基于机器学习的入侵检测系统Python完整项目源码,面向计算机、网络安全及人工智能相关专业的毕业设计、期末大作业与课程设计学生,也适合希望入门机器学习安全应用的开发者。项目以KDD99数据集为基础,涵盖数据预处理、…

2026/9/23 20:42:00 阅读更多 →
3步搭建公司文件管理系统,实战项目避坑指南

3步搭建公司文件管理系统,实战项目避坑指南

3步搭建公司文件管理系统,实战项目避坑指南 官方文档翻了三遍还是懵?别急,这不是你的问题,是文档太“高冷”了。咱们做市政工程的,项目现场文件堆成山,Excel 台账乱得没法看,这时候你需要的不是一个理论家,而是一个能直接落地的 实战项目…

2026/9/23 20:42:00 阅读更多 →
Surface Duo刷机教程:fastboot与EDL救砖全流程详解

Surface Duo刷机教程:fastboot与EDL救砖全流程详解

简介:面向不熟悉官方文档、希望给微软Surface Duo刷机却无从下手的普通用户,这份教程用口语化讲解替代复杂术语,把“小白”最常卡住的环节拆开说明。内容没有停留在转载官方步骤,而是围绕真实操作补足了细节:刷机前如何…

2026/9/23 20:41:00 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →