CAMetalDisplayLink在macOS独立线程无法工作的问题排查
线程RunLoop未正确启动
CAMetalDisplayLink依赖线程的RunLoop分发更新事件。如果渲染线程仅创建但未启动RunLoop,或RunLoop配置不当(比如未添加合适的运行模式),就无法收到CAMetalDisplayLinkUpdate回调。检查渲染线程入口代码,确保调用了[[NSRunLoop currentRunLoop] run]或CFRunLoopRun(),且RunLoop处于持续运行状态,避免过早退出。CAMetalDisplayLink的RunLoop Mode不匹配
初始化CAMetalDisplayLink时,若指定错误的RunLoop Mode,或未将其添加到渲染线程的RunLoop中,会导致事件无法分发。确认代码中是否调用了-[CAMetalDisplayLink addToRunLoop:forMode:],且传入的RunLoop是渲染线程的currentRunLoop,建议使用NSDefaultRunLoopMode或NSRunLoopCommonModes,避免线程处于其他模式时无法接收事件。视图/Metal层关联异常
如果CAMetalDisplayLink关联的CAMetalLayer未正确绑定到窗口视图,或视图未完成初始化就创建了DisplayLink,会导致DisplayLink无法正常触发更新。检查渲染线程中获取CAMetalLayer的时机,确保视图已完成加载(比如在viewDidLoad之后初始化DisplayLink,或在渲染线程中等待视图就绪)。线程优先级或调度问题
macOS的线程调度受优先级控制,若渲染线程优先级过低,可能导致DisplayLink回调无法被及时调度,甚至完全无法触发。尝试将渲染线程优先级设为较高级别,比如用[NSThread setThreadPriority:1.0]或pthread_setschedparam调整调度参数,确保线程能被系统及时调度。DisplayLink未正确激活
务必调用-[CAMetalDisplayLink setPaused:NO]激活DisplayLink。如果创建后一直处于暂停状态,自然不会产生更新回调。检查代码中是否在初始化完成后正确取消暂停,且无其他地方意外将其设为暂停。
内容的提问来源于stack exchange,提问作者prelude38

