我想编写一个macOS应用,该应用可以检测您何时通过Disconnect "GPU Name"
Extra菜单断开外部GPU的连接,然后采取一些措施。
我使用什么API来检测GPU的存在?
当GPU断开连接并随后插入时,我会收到通知吗?
答案 0 :(得分:6)
注册外部GPU通知
调用
MTLCopyAllDevicesWithObserver
函数以获取列表 可用于系统的所有金属设备中,并注册 每当此列表更改(或可能由于更改而更改)时调用的观察者 到安全的断开连接请求)。id <NSObject> deviceObserver = nil; NSArray<id<MTLDevice>> *deviceList = nil; deviceList = MTLCopyAllDevicesWithObserver(&deviceObserver, ^(id<MTLDevice> device, MTLDeviceNotificationName name) { [self handleExternalGPUEventsForDevice:device notification:name]; }); _deviceObserver = deviceObserver; _deviceList = deviceList;
要注销观察者的注册,请致电
MTLRemoveDeviceObserver
功能。响应外部GPU通知
Metal将这些外部GPU事件通知您的应用:
MTLDeviceWasAddedNotification
。当将外部GPU添加到系统时,Metal将发布此通知。评估 更新了设备列表,并考虑使用新添加的设备。
MTLDeviceRemovalRequestedNotification
。当用户启动安全断开连接请求时,Metal将发布此通知。 外部GPU。您的应用大约需要一秒钟的时间来迁移工作 关闭设备并删除对其的所有引用。如果您的应用无法 这样做,macOS会通知用户您的应用阻止了安全 断开请求。
MTLDeviceWasRemovedNotification
。当系统中移除了外部GPU时,Metal将发布此通知 应用仍然具有对该设备的引用。如果用户安全 断开了外部GPU的连接,Metal在发布此通知后 发布MTLDeviceRemovalRequestedNotification
通知。如果 用户意外断开了外部GPU的连接,Metal发布了此信息 通知而无需先发布MTLDeviceRemovalRequestedNotification
通知。之后 移除了外部GPU,为该设备排队的所有命令缓冲区都是 出现错误,并且引用了 设备因错误而失败。设置一种方法来响应通知,并传递此方法 到
MTLCopyAllDevicesWithObserver
的handler参数 功能。- (void)handleExternalGPUEventsForDevice:(id<MTLDevice>)device notification:(MTLDeviceNotificationName)notification { if (notification == MTLDeviceWasAddedNotification) { } else if (notification == MTLDeviceRemovalRequestedNotification) { } else if (notification == MTLDeviceWasRemovedNotification) { } }