ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Bevy Bistro 大型场景压测示例全指南:场景资源、纹理压缩与性能基准测试

Bevy Bistro 大型场景压测示例全指南:场景资源、纹理压缩与性能基准测试 Bevy Bistro 大型场景压测示例全指南场景资源、纹理压缩与性能基准测试【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy本篇技术指南以 Bevy 官方仓库中的bistro大场景示例为对象完整讲解如何获取并准备 Bistro 室外/室内模型资源、以带纹理压缩与磁盘缓存的参数启动示例、解读其全部命令行开关并结合源码剖析场景加载后处理、mipmap/BCn 压缩链路与内置 benchmark 的运行机制。读完本文你将能独立把该示例跑起来并把它当作验证 Bevy 在大规模静态场景下渲染与剔除性能的试验台。Bistro 示例在仓库中的定位Bistro 示例位于 examples/large_scenes/bistro/README.md是 Bevy 仓库中专门用于大型场景压力测试的示例之一同属该族的还有 caldera_hotelCaldera Hotel 01与bevy_city程序化生成城市它们都被登记在仓库根 Cargo.toml 的 workspace members 中并共享一套压测思路加载一个几何量级庞大的静态场景然后通过命令行开关逐项关闭 Bevy 的各类优化frustum culling、遮挡剔除、自动合批、间接绘制等观察并量化某一管线环节的开销。Bistro 场景的构成相当直接——它同时加载著名的BistroExterior室外街景与BistroInterior_Wine室内酒馆/红酒区两套模型实体数量与材质数量都远超普通示例非常适合观察 CPU 剔除、绘制队列、批次合并与 GPU 遮挡剔除在真实场景中的行为。获取并准备 Bistro 场景资源与仓库内大多数“开箱即用”的小示例不同Bistro 的模型文件体积庞大且授权来源特殊不随仓库分发需要手动下载并转换。原始资源下载与重新导出按 README 的要求官方数据源为 NVIDIA 的 Amazon Lumberyard Bistro 资源位于 developer.nvidia.com 的 OCA/Orca 项目页面。拿到原始资源后需要将其中两个 FBX 文件重新导出为 glTFBistroExterior.fbx→ 室外部分BistroInterior_Wine.fbx→ 室内酒部分README 明确要求导出为“.gltf .bin textures”格式即非二进制自包含的 glb而是引用外部 .bin 与纹理文件的经典布局。随后把导出产物分别移动到bistro_exterior与bistro_interior_wine两个目录中使其对应示例运行时的资源读取路径。从 main.rs 的加载代码可以印证期望的目录与文件名结构bistro_exterior/BistroExterior.gltf#Scene0bistro_interior_wine/BistroInterior_Wine.gltf#Scene0若启用 glTF 灯光还会额外加载假 GI 场景BistroExteriorFakeGI.gltf#Scene0见 main.rs需要说明的是示例代码中相机还加载了environment_maps/下的 HDR 环境贴图san_giuseppe_bridge_4k_diffuse/specular.ktx2见 main.rs用于 IBL 漫反射与镜面光照因此运行前应确保整套资源含环境贴图均就位于 Bevy 的资产目录中。备选已处理好的实例化版本原始 FBX→glTF 转换往往带有一系列材质/几何瑕疵README 给出了社区整理的“已处理 glTF 文件带实例化”其处理要点本身就是一份非常有价值的资产优化清单修复 FBX 材质金属度异常通过脚本将材质统一改为电介质dielectric除非材质名中带有 “metal”植物改为 alpha clip透明裁剪而非 alpha blend正确设置玻璃器皿与液体材质网格原点统一移动到各自包围盒中心而非世界原点剔除重复顶点原场景存在大量“重复顶点导致本该一致的实例互不匹配”的怪例让场景真正使用实例化唯一网格数由 3880 降至 1188移除两处重叠的重复网格为部分室内/室外灯光配置真实光源搭建基础假 GIfake GI使用场景自带 HDRI 做 IBL基于图像的光照。这套优化思路对任何想在大场景中压榨实例化收益的开发者都有直接参考价值去重、规整原点、统一材质语义是实例数能有效合并的前提。编译与运行README 给出的推荐启动命令为cargo run -p bistro --release --features mipmap_generator/compress -- --cache命令可拆解为四部分-p bistro指定运行 workspace 成员 cratebistro包定义见 examples/large_scenes/bistro/Cargo.toml--release以优化模式构建。该场景面数庞大、CPU 侧每帧要做完整剔除与绘制指令编码Debug 构建几乎没有参考意义--features mipmap_generator/compress语法上等价于启用依赖mipmap_generator的compressfeaturecargo的dep/feature写法。只有启用该 feature--compress与--cache两个参数才生效详见下文-- --cache--之后是传给示例自身的命令行参数这里即启用压缩纹理磁盘缓存。若只想快速查看运行参数而不真正启动示例的 argh 解析器也提供了帮助输出cargo run -p bistro --release -- --help命令行参数详解示例使用 argh。README 列出的参数与源码逐一对应如下参数作用对应字段/备注--no-gltf-lights禁用 glTF 自带灯光场景默认带大量点光源关闭后这些光源实体会被清理no_gltf_lights--minimal极简模式关闭 bloom、环境光遮蔽AO、抗锯齿AA与阴影minimal--compress压缩纹理若尚未压缩。需要compressfeaturecompress--low-quality-compression只使用 0.5 byte/px 的格式BC1、BC4若含 alpha 则用 BC3开启后通常比CompressionSpeed::UltraFast更快且忽略压缩速度档位low_quality_compression--cache启用压缩纹理磁盘缓存。需要compressfeaturecache--countBistro 场景的复制份数数量在中心场景周围按网格复制count默认 1--spin让 Bistro 与相机一起旋转spin--hide-frame-time不显示帧时间 HUDhide_frame_time--deferred使用延迟渲染deferred shadingdeferred--no-frustum-culling关闭全部视锥剔除场景中所有网格-材质实体都会被绘制用于压测排队与合批no_frustum_culling--no-automatic-batching关闭自动合批跳过合批后渲染通道绘制命令编码压力大增no_automatic_batching--no-view-occlusion-culling关闭相机视角的 GPU 遮挡剔除no_view_occlusion_culling--no-shadow-occlusion-culling关闭方向光阴影的 GPU 遮挡剔除no_shadow_occlusion_culling--no-indirect-drawing关闭间接绘制no_indirect_drawing--no-cpu-culling关闭 CPU 剔除no_cpu_culling注意源码中还有 README 未列出的隐藏开关--no-mip-generationno_mip_generation见 main.rs用于在对照实验中跳过 mipmap 生成插件以隔离“生成 mip”本身的开销。运行交互相机机位、路径动画与基准测试README 简述了三个热键用途结合 main.rs 可将交互键位补全数字键1/2/3切换到三套预设相机位姿CameraPositions中保存了 3 组 Transform分别对应外景、室内等观察角度I将当前相机 Transform 以日志打印到控制台方便开发者“取出”当前视角保存为新机位源码注释提示此用途Space开/关相机沿路径自动飞行。动画使用 3 个关键位姿ANIM_CAM分段线性插值并对目标位姿做 EMA/低通滤波平滑ANIM_HYSTERESIS 0.1见 main.rs因此画面过渡柔和而非生硬跳变。README 第 9 行“Press to animate camera along path”省略了键名源码确认该键就是空格B启动内置 benchmark详见下文。此外相机默认挂载FreeCamera来自bevy_camera_controller/free_camera可在任意时刻自由飞行漫游。相机本体配置也很有压测特色窗口 1920×1080、PresentMode::Immediate关闭垂直同步限制、Msaa::Off多采样关闭、由 TAA 承担抗锯齿、启用 HDR 与屏幕空间透射SSS/transmission具体见 main.rs。从源码看场景加载与材质后处理Bistro 的两套模型通过WorldAssetRoot 实体观察者的方式异步加载在实体上挂载资源句柄并注册proc_scene观察者当场景在 ECS 世界中实例化完成WorldInstanceReady事件后触发一次遍历处理见 main.rs。这段后处理逻辑值得细读它解释了大量 README 之外的细节所有StandardMaterial统一flip_normal_map_y trueglTF 法线贴图约定翻转对AlphaMode::Mask的材质植物/树叶类设置double_sided、cull_mode None、厚度0.2并赋予diffuse_transmission 0.6同时为实体挂TransmittedShadowReceiver让半透植物能正确接收透射阴影对AlphaMode::Opaque材质关闭双面、背面剔除启用若传了--no-gltf-lights场景内由 glTF 生成的所有点光/方向光/聚光实体将被despawnglTF 文件里自带的相机实体一律清除示例只保留自己创建的主相机。同时--count N会让场景以中心为原点按间距 150 单位的方形网格复制出 N-1 套额外 Bistro含室内/室外且错落摆放避免完全重叠用于制造“多场景同屏”的超高压力复制逻辑见 main.rs。纹理 mipmap 与 BCn 压缩链路Bistro 的场景贴图数量多、分辨率高直接上传会占用巨额显存与带宽因此示例默认接入仓库自带的mipmap_generator插件位于 examples/large_scenes/mipmap_generator。在 main.rs 中示例对插件做了如下配置anisotropic_filtering: 16各向异性过滤开到 16xcompression由--compress决定开启时使用默认档位即CompressionSpeed::UltraFastcompressed_image_data_cache_path由--cache决定写入名为compressed_texture_cache的目录low_quality对应--low-quality-compressionmip 生成在 CPU 上进行README/源码注释也提醒生成 mipmap 需要约一分钟且若使用自带 mip 的 ktx2 纹理则会自动跳过。MipmapGeneratorSettings的字段与默认值定义于 examples/large_scenes/mipmap_generator/src/lib.rs。压缩的可行格式映射即“首次运行时该示例会做哪些转换”为R8Unorm→Bc4RUnormRg8Unorm→Bc5RgUnormRgba8Unorm→Bc7RgbaUnormRgba8UnormSrgb→Bc7RgbaUnormSrgb低质量模式下只使用 0.5 byte/px 的 BC1/BC4带 alpha 时回退到 BC3由于该模式整体更快CompressionSpeed档位将被忽略。需要注意mipmap_generator的compressfeature 依赖intel_tex_2与zstd见其 Cargo.toml这正是必须在命令行通过--features mipmap_generator/compress显式开启的原因。由于 CPU 压缩耗时较长示例设计了两层加速其一--cache会把压缩后的原始图像数据以磁盘目录形式缓存下来第二次启动直接读取其二mip 生成只在“新材料出现”时触发且只处理材质中实际用到的纹理该插件通过GetImagestrait 收集材质引用的贴图。换言之首次运行建议带--cache否则每次启动都要重新压缩一遍全部贴图。用 B 键跑出可信的性能基准README 标注“Press B for benchmark”main.rs 的benchmark系统给出了完整语义按B开始先重置统计计算每个观测步的帧数 max(60, 3秒 ÷ 当前帧耗时)即尽量让每个机位持续约 3 秒、且不少于 60 帧依次把相机切到机位 1、机位 2、机位 3每个机位跑一个观测步结束后在控制台打印Benchmark avg cpu frame time全程平均 CPU 帧耗时ms平均1% low与1% high帧耗时对应卡顿敏感的最差 1% 分位统计见 frame_time_system依赖FrameTimeDiagnosticsPlugin记录的历史测量值计算场景规模统计Meshes、Mesh Instances、Materials、Material Instances四类计数。屏幕左上角还会常驻帧时间 HUDEMA/SMA 平滑值及 1% low/high由frame_time_system每帧刷新可用--hide-frame-time关闭。源码文件顶部注释对“如何测得干净数据”给出了很实在的建议等帧时间读数稳定、rust-analyzer 等后台任务平静下来、并锁定 GPU 频率后再按 B否则结果会被工具链或变频干扰。用“减法”定位管线瓶颈Bistro 最有价值的用法是作为对照实验平台把--minimal、--no-frustum-culling、--no-view-occlusion-culling、--no-shadow-occlusion-culling、--no-automatic-batching、--no-indirect-drawing、--no-cpu-culling等开关两两组合即可隔离出 Bevy 各优化环节在此场景上的收益关闭 CPU/视锥剔除后场景所有网格-材质实体每帧强制进入绘制压力落在排队与合批阶段关闭自动合批后压力转向渲染通道的 draw command 编码关闭视角/阴影的 GPU 遮挡剔除可分别考察主视图与阴影贴图视角下的 Overdraw--minimal会同时关掉 bloom、TAA、SSAO 与阴影/接触阴影见 main.rs 与方向光配置处用于评估后处理与阴影在总帧耗时中的占比。值得一提的还有渲染路径对照默认是前向渲染 TAA 屏幕空间透射加--deferred后会写入DefaultOpaqueRendererMethod::deferred()并为主相机挂DepthPrepass与DeferredPrepass见 main.rs 与 L288-L289从而在同一场景上对比前向/延迟两条管线的表现。场景同时包含方向光级联阴影3 级 cascade与成百上千的 glTF 点光源正好覆盖两种管线各自的典型压力点。小结Bistro 示例是理解 Bevy 大场景管线的极佳入口资源侧它示范了“外部商业资产 → glTF 规范化 → 实例化去重”的预处理思路运行侧它通过mipmap_generator打通了 CPU mipmap 生成、BCn 压缩与磁盘缓存这一完整纹理管线测量侧内置的 B 键基准与 HUD 提供了帧耗时、1% low/high 与实例规模的量化手段而一套以--no-*为主的开关组让开发者能够对剔除、合批、间接绘制等机制做系统性的控制变量实验。想要开始压测只需按 README 准备好两套 glTF 场景再执行cargo run -p bistro --release --features mipmap_generator/compress -- --cache即可配合--count与--spin还能把压力线性放大得到更完整的性能曲线。【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表