0

最新のアプリで深刻な問題が発生しています!!

私は OpenGLES 1 を使用してモデルを画面に描画し、常に更新しています。その後、スクリーンショットを撮って好きなように共有できます。その後、アプリの開始画面に戻って最初からやり直すことができます。

アプリが最初に実行されたときはすべて正常に動作しているようで、クラッシュはありません。しかし、一度実行してからもう一度実行しようとすると、OpenGLES 描画ビューが要素の描画を開始する必要があるとすぐに、私の行EXC_BAD_ACCESSにエラーが発生します。glDrawElements

今のところこのエラーを修正するのをあきらめました。過去 2 週間は運がありませんでした!!

アプリがバックグラウンドで実行されないように、plist にプロパティを設定しました。一度実行すると、終了して再度ロードすると、完全に正常に実行されます。

だから私が思っていたのは、機能の機能を何とかエミュレートできるかどうかですが、exit(0)実際にアプリを終了する必要はありませんか?

つまり、ユーザーが共有ページからホーム ページに戻るたびに、アプリはexitコードを実行し、アプリは最初からやり直すことになります。

これは、少なくとも私の頭の中では、状況に対処するのに最適な方法ではありませんが、迅速な結果が必要であり、実際のエラーの真相を突き止めるまでは、これが良い方法のように思えます。

ありがとう、

マット

編集 1: この修正を適用してストアにアプリを配置するつもりはありません。これは一時的なものです。

編集 2: Bill Dudney の WaveFront .obj ローダーから取得および適用された、私の描画機能を含む投稿されたコード

for(WaveFrontOBJGroup *group in scene.groups)
{
    NSString *matPath = [NSString stringWithFormat:@"%@%@.mtl", materialName, modelPart];
    NSArray *materialArray = [WaveFrontOBJMaterial materialsFromLibraryFile:matPath];
    WaveFrontOBJMaterial *mat = [materialArray objectAtIndex:0];

    if(group.smoothing)
        glShadeModel(GL_SMOOTH);
    else
        glShadeModel(GL_FLAT);

    // load (if necessary) and bind the vertices
    GLuint verticesName = [group verticesName:GL_STATIC_DRAW];
    glBindBuffer(GL_ARRAY_BUFFER, verticesName);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    // load (if necessary) and bind the normals
    GLuint normalsName = [group normalsName:GL_STATIC_DRAW];
    glBindBuffer(GL_ARRAY_BUFFER, normalsName);
    glNormalPointer(GL_FLOAT, 0, 0);

    ColorRGBA color = mat.ambientColor;
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (GLfloat *)&color);
    color = mat.diffuseColor;
    if(alpha)
        glColor4f(color.red, color.green, color.blue, mat.disolve);
    else
        glColor4f(color.red, color.green, color.blue, color.alpha);
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (GLfloat *)&color);
    color = mat.specularColor;
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat *)&color);
    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, mat.shine);

    // load (if necessary) and bind the texture
    if(group.textureCoordinatesIndexData.length > 0)
    {
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        GLuint textureCoordsName = [group textureCoordinatesName:GL_STATIC_DRAW];
        glEnable(GL_TEXTURE_2D);
        glBindBuffer(GL_ARRAY_BUFFER, textureCoordsName);
        glTexCoordPointer([group texCoordSize], GL_FLOAT, 0, 0);
        GLuint texId = [mat.diffuseTexture textureName];
        glBindTexture(GL_TEXTURE_2D, texId);
    }

    GLuint indexesName = [group indexesName:GL_STATIC_DRAW];
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexesName);

    glDrawElements(GL_TRIANGLES, group.indexCount, GL_UNSIGNED_SHORT, NULL);
    //^^This line above is where I get the "EXC_BAD_ACCESS" message

    if(group.textureCoordinatesIndexData.length > 0)
        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
}

ブレークポイントと NSLogを確認group.indexCountしましたが、null ではありません。最初に実行したときとまったく同じで、正常に動作します。

必ずしもその行にあるとは限らないことを認識しています。変数がポインターとして初期化されていないことが原因であるという他の話を聞いたことがあります*-または NSStrings が一致する識別子と値(@"%@ sometext %@", variable);を持っていませんが、私の中にそれらのいずれも表示されませんもちろん、コードは簡単に見逃す可能性があります。

4

2 に答える 2

0

アプリケーションがシミュレーターでコンパイルされない理由はわかりませんが、ライブラリを適切にリンクして、ライブラリを起動して実行できるようにする必要があります。アクセスエラーの場合、ゾンビほど良いものはありません。

エラーが呼び出しによるものであることがわかっている場合は、glDrawElements何が渡されているかを調べる必要があります。このリンクはあなたを助けることができるかもしれません.

アプリ内にいる間にアプリを終了する「機能」を取得できない理由は、それがアプリケーションの機能ではないためです。OS がアプリケーションに関連付けられているすべてを破棄してから再ロードするためです。定義上、実際にシャットダウンしないとこれを行うことはできません。

ただし、これで問題が解決した場合は、セットアップにやり直す必要があるもの (初期化、宣言など) がある可能性があります。nil何が設定されているか、または捨てられているかを確認してから、設定し直してください。

あなたのコードを見なければ、これを確実に言うことはできませんが、現在のすべての変数を上書き/再初期化するメソッドを書くことができるかもしれません. これはおそらく、必要なアプリケーションを終了する部分を複製するでしょう。

于 2012-07-17T13:00:36.113 に答える
0

次の 2 つのことを覚えておいてください。

1)-(void)viewWillAppear:(BOOL)animatedホーム ViewController にメソッドがあります。これは、ユーザーがこの画面に戻ったときに常に (!) を呼び出します (viewDidLoad とは異なります)。

2) 説明したようにこれを行っても、おそらく AppStore にアクセスできませんでした!

于 2012-07-17T11:42:16.673 に答える