文档列表见:Rust 移动端跨平台复杂图形渲染项目开发系列总结(目录)

根据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等可执行文件是正常的。

客观地说,隔了一段时间没用Xcode,我不熟悉它的配置了,然后考虑并验证了下列几个替代方案:

  • Rust暴露C接口接入macOS项目。给gfx/examples填写FFI接口,让C/C++调用Rust实现的功能。在绘制过程中正常使用Capture GPU Frame。
  • 利用Metal MTLCommandBuffer addCompletedHandler接口添加执行完成的日志。缺点是,只能验证MTLCommandBuffer确实被GPU执行完,没法查看渲染结果。用Compute Shader做数值计算场合用这个方案倒是可以接受。
  • 类似上一方案,不输出日志,改为读取MTLCommandBuffer目标纹理的像素值,通过CIImage生成图像,通过Xcode插件进行查看。缺点,在线调试Shader没Capture GPU Frame方便。

然而,我还是没法放弃Capture GPU Frame by External Build System方案,因为它配置和二次开发成本最低,最合适我们当前的团队状态。花了好长时间,在Josh的帮助下,终于解决了。

问题现象: 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阶段,需要传递正确的路径,示例如下图所示。

正常的Capture GPU Frame截图。

下面复盘当时的尝试过程,流下了无知的泪水。

  • 同一个电脑(10.14 + Xcode 9.4.1 (9F2000))上依次尝试examples/三个demo项目。运行失败,下面简写成失败。
  • 换两台电脑(10.13.5 + Xcode 9.4.1 (9F2000)、10.13.5 + Xcode 10 )尝试上一步骤 ——> 失败。
  • 重置代码库,获取最新代码,重新用Xcode运行 ——> 失败。
  • 去掉Xcode Main Thread Checker,重新用Xcode运行 ——> 失败。
  • 修改Rust编译工具链,依次用nightly、stable,清掉编译缓存,重新编译,重新用Xcode运行 ——> 失败。
  • 升级Rust编译工具链,重复上一步骤 ——> 失败。
  • 反复修改External Build Tool Configuration的三个配置项,确认它们的值都正确 ——> 失败。
  • 修改Xcode工程位置,重复前面所有步骤 ——> 失败。
  • 修改当前Scheme/Run/Debug/Info的所有配置项,重复前面所有步骤 ——> 失败。
  • 搜索更多Xcode运行Rust项目资料并逐一修改,重复前面所有步骤 ——> 失败。
  • 和别人讨论解决方案 ——> 失败,开始接近问题本质原因。感谢齿轮哥。
  • 在Terminal切换到target/debug/执行quad ——> 失败,报错和Xcode几乎一致。
  • 查看源码,找到fs::read_to_string() ——> 问题差不多定位。
  • 修改源码加上完整文件路径 ——> Xcode运行不崩溃,但是Capture GPU Frame不可用,问题完全定位。
  • 换成MacBook Pro重复上一步骤 ——> 正常。推断:iMac (Retina 5K, 27-inch, Late 2015)在10.14下驱动有问题。
  • 最终Josh给了更好的解决方案(见结论部分),无需修改源码。
  • 齿轮哥建议使用concat!(env!())补全gfx-hal/examples的shader源码路径,我实现后提了PR,老外不同意合并。

