5

我目前正在编写一个程序来帮助我控制复杂的灯光装置。这个想法是我告诉程序启动一个预设,然后应用程序有三个选项(取决于预设类型)

1) 灯转到一个位置(因此在预设开始时只发送一组数据) 2) 灯遵循数学方程(例如:带计时器的窦形使圆平滑) 3) 灯响应于流动数据(前 midi 控制器)

所以我决定使用我称为 AppBrain 的对象,它从控制器和模板接收数据,但也能够将处理后的数据发送到灯光。

现在,我来自非本地编程,在处理大量处理、事件和时间方面我有点信任问题;以及理解 100% Cocoa 逻辑的麻烦。

这是实际问题开始的地方,对不起

我想要做的是,当我加载预设时,我对其进行解析以准备计时器/数据接收事件,这样它就不必通过每个选项每秒 100 次 100 个灯。

为了更深入地解释,这就是我在 Javascript 中的做法(当然是蹩脚的伪代码)

var lightsFunctions = {};

function prepareTemplate(theTemplate){
    //Let's assume here the template is just an array, and I won't show all the processing

    switch(theTemplate.typeOfTemplate){
        case "simpledata":
            sendAllDataTooLights(); // Simple here
            break;

        case "periodic":


               for(light in theTemplate.lights){

                    switch(light.typeOfEquation){
                        case "sin":
                            lightsFunctions[light.id] = doTheSinus; // doTheSinus being an existing function
                            break;

                        case "cos":

                            ...
                     }
                }


               function onFrame(){
                    for(light in lightsFunctions){
                        lightsFunctions[light]();
                    }
               }

                var theTimer = setTimeout(onFrame, theTemplate.delay);

                break;

            case "controller":

                //do the same pre-processing without the timer, to know which function to execute for which light

                break;

    }


    }

}

所以,我的想法是将我需要的处理函数存储在一个 NSArray 中,所以我不需要在每一帧上测试类型并浪费一些时间/CPU。

我不知道我是否清楚,或者我的想法是否可行/好方法。我主要在寻找算法的想法,如果你有一些代码可以指导我朝着好的方向发展......(我知道 PerformSelector,但我不知道它是否最适合这种情况。

谢谢;

我_

4

1 回答 1

4

首先,不要花时间优化你不知道是性能问题的东西。这种类型的 100 次迭代在原生世界中不算什么,即使在较弱的移动 CPU 上也是如此。

现在,你的问题。我认为您正在编写某种配置/ DSL 来指定灯光控制序列。一种方法是将存储在您的NSArray. 块相当于 JavaScript 中的函数对象。例如:

typedef void (^LightFunction)(void);

- (NSArray*) parseProgram ... {
    NSMutableArray* result = [NSMutableArray array];
    if(...) {
        LightFunction simpledata = ^{ sendDataToLights(); };
        [result addObject:simpleData];
    } else if(...) {
        Light* light = [self getSomeLight:...];
        LightFunction periodic = ^{
            // Note how you can access the local scope of the outside function.
            // Make sure you use automatic reference counting for this.
            [light doSomethingWithParam:someParam];
        };
        [result addObject:periodic];
    }
    return result;
}
...
NSArray* program = [self parseProgram:...];

// To run your program
for(LightFunction func in program) {
    func();
}
于 2013-05-27T20:02:04.023 回答