文檔列表見: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,老外不一樣意合併。