*

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

    関連記事

    nice_slice.png

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

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

    記事を読む

    statusbar2.png

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

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

    記事を読む

    df40.png

    【イーモン】デザフェス用ミニゲーム

    2014年11月8日のデザインフェスタ用に作ったミニゲームです! シルエットまたは単語の意味が

    記事を読む

    icloud.jpeg

    iCloudその1:NSMetadataQueryDidUpdateNotification

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

    記事を読む

    kii1.png

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

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

    記事を読む

    2015_ec1.png

    イーモン プレビュー動画

    動画2作目、お正月っぽく

    記事を読む

    5017d1a195d95dfed9f60e9fd5d82c13.png

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

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

    記事を読む

    ad9a17c91d332c899c5fec4c70e6ef3a.png

    [Mac]cocos2dxをeclipseでビルド

    Androidの開発環境をセットアップでEclipse ADTをインストールしました。 Ma

    記事を読む

    teach_s.png

    English Monsters1.0がAppStoreの審査通過

    English Monsterが遂にAppStoreで公開されました。 一度AppStor

    記事を読む

    sola.png

    アプリからFormDataを送信する

    HTMLのformタグを使うとHTTPリクエストにkey=valueの形式で任意のデータを付加して送

    記事を読む

    Sponsored Link

    Message

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

    Sponsored Link

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

    Google+ Google
    PAGE TOP ↑