*

Renderer::visitRenderQueueで落ちる場合

公開日: : cocos2d-x, iOS

Cocos2d-x v3にしてから描画で突然落ちる場合があり、

原因をたどっていくと、RenderTextureが登録したCustomCommandで

不正アクセスが発生していることがわかった。

CustomCommandのオブジェクトは、RenderTextureなどのクラスが

メンバ変数として所持しているので、描画キューに入っているコマンドが

実行される前に、それを保持するオブジェクトが

削除されると、描画実行時に例外が発生するようだ。

なぜこのような実装になっているのかは、わからないが、

とりあえずCustomCommandが破棄される時に、キューを調べて

コマンドを破棄することで回避しておく。

//CCRenderer.c
void Renderer::removeCommand(cocos2d::RenderCommand *command) {
    static CustomCommand nullCommand;
    if (command->isTransparent()) {
        for (size_t i = 0; i < _transparentRenderGroups.size(); i++) {
            if (_transparentRenderGroups[i] == command) {
                _transparentRenderGroups._set(i, &nullCommand);
            }
        }
    } else {
        for (auto s = _renderGroups.begin(); s != _renderGroups.end(); s++) {
            auto &queue = *s;
            for (size_t i = 0; i < queue.size(); i++) {
                if (queue[i] == command) {
                    queue._set(i, &nullCommand);
                }
            }
        }
    }
}
void RenderQueue::_set(ssize_t index, RenderCommand *command) {
    if(index < static_cast(_queueNegZ.size())) {
        _queueNegZ[index] = command;
        return;
    }
    
    index -= _queueNegZ.size();
    
    if(index < static_cast(_queue0.size())) {
        _queue0[index] = command;
        return;
    }
    
    index -= _queue0.size();
    
    if(index < static_cast(_queuePosZ.size())) {
        _queuePosZ[index] = command;
        return;
    }
    CCASSERT(false, "invalid index");
}
void TransparentRenderQueue::_set(ssize_t index, RenderCommand *command)
{
    _queueCmd[index] = command;
}
//CCRenderCommand.cpp
RenderCommand::~RenderCommand()
{
	Director::getInstance()->getRenderer()->removeCommand(this);
}

Sponsored Link

関連記事

emon.png

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

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

記事を読む

products-ico5.png

cocos2d-x v2.2からv3.3への移行

最近、イーモンの更新でiTunesにバイナリをアップロードしたら、 2015年2月から64

記事を読む

icloud.jpeg

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

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

記事を読む

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

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

記事を読む

df40.png

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

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

記事を読む

ad9a17c91d332c899c5fec4c70e6ef3a.png

[Mac]cocos2dxをeclipseでビルド

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

記事を読む

tmp.png

最近のAppStore審査【iOS8】

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

記事を読む

teach_s.png

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

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

記事を読む

internet_share.png

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

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

記事を読む

cocos2dx_portrait.png

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

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

記事を読む

Sponsored Link

Message

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

Sponsored Link

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

Google+ Google
PAGE TOP ↑