先说结论,能,但是 …… 别~ ¯_(ツ)_/¯
// 至少对于 17.5 版本,别~
前言
先说 PDG 是什么,这家伙全名 Procedural Dependency Graph,是 Houdini 自己捣腾出来的一个流程管理工具,神通广大,常听说的用法有批量处理 3D 资产以及批量生成 3D 资产,得益于它强大的流程控制能力、分布式调度能力以及 Houdini 自带的流程化 3D 建模、简化、烘焙、导出、渲染等能力,这货对大规模模型和场景的处理真的是一绝。
然而,我怎么会拿他做正事呢,早在 Houdini 宣传 PDG 概念的时候,我就觉得这货和 C/C++ 的构建系统挺像:处理依赖关系,并行编译生成中间结果,完了再汇总链接生成最终结果,这些操作在 PDG 中似乎都有对应概念。
折腾
试试看吧:拿来 Lua 做测试,先列举源码,然后添加 src
和 obj
属性,然后编译:
![f7dc8ed584dfb305c0ab4a35e86d51bd.png](https://i-blog.csdnimg.cn/blog_migrate/5c2f21d4d832eac24548b623748fa8d2.png)
其中属性是这样的:
![2c8efcede0ef57a4f3b667c4f3d805f1.png](https://i-blog.csdnimg.cn/blog_migrate/81cd879abd67c9b10bc7c2a50692b145.png)
编译是这样的:
![7ea2109bc6b370237e2dd7c684ba3432.png](https://i-blog.csdnimg.cn/blog_migrate/1d440236f2ba77891d8a3c3ee8686e1a.png)
得到:
![31c9d25547a2d01a521522327f664e8c.gif](https://i-blog.csdnimg.cn/blog_migrate/636e62ed2b9f4f3dff3e6c5da95d0b02.gif)
与此同时:
![607c4fd451f76f2de96e38e5599a82dd.gif](https://i-blog.csdnimg.cn/blog_migrate/714d5b1841b8e62f783e28283a8dbed5.gif)
so far so good
然而链接的时候麻烦来了,Lua 源码里面带了两份 main,一个用于解释器 lua,一个用于编译器 luac,那么如何分开链接这两个可执行文件呢
—— 祭出 wedge 吧
wedge 一个排除项:
![b2ecdeb815b95203870b9993def4ca93.png](https://i-blog.csdnimg.cn/blog_migrate/2454eb78b94d4a3026b344f4f71cfdb8.png)
然后根据这个排除项选择对应的可执行文件名:
![2ad902a9a9f482fb12206f38d5b71dce.png](https://i-blog.csdnimg.cn/blog_migrate/2e84da379fb480d04e28d9b45bd148d0.png)
把该排除的文件排除掉:
![87ab973a78476431fcab70e7d7ba04cb.png](https://i-blog.csdnimg.cn/blog_migrate/6110055afdfbb0d8d32cb8b6d4475e45.png)
然后再根据 exe 名称做个 partition:
![b307b0243ac4679377ecd5c6b9e03dd2.gif](https://i-blog.csdnimg.cn/blog_migrate/673ee20a8887ae8f17534f99c9c66263.gif)
问题又来了,我拿到了这一堆 obj 文件列表:
![00089e8552e680f2b8acfb89ae537b72.png](https://i-blog.csdnimg.cn/blog_migrate/8969c038c43caeb5467c7b9983c6e529.jpeg)
怎么把它们转换成一段空格分隔的字符串用于传给命令行呢,答案居然是写一段 python ...
work_item.data.setString('objlist',' '.join(resultData(parent_item, 'file', True, True)), 0)
当然到最后链接的时候倒是没啥事了:
![5b556fcc43cfe1d8ad6a5ca2773e1707.png](https://i-blog.csdnimg.cn/blog_migrate/61574fe54ed5c585e65a8b77d4c4fd89.png)
cook -> 得到两个宝贝 exe:
![2f7e65a20e7825f740553c8f8664acdc.png](https://i-blog.csdnimg.cn/blog_migrate/361070314b8fbabdd0a1fe2600d064e5.png)
随手测一下,应该没啥问题
全部流程如下:
![0058cab7e4687413f27507b3be28ae2c.png](https://i-blog.csdnimg.cn/blog_migrate/0b56e88431a76ba88273d89dc98d64f4.png)
感受
- PDG 的任务流程的描述的确是很直观 +1
- PDG 的任务调度很厉害 +1
touch lua.c
,再重新 cook,能够自动检测出 lua.c 有变化,只处理lua.o
的编译流程以及lua.exe
的链接流程 +1- 用 wedge 调节编译参数或者做自动测试似乎很合适 +1
- Houdini 关掉重开,所有节点都是 dirty 状态了,不合适啊 -1
- Houdini 别的地方都可以用
==
做字符串比较,唯独这儿得要用strcmp
,这什么毛病 -1 - 输入文件之间的依赖关系难以表达 -1
—— 用小零件拼大模型的时候也会面临这样的依赖关系吧! - 节点功能不够完善,离不开 python -1
总分: 0
所以总的来说,PDG 距离一个合格的 C/C++ 构建工具还是有点距离的
加油啊
// 滑稽保命