5

私は現在、複雑なライトのインストールを制御するのに役立つプログラムを書いています。プログラムにプリセットを開始するように指示すると、アプリには 3 つのオプションがあります (プリセットの種類によって異なります)。

1) ライトは 1 つの位置に移動します (したがって、プリセットの開始時に送信されるデータのグループは 1 つだけです) 2) ライトは数式に従います (例: 滑らかな円を作るためのタイマー付き正弦波) 3) ライトは次の流れに応答しますデータ (ex midi コントローラー)

そこで、私が AppBrain と呼ぶオブジェクトを使用することにしました。このオブジェクトは、コントローラーとテンプレートからデータを受け取り、処理されたデータをライトに送信することもできます。

現在、私は非ネイティブ プログラミングの出身であり、多くの処理、イベント、およびタイミングを操作することに関して、信頼の問題を抱えています。Cocoa のロジックを 100% 理解することに関するトラブルも同様です。

これが実際の質問の始まりです、申し訳ありません

私がやりたいことは、プリセットをロードするときに、それを解析してタイマー/データ受信イベントを準備することです。これにより、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を書いていると思います。それを行う 1 つの方法は、ブロックをに格納することです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 に答える