使用Xcode External Build System实现Rust 项目 Capture GPU Frame 在线调试 Metal 2018.12.18相关推荐

  1. Legacy Build System

    升级XCode10后报以下报错: Showing All Messages ? Multiple commands produce '/Users/saj/Library/Developer/Xcod ...

  2. xcode编译错误:The Legacy Build System will be removed in a future release.

    xcode报错 The Legacy Build System will be removed in a future release. You can configure the selected ...

  3. Mastering Android NDK Build System - Part 1: Techniques with ndk-build

    This article is not a "Hello world!"-type tutorial for NDK. Although I will still provide ...

  4. Build settings from command line: SDKROOT = iphoneos12.1 note: Using new build system note: Plannin

    HBuilder ios云端打包报错如下: 亲测有效(仅针对我),前方巨坑~~~~~~~ 在自动生成图标这一栏,选择自己需要的png图片(官方建议是1024X1024,我的是256x256的也行): ...

  5. FBS(fman build system)打包

    FBS(fman build system)打包 适用于 Pyside2 和 PyQt5 项目( PySide6 和 PyQt6 需付费) ​ fbs 是一个基于 Python 的构建工具,用于使用 ...

  6. rust墙壁升级点什么_分享:如何在阅读Rust项目源码中学习

    今天做了一个Substrate相关的小分享,公开出来. 因为我平时也比较忙,昨天才选定了本次分享的主题,准备比较仓促,细节可能不是很充足,但分享的目的也是给大家提供一个学习的思路,更多的细节大家可以在 ...

  7. ST3新建py2和py3的build system

    win7上同时装了py2和py3,在ST3中执行需要分别新建各自的build system:Tools->Build System->New Build System py2: {&quo ...

  8. 错误“checking build system type... config.sub: missing argument”的解决办法

    背景:交叉编译avahi库时遇到错误"checking build system type... config.sub: missing argument" ,"conf ...

  9. 批处理脚本实现Aida64测试工具的System Stability Test项目自动测试

    批处理脚本实现Aida64测试工具的System Stability Test项目自动测试 自动测试脚本编写背景: 因为最近要使用Aida64测试工具的System Stability Test项目测 ...

最新文章

  1. AAAI 2021 | 上海交大提出基于有监督解耦的信息瓶颈算法
  2. python yield和yieldfrom,Python:对于yield与yield from 的理解
  3. 2021辽宁高考艺考成绩查询系统入口,2019年辽宁省艺考统考成绩查询官方入口
  4. 清理linux 服务器的命令行,使用Linux上的Magic SysRq键修复冻结的X服务器,清理重新启动并运行其他低级命令 | MOS86...
  5. node.js——麻将算法(二)赖子玩法
  6. FastDFS(提升磁盘IO性能的几个技巧 FastDFS 5.04之IO读事件)
  7. 玩转大数据可视化,推荐几个必学的工具
  8. [神奇的问题啊,GetProcAddress一个不存在的API时,返回非空值,且指向另一个API]谜团解开,错不在GetProcAddress...
  9. python入门先学什么-C和Python我该先学什么?
  10. 再谈哈希:Hash中的冲突消解机制以及拉链法
  11. Intellij IDEA 备忘录
  12. python 2.7导入arcpy_导入 ArcPy
  13. 很好用的查看PE文件的小工具---LordPE Deluxe 1.4 汉化版
  14. 关于arcgis server 发布地图的时候报错“Packaging succeeded but publishing failed“问题解决
  15. 论文阅读-社交媒体上的谣言检测:数据集、方法和机会
  16. 【2D多目标跟踪】Quasi-Dense Similarity Learning for Multiple Object Tracking阅读笔记
  17. 分类指标计算 Precision、Recall、F-score、TPR、FPR、TNR、FNR、AUC、Accuracy
  18. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之 Countvectors and Spelling Errors
  19. 【自用】Mybatis的学习笔记(第一天)
  20. 精益创业实战 - 第14章 评估产品和市场的匹配程度

热门文章

  1. 【必懂概念】一文详解什么是空洞卷积?
  2. SAP MM VL32N和MIGO对内向交货单做收货,都会更新其‘总体货物移动状态‘
  3. SAP RETAIL 特征参数文件(Characteristic Profile) I
  4. 天上掉馅饼,我被砸中了!
  5. 改变2020年及未来的8大人工智能趋势
  6. 订单少落地难:被误解的人工智能
  7. 大咖来信|浪潮刘军:AI计算将成为“新基建”核心支撑之一
  8. 人工智能技术改变传统驾驶行为
  9. 将深度学习技术应用到实际项目
  10. 写给非技术人员的机器学习指南