*

cocos2dxでマルチスレッド

公開日: : cocos2d-x, iOS

写真 2015 02 25 13 49 47
写真 2015 02 25 14 14 13

cocos2dxでマルチスレッドをいじったときのメモ

あらかじめautoreleaseに依存しないコードにすること

autoreleaseによるオブジェクトの破棄が描画毎にメインスレッド処理されるので、
他のスレッドでautoreleaseの呼び出しはNG。
例えばバックグラウンドでダウンロードするcocos2d::HttpReuqestなどはnewを使うようになっている。

排他制御

std::mutexとstd:conditionを使う。


std::mutex mutex;
std:condition condition;

MyClass::addEvent() {
  if (初回起動) {
    //イベントループのスレッドを起動する
    std::unique_lock scope_lock(mutex)
    auto thread = std::thread(std::bind(&MyClass::eventLoop, this));
    thread.detach();
    //eventLoopがイベント待ち状態になるのを確認する
    auto ret = condition.wait_for(scope_lock, std::chrono::seconds(3));
    CCASSERT(ret == std::cv_status::timeout, "condition wait is timeout!");
  }

  mutex.lock();
  //イベント追加
  ....
  mutex.unlock();
  condition.notify_one();
}

MyClass:eventLoop() {
  while (1) {
    ....
    //イベント待ちに入る
    {
      std::unique_lock scope_lock(mutex);
      condition.notify_one();
      condition.wait(scope_lock);
    }
  }
}

pthread

基本はstd::threadを使えば良さそう。

優先度の変更したい場合は、直接pthreadのpthread_getschedparamをいじる

スレッド優先度(priority)

デフォルトのpriorityは31で設定できる優先度0(最低)〜127(最高)の範囲。

自作のガウスフィルタ処理を4つ別々のスレッドで実行結果

すべてデフォルトの優先度の場合:
 thread1: 3.9s
 thread2: 2.7s
 thread3: 2.8s
 thread4: 2.8s

優先度を変えた場合:
 priority 0: 7.1s
 priority 31: 5.0s
 priority 60: 1.7s
 priority 127: 1.7s

スケジューリングポリシー(policy)

デフォルトのpolicyはSCHED_OTHERでSCHED_FIFOとSCHED_RRが設定できる。

ちゃんとうごいてないような?

優先度を変更するサンプルコード


bool setPriority(pthread_t thread, int priority) {
    int policy;
    struct sched_param param;
    int ret = pthread_getschedparam(thread, &policy, &param);
    if (ret == 0) {
        param.sched_priority = priority;
        ret = pthread_setschedparam(thread, policy, &param);
        CCASSERT(ret == 0, "failed set schedparam!error:%d", ret);
    } else {
        CCASSERT(ret == 0, "failed get schedparam!error:%d", ret);
    }
	return ret == 0;
}

参考

  • Linux Programmer’s Manual – PTHREAD_SETSCHEDPARAM
  • SCHED

  • Sponsored Link

    関連記事

    Screenshot-2013.11.14-03.18.26.png

    Cocos2d-xでGaussianBlur(ぼかしフィルター)

    cocos2d-xにGaussianBlurが見つけられず、ググっていたらサンプルをみつけまし

    記事を読む

    nice_slice.png

    9スライスによる画像の拡大(9 Slice Scaling Image)

    画像を拡大する方法には、引き伸す、ピクセルを繰り返す、パターンを繰り返すなどの方法があります。 U

    記事を読む

    statusbar2.png

    ステータスバーとナビゲーションバーを含まない領域を取得する

    iOS7からUIViewControllerのview.boundsはステータスバーやナビゲーシ

    記事を読む

    teach_s.png

    [eMon] English Monstersレビュー申請中

    先日、新しいiOSアプリを審査に出しました。 English Monsters(略してeM

    記事を読む

    cocos2dx_portrait.png

    Macでcocos2dxをiOSとAndroid向けにビルド

    前回Androidの開発環境をセットアップでAndroidの開発環境が準備をしました。 今

    記事を読む

    iOS7向けアプリアイコンを一括変換

    iOSがiOS7にバージョンアップされ、アプリに必要なアイコン画像のサイズがさらに増えました(

    記事を読む

    icloud.jpeg

    アプリからiCloudを使うための準備

    iOSではアプリがiCloud上にデータを保存するための仕組みが提供されている。 iCloudは

    記事を読む

    ace.png

    イーモンxエースクラウン「Aの塔」決定

    あの英和辞典エースクラウンがイーモンに登場します! エースクラウンで取り上げられている会

    記事を読む

    tmp.png

    最近のAppStore審査【iOS8】

    紹介動画でリジェクト!?(App Preview) AppStoreのアプリ紹介にに機能や

    記事を読む

    emon.png

    【イーモン】v1.5リリース

    やっとv1.5リリースできました。 継続的にプレイを続けてもらえるように ゲームのバランス

    記事を読む

    Sponsored Link

    Message

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    Sponsored Link

    • 発音辞書イーモン
    • English Monsters
    • sLog(時間管理アプリ)
    • 生粋のC++プログラマーです。 最近は、Objective-Cやxcode、cocos2d-xなどを学びながらiPhoneアプリを開発しています。

    Google+ Google
    PAGE TOP ↑