ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Bevy 官方示例全指南:从 `cargo run --example` 到 Android / iOS / Wasm 跨平台实战

Bevy 官方示例全指南:从 `cargo run --example` 到 Android / iOS / Wasm 跨平台实战 Bevy 官方示例全指南从cargo run --example到 Android / iOS / Wasm 跨平台实战【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevyBevy 是一个使用 Rust 编写的数据驱动开源游戏引擎其 examples/README.md 既是官方示例的索引主页也是一份完整的“如何运行与移植 Bevy 程序”的操作手册。本文以该文档为骨架结合仓库内真实示例代码与工程配置系统讲解示例的组织方式、运行命令、按主题分门别类的学习路径以及 Android、iOS、WebAssemblyWasm三大平台的构建、调试与体积优化方法帮助你在阅读完本文后能够独立运行、改造并把 Bevy 示例移植到你自己的目标平台上。示例在仓库中的角色与定位Bevy 把“示例即文档”践行得相当彻底。仓库根目录下examples/之外还有docs-template/EXAMPLE_README.md.tpl示例索引页的模板tools/build-templated-pages/Cargo.toml用于从模板与示例清单自动生成examples/README.md的工具运行方式是文档头部注释中注明的cargo run -p build-templated-pages -- build-example-page。换句话说examples/README.md的内容并非纯手写而是由仓库内所有示例文件的元信息描述、分类、示例名聚合而来这正是它能够与examples/目录下数百个.rs文件一一对应、保持长期同步的原因。从源码结构看Bevy 示例按功能领域划分为数十个一级目录例如examples/2d/、examples/3d/、examples/ecs/、examples/ui/、examples/shader/、examples/window/、examples/mobile/等其中包含完整可玩的示例游戏如扫雷风格的 mines.rs、经典打砖块 breakout.rs也包含针对单个 API 的最小演示如 hello_world.rs。examples/README.md的目标正是让你快速找到“想学的那个点”并立即跑起来。快速上手一行命令运行任意示例运行任何跨平台示例的标准命令非常简单cargo run --example Example其中Example是示例文件名不含.rs后缀例如hello_world、3d_scene或breakout。如果你的机器同时具备多种显示协议还可以通过 feature 显式选择窗口合成器window compositor强制示例运行在 X11 或 Wayland 之上cargo run --features x11 --example Example cargo run --features wayland --example Example例如原文档给出的组合cargo run --features wayland --example hello_world这两个 feature 在底层由 crates/bevy_winit/Cargo.toml 提供映射x11 [winit/x11]、wayland [winit/wayland, ...]并经由 crates/bevy_internal/Cargo.toml 中的同名 feature 向外透出。需要注意的是bevy_winit的default [x11]意味着若不额外开启 WaylandLinux 桌面环境默认走 X11 路径。最小示例拆解hello_world是理解 Bevy 应用形态的最小入口完整源码见 hello_world.rs全部逻辑只有十行左右//! A minimal example that outputs Hello, World! use bevy::prelude::*; fn main() { App::new().add_systems(Startup, hello_world_system).run(); } fn hello_world_system() { info!(Hello, World!); }它清晰展示了 Bevy 的三个基本约定App是应用容器、系统system是普通 Rust 函数、Startup是只执行一次的启动调度标签。运行cargo run --example hello_world后控制台会通过info!输出Hello, World!。版本对齐警告crates.io 发布版与 git main 分支原文档特别提示了使用 crates.io 发布版本的用户需要格外注意最新 crates.io 发布版与 git main 分支的开发版之间经常存在巨大差异和不兼容的 API 变更本仓库根目录 Cargo.toml 中version 0.20.0-dev表明这是一个处于持续开发中的版本尚未发布。因此如果你基于某个 crates.io 发布版而非本仓库代码开发必须查看与你所用版本匹配的示例源码否则示例可能无法通过编译当你把本仓库 clone 到本地运行示例时若想对齐某个发布版本请使用git checkout切换# latest 分支始终指向最新的发布版本 git checkout latest # 或者切换到指定版本例如 0.4 git checkout v0.4.0简单说示例代码跟着 git 分支走不要拿 main 分支的示例去套旧版本的 API。示例分类地图从 Hello World 到完整游戏examples/README.md按目录把全部示例划分为“Bare Minimum”与“Cross-Platform Examples”两大类后者又细分为约 30 个主题小节。下表汇总了主要分类及其在仓库中的位置链接均以仓库根目录为起点分类目录代表性示例一句话说明2D Renderingexamples/2dsprite.rs、sprite_sheet.rs、sprite_slice.rs、texture_atlas.rs、tilemap_chunk.rsSprite、图集、9-patch 切片、Tilemap 等 2D 渲染能力3D Renderingexamples/3d3d_scene.rs、pbr.rs、lighting.rs、deferred_rendering.rsPBR、灯光、阴影、后处理、体积雾等 3D 效果Animationexamples/animationanimated_mesh.rs、animation_graph.rs、morph_targets.rs骨骼动画、动画图混合、形变目标Applicationexamples/appempty.rs、plugin.rs、headless.rs、custom_loop.rs应用骨架、插件系统、无头运行、自定义主循环Assetsexamples/assetasset_loading.rs、custom_asset.rs、hot_asset_reloading.rs资源加载、自定义 loader、热重载ECSexamples/ecsecs_guide.rs、observers.rs、states.rs相关系统、查询、观察者、运行条件、状态等 ECS 核心Gizmosexamples/gizmos2d_gizmos.rs、3d_gizmos.rs、transform_gizmo.rs调试辅助线、可交互的变换 GizmoInputexamples/inputkeyboard_input.rs、mouse_input.rs、gamepad_input.rs键盘 / 鼠标 / 手柄 / 触摸输入Pickingexamples/pickingmesh_picking.rs、sprite_picking.rs网格与精灵的拾取Reflectionexamples/reflectionreflection.rs、serialization.rs运行时反射与序列化Sceneexamples/sceneworld_serialization.rs场景保存与加载Shadersexamples/shader 与 examples/shader_advancedshader_material.rs、compute_shader_game_of_life.rs自定义材质、计算着色器、渲染管线进阶UIexamples/uitext.rs、button.rs、flex_layout.rs、grid.rsBevy UI 布局、文本、控件Windowexamples/windowwindow_settings.rs、multiple_windows.rs、screenshot.rs窗口配置、多窗口、截屏glTFexamples/gltfload_gltf.rs、gltf_skinned_mesh.rsglTF 模型加载与扩展Showcase / Gamesexamples/showcasebreakout.rs、mines.rs、alien_cake_addict.rs可完整游玩的示例小游戏Stress Testsexamples/stress_testsmany_cubes.rs、bevymark.rs、many_foxes.rs压力与性能测试Remote Protocolexamples/remoteclient.rs、server.rs通过 BRP 远程连接、控制 Bevy 应用原文档中对每个示例都配有“示例名 链接 一句话描述”的三列表格例如 2D 部分共列出约 30 条、3D 部分约 70 条、UI 部分约 60 条。这些条目在源码中都可以找到对应文件比如 3D 渲染一节里的 bloom_3d.rsBloom 后处理、ssao.rs屏幕空间环境光遮蔽、volumetric_fog.rs体积雾UI 一节的 grid.rsCSS Grid 布局与 standard_widgets.rs核心无头控件。需要学习具体某个 API 时直接按文件名定位到对应.rs文件阅读即可。ECS 与 UI适合作为学习起点的两个主题若想系统理解 Bevy 的架构建议从两类示例入手ECSexamples/ecs 中有一份被称为“Full guide to Bevys ECS”的 ecs_guide.rs它系统串联了实体、组件、系统、查询等概念配合 observers.rs事件观察者、run_conditions.rs运行条件、fixed_timestep.rs固定时间步即可覆盖绝大多数日常开发模式。UIexamples/ui 中 text.rs 与 button.rs 是最小的交互入口而 layout、styling、widgets 子目录则按布局、样式、控件三个维度拆分了能力点便于按需取用。压力测试示例请务必使用 release 模式Stress Tests 分类用于在隔离环境中测试引擎各部分的性能与稳定性。由于这些示例刻意追求大量实体与绘制压力原文档强调建议以 release 模式运行cargo run --release --example example name例如many_cubes.rs测试逐实体绘制开销传入sphere参数可额外测试视锥剔除frustum cullingbevymark.rs 与 bevymark_3d.rs重负载的 2D/3D 精灵渲染基准many_foxes.rs批量加载并绘制带蒙皮动画的狐狸模型用于测试骨骼网格性能可传入数量参数默认 1000many_lights.rs用WGPU_SETTINGS_PRIOwebgl2可限制为 uniform buffer 与最多 256 盏灯。仓库还在根 Cargo.toml 中提供了专门的[profile.stress-test]继承 release、lto fat、panic abort说明压测场景在这套工程里是一等公民。测试示例如何为 Bevy 应用与系统编写测试除可直接运行的示例外examples/README.md还专门列出了两个“如何测试”的入口位于tests/目录tests/how_to_test_apps.rs介绍简单的集成测试方式用于测试整个 Apptests/how_to_test_systems.rs介绍如何针对带命令commands、查询queries或资源resources的系统编写单元测试。它们是“从写示例到写测试”之间的桥梁属于同一个学习路线的自然延伸。平台专属示例Androidbevy_mobile_example是一个同时面向 Android 与 iOS 的工程工作区根 Cargo.toml 中的[profile.dev.package.bevy_mobile_example]设置了strip true目的是让 app 包体保持在合理范围如果你需要原生调试符号请移除该strip覆盖。相关工程位于 examples/mobile其中 examples/mobile/Cargo.toml 通过features [android-game-activity]依赖 Bevy。Android 环境准备Setuprustup target add aarch64-linux-android cargo install cargo-ndk此外需要安装 Android SDK并将环境变量ANDROID_SDK_ROOT指向 Androidsdk根目录若使用 “NDK (Side by side)” 方式安装 NDK还需设置ANDROID_NDK_ROOT指向sdk/ndk/[NDK number]中的某一个。当然直接安装 Android Studio 也可以替代上述手工配置。构建与运行Build RunAndroid 上需要先用cargo-ndk为目标架构生成共享库.so再交给 Gradle 打包cargo ndk -t target_name -P 26 -o project_name/app/src/main/jniLibs build例如编译到 64 位 ARM 平台cargo ndk -t arm64-v8a -P 26 -o android_example/app/src/main/jniLibs build把输出路径设到app/src/main/jniLibs下的目标架构目录是保证 JNI 能按架构找到共享库的关键。之后用 Gradle wrapper 或 Android Studio 完成 APK 构建./gradlew build调试技巧Debugging运行期间查看引擎与渲染日志adb logcat | grep RustStdoutStderr\|bevy\|wgpu如果遇到 GPU 获取或初始化类错误可尝试将wgpu_hal的日志级别调到DEBUG以获取更多信息若运行时报“unknown activity”通常卸载后重装即可解决adb uninstall org.bevyengine.example老机型支持从 GameActivity 切换到 NativeActivityBevy 示例默认对齐 Play Store 要求的最低 Android API。Bevy 默认使用GameActivity它只支持Android API level 31 及以上老机型用户若想用更低 API需要切换到NativeActivity。另外请记住使用bevy_audio时最低支持的 Android API 版本为 26对应 Android 8 / Oreo。切换到NativeActivity需要在Cargo.toml中手动修改 featurebevy { version 0.19, features [android-native-activity] }注意该示例片段中的版本号以你实际依赖的 Bevy 版本为准本仓库内对应的 feature 定义位于 crates/bevy_internal/Cargo.toml 的android-native-activity [bevy_winit/android-native-activity]以及 crates/bevy_winit/Cargo.toml 中对应的winit/android-native-activity映射。随后按前述 “Build Run” 流程重新构建即可。关于cargo-apk也可以使用更简单但已废弃的cargo-apk直接构建 APK但它不支持GameActivity。如需使用可参考 examples/mobile/android_basic 文件夹内的说明。移动端示例本体是一个“带按钮并可播放声音的 3D 场景”代码集中在 examples/mobile/src/lib.rsAndroid 与 iOS 共用同一份业务逻辑。平台专属示例iOS环境准备Setup根据你的目标设备安装对应的 Rust 交叉编译目标aarch64-apple-iosiOS 真机x86_64-apple-iosx86 处理器上的 iOS 模拟器aarch64-apple-ios-simApple 处理器Apple Silicon上的 iOS 模拟器rustup target add aarch64-apple-ios x86_64-apple-ios aarch64-apple-ios-sim构建与运行Build Run在 bash 下进入examples/mobile目录执行cd examples/mobile make run理想情况下它会启动xcrun simctl list devices列出的第一个 iOS 模拟器完成安装并运行 app若失败可通过环境变量指定模拟器 UUIDDEVICE_ID${YOUR_DEVICE_ID} make run若希望用 Xcode 逐步观察构建过程可以打开随附的 Xcode 工程open bevy_mobile_example.xcodeproj/然后点击 run 按钮等待构建完成即可。该 Xcode 工程即 examples/mobile/bevy_mobile_example.xcodeproj其中的 Makefile 与 build_rust_deps.sh 封装了 Rust 侧的编译步骤。平台专属示例Wasm浏览器环境准备Setuprustup target add wasm32-unknown-unknown cargo install wasm-bindgen-cli构建与运行Build Run以lighting示例为例其他示例只需把命令中的lighting替换成对应示例名cargo build --release --example lighting --target wasm32-unknown-unknown wasm-bindgen --out-name wasm_example \ --out-dir examples/wasm/target \ --target web target/wasm32-unknown-unknown/release/examples/lighting.wasm第一条命令把示例交叉编译为wasm32-unknown-unknown目标第二条命令用wasm-bindgen-cli为 wasm 文件生成 JavaScript 绑定产物为examples/wasm/target/wasm_example.js。可加载的宿主页面是随仓库提供的 examples/wasm/index.html。最后把examples/wasm目录作为静态站点伺服到浏览器任选其一# 需先 cargo install basic-http-server basic-http-server examples/wasm # 使用 python python3 -m http.server --directory examples/wasm # 使用 ruby ruby -run -ehttpd examples/wasmWebGL2 与 WebGPUBevy 对 WebGPU 的支持仍在开发中、目前属于实验特性。构建 WebGPU 版本需要启用webgpufeature它会覆盖webgl2feature而启用webgpu构建出的产物无法在不支持 WebGPU 的浏览器上运行。Bevy 提供了一个专门构建 Wasm 示例的辅助工具对应 tools/build-wasm-example# 构建 WebGL2 版本 cargo run -p build-wasm-example -- --api webgl2 load_gltf # 构建 WebGPU 版本 cargo run -p build-wasm-example -- --api webgpu load_gltf # 构建 debug 版本 cargo run -p build-wasm-example -- --debug --api webgl2 load_gltf该辅助工具会把实际执行的构建命令打印到日志方便你了解背后的完整调用链。浏览器中的音频限制目前 Wasm 后端是单线程的这可能导致浏览器播放音频时出现卡顿不同浏览器、不同游戏的表现各不相同需要针对自己的项目实测。更关键的是浏览器不允许未经用户交互触发就自动播放音频避免多个标签页同时自动出声。Chrome 官方博客对该机制有详细解释并提供了“在用户首次与页面交互时立即恢复音频”的 JS 变通方案。也就是说Web 游戏需要在用户点击或触摸后显式 resume 音频上下文。体积优化Optimizing在 Web 上缩小分发文件的体积非常必要。除了快速入门指南中介绍的执行体积优化手段外构建时应当用--profile wasm-release代替--releasecargo build --profile wasm-release --example lighting --target wasm32-unknown-unknown仓库根 Cargo.toml 中确实定义了[profile.wasm-release]它继承release并进一步启用了opt-level z、lto fat、codegen-units 1——这三项正是针对体积的激进优化组合。构建完成后还可再用wasm-opt做一轮二进制优化。首先定位wasm-bindgen-cli在--out-dir中生成的.wasm文件文件名通常以_bg.wasm结尾然后执行wasm-opt -Oz --output optimized.wasm examples/wasm/target/lighting_bg.wasm mv optimized.wasm examples/wasm/target/lighting_bg.wasm原文档给出了一份 2022 年 7 月针对“一个小型 3D 场景 两盏灯”项目的实测体积对照表直观展示不同 profile 组合的效果profilewasm-optno wasm-optDefault8.5M13.0Mopt-level z6.1M12.7Mz lto thin5.9M12Mz lto fat5.1M9.4Mz thin codegen-units 15.3M11Mz fat codegen-units 14.8M8.5M注意这份数据反映的是当时工具链的水平仅用于帮助理解“哪种优化组合效果更大”的趋势且要警惕某些优化会显著拖慢编译时间——务必以“最终产物确实变小”为取舍标准。加载资源Loading Assets要加载资源它们必须位于examples/wasm/assets目录中。克隆本仓库时Linux 与 macOS 上该目录会被自动设置为符号链接指向assets/Windows 上需要手动移动资源文件到该目录浏览器端才能通过 HTTP 请求访问到它们。总结一份文档覆盖三条学习路径纵观 examples/README.md它实际提供了三条互相衔接的路径横向浏览——通过按主题分类的数百条示例表格examples/2d、examples/3d、examples/ecs、examples/ui、examples/shader 等快速定位想学的功能再用cargo run --example name一键运行纵向深入——通过 hello_world.rs 理解最小应用借助 examples/ecs/ecs_guide.rs、examples/showcase 中的完整游戏掌握工程化写法通过 tests/how_to_test_apps.rs 学会测试跨平台移植——利用 Androidexamples/mobile cargo-ndk GameActivity/NativeActivity、iOSmake run Xcode 工程与 Wasmwasm-bindgenbuild-wasm-examplewasm-releaseprofile三段式操作手册把同一套 Rust 代码部署到不同端。无论你处于学习 Bevy 的哪个阶段从这份“示例即手册”出发、对照示例源码验证 API 行为都是最直接有效的上手方式。【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表