[cocos2dx] 非同期処理するやつ作ったよ!

 ご無沙汰しております。寒さが本格的になってきました。が、東北出身の僕にとってはこのくらいの寒さはどうってことありません(暖房はフルパワー)。さて、本日はあの雑多な「俺々」ファミリーに新しい仲間を加えたので、その紹介記事を書こうと思います。

俺々とはなにか

 これです。俺がゲームを作るときに得するライブラリです。他の人は知りませんが何かの役に立つかもしれないので公開しています。

新たな仲間「AsyncTask」

 早速ですが新たな仲間をご紹介。その名も「AsyncTask」です(安直)。読んで字の如く、非同期で何か処理を行うためのクラスです。セーブデータを保存するときに暗号化をかけるとそこそこ重くなりそうだったので作りました。実装はこんな感じです。

 えらいシンプルです。やってることもシンプルで、cocos2dxのスケジューラに完了フラグを監視する処理を追加して、ワーカースレッドで処理が完了したらそのフラグを立てる。それだけです。使い方は俺々のサンプルコードにも載っけてますが、以下のとおり。

AsyncTask task(
    // 第一引数が処理する内容
    [](int arg) {
        // ... いろいろやる ...
        return true; // 戻り値はbool型。コールバック関数の引数に渡される。
    },

    // 第二引数がコールバック関数。メインスレッドで呼ばれる
    [] (const bool result) {
        // ... 結果見たり色々 ...
    },

    // 第三引数以降は、第一引数に指定した関数に渡す引数の値
    1024
);

 これでおっけー。

 ただし、肝心のcocos2dx自体がマルチスレッド非対応なので、例えばRefを継承したクラスにアクセスしたりすると参照カウントがデータ競合しちゃうかも。そこら辺は注意して使ってください。もとの目的はセーブデータの保存なんです。あ、あとスレッド自体はpthread使ってるっぽい(もちろん環境による)のでリンクするときに指定してあげないとリンクできないかも。

 有効活用してくださいな。

2 件のコメント :

  1. C++初心者にはなかなかハードルが高いのですがcocos2d-xを使用する上でこのレベルまでは把握しておかないとやはり厳しいでしょうか…
    decltype、declval、bindの辺りでつまずきそうです

    返信削除
  2. そんなことはないですよ。
    decltype, declval, bindとかその辺はあくまでC++の"機能"ですから、
    これ自体が簡単とか難しい、ということはないと思います。
    必要がなければ使わない、必要になったら使う、で全く問題はないです。
    慣れるまでは色々躓くと思いますが、ゲーム作りがんばってくださいね。

    返信削除