gpt4 book ai didi

ios - 如何在 Objective-C 中节流 CoreMIDI

转载 作者:行者123 更新时间:2023-11-29 13:43:07 24 4
gpt4 key购买 nike

我在 iOS 上的 CoreMIDI 连接显然足够快,可以处理任何碰到它的东西……如果我只是做一些简单的对象创建和 NSLog。在 UI 中,我没有时间处理所有进来的东西。UI 会崩溃,或者完成处理太晚了。

但是,我需要对 CoreMIDI 输入进行真正的处理和 UI 显示。我想要的是每隔 1 毫秒或 2 毫秒处理一次最新消息。我一直在使用一个集合来执行此操作,该集合每 1 毫秒被计时器触发的方法清空一次 (processFromServerAsync)。一个问题是有些消息可能会漏掉,我想,如果我抓取并替换:

NSDictionary *queueCopy = [self.queue copy];
// here the dictionary could get messages not in the queue copy!
self.queue = [NSMutableDictionary dictionary];

我意识到我可以通过与锁同步来处理这个问题,这很容易搞砸:

-(NSMutableDictionary *)messageQueue {
@synchronized(self) {
if (!messageQueue_)
self.messageQueue = [NSMutableDictionary dictionary];
return messageQueue_;
}
}

-(NSDictionary*)clearMessageQueueAndReturnCopy {
@synchronized(self) {
if (!messageQueue_)
return [NSDictionary dictionary];
NSDictionary *retVal = [messageQueue_ copy];
self.messageQueue = [NSMutableDictionary dictionary];
return retVal;
}
}

但是,我什至不确定我是否以正确的方式处理了这个问题。节流通常是如何完成的(即使在 Obj-C 之外)?我肯定无法在 UI 或程序中处理所有这些消息。

最佳答案

有一些行之有效的模式可以限制传入数据流。这在金融领域经常出现,您可能有一个数据馈送每秒向系统抛出 10 万条消息。

您使用滑动窗口机制来丢弃冗余消息,同时确保客户端拥有最新的数据副本。您将窗口设置为一段时间(几毫秒),然后为每个数据流(意味着特定的 CC、midi 音符等)设置一个队列。当第一条消息进入时,您启动一​​个全局计时器。您发送该消息立即给客户。如果在窗口期间有其他任何东西进来,你将它推到它的队列中。队列只有一个条目 - 最新值 - 因此您可以在每次后续更新时覆盖排队的值。当计时器滴答作响(窗口结束)时,您将最新消息发送给客户端。然后,您在收到下一条消息后立即将其发送出去,启动一个新窗口并重复。这在淹没客户端和避免将更新间隔混叠到计时器窗口之间提供了合理的平衡。对于 1-2 毫秒的间隔,混叠问题不大,因此更粗略的严格计时器方法可能适合您。

关键是要确保每个数据流都有单独的窗口。你不能冒险覆盖或忽略,比如说,一个音符,因为控制更改进来了。一个计时器,每个 Midi 消息号一个单条目队列。

关于ios - 如何在 Objective-C 中节流 CoreMIDI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8524765/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com