刚在敷铜的时候卡死了,任务管理器里Altium Designer进程CPU占着100%,内存跑到12G,等了几分钟才缓过来,查了一下发现是多线程调度里有个重绘队列堆积的问题,顺便把整个调度机制捋了一遍。
Altium Designer的底层是典型的Client-Server架构,Client模块负责解析用户操作并把它翻译成一个“进程”,然后把这个进程委派给对应的Server去执行。进程标识符用“服务器名:进程名”的格式,比如Sch:ZoomIn是原理图编辑器提供的放大进程,PCB:PlaceVia是PCB编辑器提供的放via进程。每个文档上可以叠多层进程,每启动一个进程深度加一,执行完深度减一,深度为零才算空闲,这个深度管理由IProcessControl接口控制。
AD18之后切到64位架构,多线程才真正用起来。多线程用在那些可以并行计算的任务上,比如铺铜、Gerber生成、DRC检查、项目编译、网络构建,这些不需要按顺序算的东西,AD会把它们拆到不同核心上跑。但布线、拖拽这种交互式操作还是单线程的,你拖一个器件的时候AD只用一个核心,所以拖大器件还是卡。铺铜铺一个GND多边形,AD会把多边形拆成多个区域并行填充,多核CPU在这里吃满才有效果。
DRC检查的并行化有个坑,Online DRC开着的时候每走一根线都触发一次规则检查,多线程频繁创建销毁反而拖慢响应。实际有效的做法是在走线阶段把Online DRC切到All Off,走完一个模块再手动跑一次Batch DRC,批量检查比在线检查快很多,而且不会在走线过程中卡顿。同理,大型工程编译的时候AD会并行处理多个文档的编译,内存不够的话反而会触发频繁的GC,16G是底线,32G才舒服。
Polygon Pour Repour All那个UI冻结的问题,任务管理器里AD进程CPU占100%,其实是重绘间隔设太密了。默认50ms重绘一次,高密度GND铺铜的场景改成200ms,UI响应会好很多。Preferences→PCB Editor→Display→Redraw Interval调大,铺铜的时候界面不再一卡一卡的。

Gerber生成的多线程加速效果跟设计规模相关,小设计感觉不出来,大板子几个G的Gerber数据生成时间能从十几分钟压到几分钟。ODB++导出也一样走多线程,跟Gerber共用一套并行框架。项目编译也是多线程的,原理图工程里文档多了编译时间会明显缩短,但前提是每个文档的编译互不依赖,有依赖关系的文档还是得串行处理。
内存这边,64位架构突破了32位的4G限制,但内存不是无限涨就好,AD内存占用到10G以上就开始出现卡顿了。Preferences→System→Network Activity里面把不必要的联网检查关掉,只保留Altium Portal、Data Management Server和License Server。后台的自动更新检测也关掉,AD会在空闲的时候偷偷下载更新包,占着磁盘和网络。历史备份文件夹清一下,工程目录下的History文件夹会随时间累积,大的能到几G。
脚本执行跟主进程是分开的,通过ScriptingSystem:RunScript进程启动,脚本跑在独立的线程里,主界面不卡。但脚本里如果调了COM对象去遍历设计数据库,会把主线程的数据锁住,反而卡得更厉害。批量操作的时候用DelphiScript直接操作服务器接口,不走COM,效率高一个量级。脚本可以通过进程启动器绑定到菜单或者工具栏上,走一遍绑定流程以后一键执行,不用每次File→Run Script。
硬件配置这块,16G内存打底,i7或者同等级CPU,SSD必须的,显卡要支持DirectX 11以上。多显示器对AD的多线程没影响,但3D视图打开的时候GPU渲染线程跟计算线程抢资源,3D视图不用的时候关掉能省不少CPU。电源计划改成高性能,笔记本上省电模式会把CPU频率压下来,多线程任务的加速效果直接打半折。
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删