*

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

関連記事

clipping.png

GL_SCISSOR_TESTを使ったクリッピング

cocos2dでNodeの描画をクリッピングするにはCCClippingNodeやCGCon

記事を読む

kii1.png

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

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

記事を読む

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

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

記事を読む

df40.png

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

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

記事を読む

emon.png

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

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

記事を読む

nice_slice.png

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

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

記事を読む

emon_banner_small.png

eMon

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

記事を読む

ace.png

イーモン v2.2審査

v2.2を審査に出しました! イーモンxエースクラウンの特別クエストが追加されます!

記事を読む

sola.png

アプリからFormDataを送信する

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

記事を読む

2015_ec1.png

イーモン プレビュー動画

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

記事を読む

Sponsored Link

Message

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

Sponsored Link

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

Google+ Google
PAGE TOP ↑