*

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

    関連記事

    kii1.png

    KiiCloudでファイルアップロード

    KiiCloudではサーバーと通信が必要な処理は、同期タイプ(Synchronous)と非同タイプ(

    記事を読む

    5017d1a195d95dfed9f60e9fd5d82c13.png

    苦手な英語の発音を真面目に考えてみた

    最近、英語の発音に真面目に取り組んでます。 これまで読み書きが中心で、リスニングやスピーキン

    記事を読む

    Screenshot-2013.11.14-03.18.26.png

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

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

    記事を読む

    internet_share.png

    インターネット共有のステータスバーを表示させない

    私の作っているアプリではcocos2d-xでCCEAGLViewを表示させるUIViewCo

    記事を読む

    checkbox.png

    確認ダイアログ付きチェックボックス(Checkbox)

    図のようなチェックボックスとアラートの組合せを実装しようとした際にiOSには外観などを簡単にカスタ

    記事を読む

    kii1.png

    Kii Cloudオブジェクトエディタ

    現在作成しているゲームで使うMBaasとしてKii Cloudを検討しています。 和製のMBa

    記事を読む

    icloud.jpeg

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

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

    記事を読む

    emon_banner_small.png

    eMon

    eMonのプレイ動画をアップロードしました。 なぞって、つなげて回答するシステムが

    記事を読む

    icloud.jpeg

    iCloudその1:NSMetadataQueryDidUpdateNotification

    iCloudのファイル管理についてよくわかってないので、以下の点について実際に確認しながらまとめてい

    記事を読む

    monster_kolion.png

    【イーモン】11月8日デザフェス出展!

    デザインフェスタに出展します! デザフェス出展者ページ 英語学習アプリ【イーモン】のキャラ

    記事を読む

    Sponsored Link

    Message

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

    Sponsored Link

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

    Google+ Google
    PAGE TOP ↑