文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录)git
上次更新:2018.12.18github
根据kvark指导,Xcode建立External Build System项目可经过Capture GPU Frame查看gfx-hal的examples绘制过程,略出乎意料,我没想过能够这么干(浪),虽然2015年我用External Build System单步调试过FFmpeg源码,可是我不知道Xcode也支持这种形式的Capture GPU Frame,能够说很无知且没有探索精神了。缓存
虽然gfx-hal有完美的日志输出,可是,做为刚接触gfx项目和Rust的初学者,有时我想确认程序流程是否符合预期(我一直在忙其余事,不多看Rust语法,这是我的失误),即使Rust写日志输出比C++方便不少,不过图形项目开发过程当中仍是帧回放定位问题的效率最高 。可是,折腾一番,我在3台mac(MacBook Pro + iMac)上一执行就崩溃。劉子殊在他本地测试也崩溃。我以为多是工程配置出错了,缘由是,终端直接运行gfx/examples/quad等可执行文件是正常的。bash
客观地说,隔了一段时间没用Xcode,我不熟悉它的配置了,而后考虑并验证了下列几个替代方案:工具
然而,我仍是无法放弃Capture GPU Frame by External Build System方案,由于它配置和二次开发成本最低,最合适咱们当前的团队状态。花了好长时间,在Josh的帮助下,终于解决了。post
问题现象: examples/三个项目以External Build System项目形式在Xcode中运行后崩溃,提示信息:测试
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 20, kind: Other, message: "Not a directory" }', libcore/result.rs:1009:5
note: Run with `RUST_BACKTRACE=1` for a backtrace.
ERROR 2018-11-30T07:12:36Z: gfx_backend_metal::command: Command buffer not released properly!
thread 'main' panicked at 'assertion failed: !self.active', src/backend/metal/src/command.rs:55:9
复制代码
结论: External Build Tool Configuration的Directory配置项只用于build过程,对于Rust项目,src/
和target/
是两个不一样的目录,examples/
那些项目要求的编译和执行路径是examples/
,根本缘由是,examples代码用fs::read_to_string()
经过相对路径加载glsl源码文件!此时相对路径前面的完整路径就隐式限制为examples/
。然而,Xcode的播放按钮功能是Build and then run the current scheme,Build阶段配置正常了,问题出在Run阶段,须要传递正确的路径,示例以下图所示。ui
正常的Capture GPU Frame截图。 spa
下面复盘当时的尝试过程,流下了无知的泪水。插件
Main Thread Checker
,从新用Xcode运行 ——> 失败。target/debug/
执行quad
——> 失败,报错和Xcode几乎一致。fs::read_to_string()
——> 问题差很少定位。concat!(env!())
补全gfx-hal/examples的shader源码路径,我实现后提了PR,老外不一样意合并。