超高优先级后台工作或QUARTZ精度

时间:2013-12-05 00:05:40

标签: ios objective-c multithreading background thread-priority

我正在尝试为我的内部工作构建iOS应用程序。这个应用程序是简单的midi音序器。 此应用程序现在正在做的就是将简单的midi消息发送到同一台iPad上的“网络会话” - 这个会话的人称之为“Virtual Midi”,抱歉我不知道正确的名称是什么 - 但这不是问题,这部分对我来说工作正常,后台应用程序(如animoog,ThumbJam等)收到此消息很好......

唯一的主要问题是我遇到问题。 当我在LOOP中发送midi音符(大约1 / 8,1 / 16,无论如何)和当应用程序进入后台时(当我按下主页按钮时)我正在其他应用程序中旅行,例如Mail,Safari,或者在animoog中做某事,然后每次都是lug / buggy。,延迟工作。例如“Genome Midi Sequencer” - 在我旅行时没有拖拽并在Mail,Safari或其他应用程序中执行某些操作 - 换句话说即使任何当前应用程序占用CPU中的所有资源 - Genome Midi音序器仍然发送midi消息,没有任何延迟。为什么?

如何构建相同的超高优先级NSThread?,即使我打开其他应用程序并加载CPU,它也能顺利运行?我注意到当“Genome”应用程序发送midi并且我滚动或触摸收件箱字母时,然后邮件应用程序拖拽 - 这是正确的,因为iOS为Genome提供了优先权。 我想要一样。

以下是我发送midi消息的方式:

我在循环中发送Midi音符。所以它听起来像Dm,Dm,Dm,Dm ......每1/8。重要的是他们之间没有间隙/延迟。 但是有些时间延迟了。

  1. 主要优先级为NSThread

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(midiTimerTickTick) object:nil];
            [thread setThreadPriority:1];
            [thread start];
            [thread release];
    
  2. 创建线程的方法

    -(void) midiTimerTickTick{
        uint64_t nextTime = mach_absolute_time();
        uint64_t timerInterval = 1000*1000*8;
        while (true){
            if(mach_absolute_time() >= nextTime)
            {
                //do work
                [self sendMidiMessage]; //Here piano playing
    
                //++
                nextTime+=timerInterval;
            }
        }        
    }
    
  3. 在AppDelegate.m文件中

    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
            [application endBackgroundTask:bgTask]; //Tell the system that we are done with the tasks
            bgTask = UIBackgroundTaskInvalid; //Set the task to be invalid
            //System will be shutting down the app at any point in time now
        }];
    }
    

1 个答案:

答案 0 :(得分:1)

首先,我会查看Michael Tyson撰写的A Tasty Pixel博客,了解一些基本的时间信息。您当前的方法效率非常低,并且会毫无理由地使用许多cpu周期。本质上,CPU在高优先级线程上不断进行比较,这不是一个好主意。

解决问题的最佳方法是深入研究Core Audio。如果您的应用位于前台或后台,这将允许您实时安排样本,但是,它确实需要一些时间来学习。快速完成您想要做的事情的一个好方法是运行由Michael建立的Amazing Audio Engine,但是对于快速启动并运行核心音频有很好的支持。