游戏开发【免费下载链接】DevilutionXDiablo build for modern operating systems项目地址https://gitcode.com/gh_mirrors/de/DevilutionX点击查看免费下载本文以 DevilutionX 官方 RG99 移植流程为核心讲解如何在资源极其有限的 RG99RS90掌机上完成基于真实游戏运行的 Profile-Guided OptimizationPGO构建从两阶段编译、Timedemo 数据采集到用采集到的 Profile 产出最终 OPK并额外覆盖 demo 崩溃时基于 gdbserver VS Code 的远程调试方案。读完本文你将掌握一套可在 RG99 上复现的完整 PGO 构建流程并理解其背后的构建脚本与编译器标志实现原理。RG99 构建为何必须使用 PGORG99内部代号 RS90对应 OpenDingux 的od_rs90_defconfig配置是一台 MIPS 架构mipsel的低端掌机内存极小、存储与交换swapping开销巨大。官方文档 rg99-pgo.md 的开篇即给出硬性结论The RG99 build must be PGOd for reasonable performance.即RG99 构建必须经过 PGO 才能获得可接受的性能。原因在于 PGO 会让编译器基于真实游戏运行轨迹收集到的分支执行频率、函数调用热度等数据重新进行内联、分支布局与代码重排优化从而在无缓存、慢内存设备上显著减少指令开销。而 RG99 恰恰是无法承受未经优化二进制的平台。该流程并非一次性手工操作而是被完整固化在仓库的构建脚本体系中入口为 Packaging/OpenDingux/build.sh其用法签名如下Usage: build.sh [--profile-generate|--profile-use] [--profile-dir PATH] [target]其中--profile-generate与--profile-use互斥同时传入会报错退出--profile-dir指定 Profile 数据存放目录。目标平台通过 Packaging/OpenDingux/targets.sh 校验合法值为lepus、retrofw、rg99、rg350、gkd350h。环境准备工具链与 MPQ 工具在开始之前需要准备两样东西devilutionx-mpq-tools用于生成、校验 MPQ 存档的辅助工具集原文档要求安装该工具它是打包与存档解包环节的依赖。RG99 交叉编译工具链以/opt/rs90-toolchain为前缀其中包含 mipsel 目标编译器与mipsel-linux-gdb调试器。若本机尚未存在该目录build.sh 会自动克隆 OpenDingux buildroot 到~/devilutionx-buildroots/rg99并构建 toolchain 与 SDLmake toolchain sdl见 build.sh最终TOOLCHAIN指向${BUILDROOT}/output/host。工具链就绪后所有构建产物统一输出到build-rg99/目录BUILD_DIRbuild-${TARGET}。第一阶段构建 Profile 采集用 OPK执行以下命令生成一个专门用于收集运行数据的 OPKTOOLCHAIN/opt/rs90-toolchain Packaging/OpenDingux/build.sh rg99 --profile-generate这一阶段发生了什么从 build.sh 可以看到--profile-generate会向 CMake 追加两个关键配置-DDEVILUTIONX_PROFILE_GENERATEON -DDEVILUTIONX_PROFILE_DIR${PROFILE_DIR}其中PROFILE_DIR的默认值为%q{HOME}/devilutionx-profilebuild.sh%q{HOME}是 GCC 对$HOME环境变量的特殊展开语法——在 RG99 上即/media/data/local/home/devilutionx-profile。在根 CMakeLists.txt 中定义了同名选项option(DEVILUTIONX_PROFILE_GENERATE Build a binary that generates the profile for PGO OFF) option(DEVILUTIONX_PROFILE_USE Build with PGO using the given profile file OFF) set(DEVILUTIONX_PROFILE_DIR CACHE STRING Directory where the profile is stored)当 GCC/Clang 编译时CMakeLists.txt 会注入 PGO 相关编译与链接标志add_compile_options($$BOOL:${DEVILUTIONX_PROFILE_GENERATE}:-fprofile-generate) add_link_options($$BOOL:${DEVILUTIONX_PROFILE_GENERATE}:-fprofile-generate) add_compile_options($$BOOL:${DEVILUTIONX_PROFILE_USE}:-fprofile-use) add_link_options($$BOOL:${DEVILUTIONX_PROFILE_USE}:-fprofile-use) add_compile_options($$BOOL:${DEVILUTIONX_PROFILE_DIR}:-fprofile-dir${DEVILUTIONX_PROFILE_DIR};-fprofile-prefix-path${CMAKE_CURRENT_BINARY_DIR}) add_link_options($$BOOL:${DEVILUTIONX_PROFILE_DIR}:-fprofile-dir${DEVILUTIONX_PROFILE_DIR};-fprofile-prefix-path${CMAKE_CURRENT_BINARY_DIR})含义拆解-fprofile-generate编译出插桩后的二进制运行时会向-fprofile-dir指定的目录写出.gcda运行数据-fprofile-use编译时读取这些.gcda数据用于优化-fprofile-dir指定运行时 Profile 数据输出/读取目录-fprofile-prefix-path${CMAKE_CURRENT_BINARY_DIR}剥离构建目录前缀确保 Profile 数据与构建路径解耦、可复现。采集用 OPK 里装了什么--profile-generate还会显著改变 OPK 打包内容见 build.sh 与 package-opk.shdesktop 文件名称被改写为DevilutionX PGExec指向profile-generate.sh而非正常游戏入口额外打包 Packaging/OpenDingux/profile-generate.sh额外打包 timedemo 数据test/fixtures/timedemo/WarriorLevel1to2/demo_0.dmo以及两个存档文件demo_0_reference_spawn_0_sv、spawn_0.sv。值得注意的 RG99 特例其他平台直接打包.sv存档文件而 RG99 会先把它们解包并精简为普通文件unpack_and_minify_mpq --output-dir build-rg99/demo-saves ...注释为 We use unpacked saves on RG99。这是为了省去运行时加载 MPQ 解压的开销——RG99 的内存连压缩存档的解压都难以承受。同时rg99目标默认会把devilutionx-from-disk.sh与devilutionx-umount-opk-and-run.sh一并打包并把桌面入口指向devilutionx-from-disk.shbuild.sh原因是 RG99 内存太小不能直接挂载 squashfs 运行。第二阶段在 RG99 上运行 Timedemo 采集 Profile把生成的 OPK 拷贝到 RG99其 IP 为10.1.1.3scp -O build-rg99/devilutionx-rg99.opk rg99:/media/sdcard/apps在 RG99 上启动该应用后它不会进入真实游戏而是自动播放一段预置的 Timedemo。由于 RG99 存在严重的内存交换heavy swapping整个过程大约需要 1 小时原文档明确说明。采集脚本逐行解析Packaging/OpenDingux/profile-generate.sh 是 RG99 端实际执行的采集脚本#!/bin/sh set -x SAVE_DIR$(mktemp -d) cp ${PWD}/demo_0_reference_spawn_0_sv ${SAVE_DIR}/ cp ${PWD}/demo_0.dmo ${SAVE_DIR}/ cp -r ${PWD}/spawn_0_sv ${SAVE_DIR}/ rm -rf ${HOME}/devilutionx-profile mkdir -p ${HOME}/devilutionx-profile ./devilutionx-from-disk.sh --diablo --spawn --demo 0 --timedemo --save-dir $SAVE_DIR --data-dir ~/.local/share/diasurgical/devilution rm -rf $SAVE_DIR其执行链路为用mktemp -d建立临时存档目录把 demo 录像demo_0.dmo、参考存档demo_0_reference_spawn_0_sv与spawn_0_sv目录复制进去清空并重建${HOME}/devilutionx-profile——这正是-fprofile-dir指向的 Profile 数据输出目录通过devilutionx-from-disk.sh启动游戏传入--diablo --spawn --demo 0 --timedemo等参数结束后清理临时目录。其中devilutionx-from-disk.shPackaging/OpenDingux/devilutionx-from-disk.sh会先检查目标存储上的二进制与 OPK 内二进制 MD5 是否一致若一致则跳过拷贝否则解包整个 OPK 到存储卡随后调用devilutionx-umount-opk-and-run.shPackaging/OpenDingux/devilutionx-umount-opk-and-run.sh——该脚本umount掉当前挂载的 squashfs 后再exec二进制以此规避 squashfs 带来的额外内存开销。Timedemo 命令行参数与源码实现上一条命令中出现的--diablo、--spawn、--demo 0、--timedemo、--save-dir、--data-dir均由 Source/diablo.cpp 的DiabloParseFlags解析--data-dir path调用paths::SetBasePath设置游戏数据目录MPQ 所在位置--save-dir path调用paths::SetPrefPath设置存档目录--demo N设置demoNumber同时gbShowIntro false--timedemo置位timedemo标志其帮助文本diablo.cpp为 Disable all frame limiting during demo playback禁用回放期间的一切帧率限制--spawnforceSpawn true强制 Shareware 模式--diabloforceDiablo true强制使用原版 Diablo 数据。解析结束后demo::InitPlayBack(demoNumber, timedemo)Source/engine/demomode.cpp打开对应的demo_0.dmo文件进入回放模式。Timedemo 模式下的关键行为集中在 demomode.cppOverrideOptions()会把frameRateControl设为FrameRateControl::None彻底关闭帧率限制、关闭fitToScreen与硬件光标并按 demo 内记录的原始分辨率强制设置窗口GetRunGameLoop()中Timedemo 模式下drawGame dmsg.type DemoMsg::GameTick !HeadlessMode——即只渲染游戏逻辑帧跳过中间插值渲染帧从而尽可能快地跑完整个回放让编译器收集到足够密集的代码路径执行数据。demo 与存档的真实来源是仓库测试夹具 test/fixtures/timedemo/WarriorLevel1to2/包含demo_0.dmo、demo_0_reference_spawn_0_sv、spawn_0.sv即战士角色从第 1 层推进到第 2 层的一段真实可回放游戏录像。在无 DISABLE_DEMOMODE 的构建中这些 demo 参数同样可用于 PC 端复现崩溃与验证参见 Source/engine/demomode.h 中InitPlayBack的声明。第三阶段回传 Profile 数据Timedemo 跑完后${HOME}/devilutionx-profile目录下即是插桩二进制写入的.gcda运行数据。将其整体回传到 PCrm -rf /tmp/devilutionx-profile scp -r -O rg99:/media/data/local/home/devilutionx-profile /tmp/devilutionx-profile注意 RG99 的$HOME对应/media/data/local/home与-fprofile-dir%q{HOME}/devilutionx-profile的展开结果一致。第四阶段使用 Profile 数据构建正式 OPK最后用采集到的 Profile 数据重新构建TOOLCHAIN/opt/rs90-toolchain Packaging/OpenDingux/build.sh rg99 --profile-use --profile-dir /tmp/devilutionx-profile此时 build.sh 会追加-DDEVILUTIONX_PROFILE_USEON -DDEVILUTIONX_PROFILE_DIR${PROFILE_DIR}映射到 GCC 即-fprofile-use见 CMakeLists.txt。编译器会读取/tmp/devilutionx-profile下的.gcda数据结合-fprofile-dir、-fprofile-prefix-path完成路径归一最终以真实运行数据驱动内联、分支优化与代码重排。同时由于本次构建没有--profile-generatepackage-opk.sh 会按正常桌面入口devilutionx-from-disk.sh打包最终成品位于build-rg99/devilutionx-rg99.opk。将这份 OPK 拷贝到 RG99 的/media/sdcard/apps即可获得 PGO 优化后的正式版本。崩溃排查gdbserver VS Code 远程调试如果 Timedemo 在 RG99 上崩溃而 PC 上无法复现可以使用远程调试器诊断。前提是本机已具备mipsel-linux-gdb位于/opt/rs90-toolchain/bin/。部署调试副本到 RG99先解包 OPK 并拷贝到 RG99cd build-rg99 rm -rf squashfs-root unsquashfs devilutionx-rg99.opk ssh rg99 rm -rf /media/data/local/home/squashfs-root scp -r -O squashfs-root/ rg99:/media/data/local/home/squashfs-root在 RG99 上启动 gdbserver在 RG99 上准备好 demo 文件并启动gdbservermkdir -p demo cp -r squashfs-root/demo_0* demo cp -r squashfs-root/spawn_0_sv demo cd squashfs-root gdbserver 10.1.1.1:8001 devilutionx --diablo --spawn --demo 0 --timedemo \ --save-dir ~/demo --data-dir ~/.local/share/diasurgical/devilution注意 demo 数据demo_0.dmo、spawn_0_sv等正是第一阶段打包进 OPK 的 test/fixtures/timedemo/WarriorLevel1to2/ 夹具因此调试参数与采集阶段完全一致崩溃可复现。配置 VS Code 调试在 PC 端项目的.vscode/launch.json中加入以下配置原文档完整提供{ name: rg99 remote debug, type: cppdbg, request: launch, program: build-rg99/devilutionx, stopAtEntry: true, miDebuggerPath: /opt/rs90-toolchain/bin/mipsel-linux-gdb, miDebuggerArgs: -ix /opt/rs90-toolchain/mipsel-rs90-linux-musl/sysroot/usr/share/buildroot/gdbinit, MIMode: gdb, miDebuggerServerAddress: 10.1.1.3:8001, targetArchitecture: mips, additionalSOLibSearchPath: /opt/rs90-toolchain/mipsel-rs90-linux-musl/sysroot, setupCommands: [ { description: Enable pretty-printing for gdb, text: -enable-pretty-printing, ignoreFailures: true } ], externalConsole: false, cwd: ${workspaceFolder} }逐项说明type: cppdbg使用 VS Code C/C 扩展的 GDB 调试器program: build-rg99/devilutionx本地交叉编译产物用于符号解析注意这是未 strip 的调试/发布二进制与 OPK 内可执行文件对应miDebuggerPathMIPS 目标的 gdbmipsel-linux-gdb普通 x86 gdb 无法读取 mipsel 目标miDebuggerArgs-ix在启动时加载 buildroot sysroot 自带的gdbinit用于正确解析 musl 工具链的符号与库路径miDebuggerServerAddressRG99 上 gdbserver 的监听地址与端口targetArchitecture: mips声明调试目标架构additionalSOLibSearchPath指向工具链 sysroot保证动态库符号可解析stopAtEntry: true在入口处停住便于从第一条指令开始排查。配置完成后从 VS Code 的 Run and Debug 标签页运行rg99 remote debug即可在 PC 上获得 RG99 远程进程的完整断点、单步与变量查看能力。结语RG99 的 PGO 构建是一条构建采集版 → 真机回放 → 回传数据 → 重建正式版的闭环流水线其价值在于让资源极端的硬件也能获得接近真实场景优化的二进制。理解build.sh的两个 PGO 开关、CMake 层面的-fprofile-*标志注入以及 Timedemo 回放链路diablo.cpp 参数解析 → demomode.cpp 回放控制不仅能顺利复现官方流程也为在其它 OpenDingux 目标lepus、retrofw、rg350、gkd350h上定制 PGO 提供了可迁移的模板。赞分享游戏开发【免费下载链接】DevilutionXDiablo build for modern operating systems项目地址https://gitcode.com/gh_mirrors/de/DevilutionX点击查看免费下载相关推荐dotnet-pgo 实验构建 .NET 的 Trace 驱动型 Profile Guided OptimizationPGO数据管道dotnet pgo 实验构建 .NET 的 Trace 驱动型 Profile Guided OptimizationPGO数据管道 导读 本文围绕 .语言运行时标准库JIT编译编译器GraalVM Native Image 中的 Profile-Guided OptimizationPGO全指南原理、实战与性能调优GraalVM Native Image 中的 Profile Guided OptimizationPGO全指南原理、实战与性能调优 本篇技术指南以 P编译器JIT编译语言运行时高性能计算内存管理Foundry 启用 PGOProfile-Guided Optimizationx86_64 GNU/Linux 发布版二进制的构建优化实践Foundry 启用 PGOProfile Guided Optimizationx86_64 GNU/Linux 发布版二进制的构建优化实践 导读 本文区块链开发工具上一篇MediaCrawler-new一站式社交媒体数据采集解决方案下一篇告别iPhone照片无法打开的困扰HEIF Utility一站式解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
OpenCV ccalib 多相机标定教程:基于随机图案的多相机标定工具箱实战指南 计算机视觉图像处理深度学习机器学习 【免费下载链接】opencv_contrib Repository for OpenCVs extra modules 项目地址: https://gitcode.com/gh_mirrors/op/opencv_contrib 点击查看 免费下载 本文以 opencv_contrib 仓库 ccalib 模块 的官方教程 multi_camera_t… · 2026/9/24 16:28:43
create-keystone-app 版本演进解析:从 v10 到 v11 的脚手架变革与实现原理 后端 【免费下载链接】keystone The superpowered headless CMS for Node.js — built with GraphQL and React 项目地址: https://gitcode.com/gh_mirrors/key/keystone 点击查看 免费下载 create-keystone-app 是 Keystone 6 官方的项目脚手架 CLI:执… · 2026/9/24 16:28:43
Bottlerocket 测试指南:从单元测试到 TestSys 集成测试的完整实践 操作系统云原生安全 【免费下载链接】bottlerocket An operating system designed for hosting containers 项目地址: https://gitcode.com/gh_mirrors/bo/bottlerocket 点击查看 免费下载 本指南以 Bottlerocket 仓库根目录下的 TESTING.md 为骨架,系统… · 2026/9/24 16:28:43
【Dify】YouTube全自动内容生成与多平台分发应用 自媒体视频内容的生产和分发,已成为内容创业与个人品牌塑造的重要途径。高效的视频自动化处理工具,能够显著提升内容制作与运营的效率。
本文聚焦于YouTube及多平台自媒体场景,介绍一个覆盖从素材导入、音频转写、语义分析、文案生成、分段整理到成品分发的全流程工作流。通… · 2026/9/24 17:04:43
Presto Release 0.178 版本解读:内存治理、SQL 能力扩展与 Connector 稳定性改进 大数据数据库后端 【免费下载链接】presto The official home of the Presto distributed SQL query engine for big data 项目地址: https://gitcode.com/gh_mirrors/pre/presto 点击查看 免费下载 本文以 Presto 官方发布说明 release-0.178.rst 为骨架ÿ… · 2026/9/24 17:04:31
handy4cj邮箱与手机号校验实战:RFC 2822标准验证背后的简单原理 handy4cj邮箱与手机号校验实战:RFC 2822标准验证背后的简单原理 【免费下载链接】handy4cj 项目地址: https://gitcode.com/Cangjie-SIG/handy4cj
handy4cj 是一个基于仓颉语言的实用工具库,内置 checkEmail 邮箱校验函数(严格遵循 R… · 2026/9/24 17:04:25
大麦抢票自动化指南:如何从环境自检到订单提交,3分钟跑通全流程 大麦抢票自动化指南:如何从环境自检到订单提交,3分钟跑通全流程 【免费下载链接】ticket-purchase 大麦自动抢票,支持人员、城市、日期场次、价格选择 项目地址: https://gitcode.com/GitHub_Trending/ti/ticket-purchase
本文基于开源… · 2026/9/24 17:04:24
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44