0

ねえ、私は私のアプリでいくつかの問題を抱えています。これはIOSにとっての私の最初の大きなプロジェクトであり、これまでのところ、あちこちで問題を抱えているいくつかの部分をかなりうまくやっています。しかし、開発が基本的に終わった今、私は最大の問題を抱えており、それはしばらくの間私を悩ませてきました、そして私は壁にぶつかりました。私はまだ何をすべきかわかりません(私には1つのアイデアがありますが、それがうまくいくかどうかはわかりません)。私のコンピューターでは、ほとんどの場合動作します。いつかそれ
クラッシュしてエラーが発生します(以下を参照)。エラーが発生したときに私がすることは、通常、ゲームが機能していて、突然停止することです。私は実際にしばらくの間エラーを受け取っていません、そしてそれが開発中であったときに私はほとんどそれを受け取りました。アプリを上司のマシンまたは実際のデバイスのいずれかで実行すると(私のマシンからではなく、彼女のマシンからデバイスにアプリをアップロードすることに注意してください)、クラッシュします。常に同じポイントでクラッシュします。最初のビューであるタイトル画面が表示されます。次に、スタートボタンをクリックすると、新しいビューが起動します。ただし、スタートボタンをクリックすると、アプリがクラッシュします。何が起こるかというと、アプリが閉じて、デバッガーがコードのこの部分に移動します。

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([MyAppDelegate class]));
    }
}

また、アプリはゲームです。すべてのビューはOpengelEsを使用します。何が起こっているのかと思っているのは、多くのメモリが使用されているということです。ゲームは実行中です。システムはより多くのメモリを必要とし、システムはメモリを解放するプロセスを強制終了します。プロセスはアプリです。これは、IOSとアプリケーションのライフサイクルについて私が知っていることに基づいています。私はARCを使用していますが、特にツールを使用してゲームをテストしましたが、問題を引き起こす可能性のあるメモリリークなどは見つかりませんでした。画像はファイルサイズが大きいのではないかと思います。画像の範囲は100kbから5MBです。サイズを小さくしていますが、それが問題かどうかはわかりません。今のところ、クラッシュする理由として私が持っている唯一のリードは、メモリが不足していることであり、私が見つけた唯一の理由はファイルサイズです。これが原因であると100%確信しているわけではありません。これは、私のマシンで(少なくとも最近では)クラッシュしない理由を説明していないためですが、彼女ではクラッシュします(彼女のマシンとデバイスでクラッシュする理由を説明し、説明していますなぜそれが私のもので時々起こるのに、それらが異なる条件下で起こるのではないのか)。また、これが発生した場合、ある種のメモリ不足の警告が発生するはずだといつも聞いています。誰かがこれを否定することを確認できますか(私はこれを調査しましたが、多くは見つかりませんでした

ですから、私が求めているのは、誰かがこの問題の原因についてこれ以上の提案をするか、少なくとも私がもっと研究すべきトピックに私を導くかもしれないかどうかです。画像のファイルサイズを小さくするとうまくいくと思いますか。1つの背景が約1〜3である傾向があり、その後、100kbの8〜40の画像が存在する傾向があります。

編集 私はプロファイルモードの楽器を使用しました。アプリは100mbの使用を開始し、再生中に500mbまで上昇しました(これは実際のメモリにあります)。新しいレベルに切り替えたときだけメモリが増えたことに気づきました。各レベルでより多くの画像が表示されているためだと思いましたが、テストを行いました。テストでは、レベルが終了レベルのときに次のレベルに進む代わりに、レベル1が再度再生されます。各レベルはクラスレベルのオブジェクトです。私のViewControler(GLKViewControllerのサブクラス)には、currentLevelというプロパティがあります。ゲームは次のコードで次のレベルに切り替わります。

-(void) nextLevel: (Level) newLevel
{
    //play sound
    MyAppDelage *del=[[UIApplication sharedApplication] delegate];
    UIWindow *main=[delegate window];
    MyViewControler *view=(MyViewControler*) main.rootViewController;
    view.currentLevel=newLevel;
 }

だから私が起こっていると思うのは、古いレベルでは何らかの理由でガベージコレクションが行われることは決してないということです。それが何か違う場合、currentLevelは強いです。また、@ synthesize currentLevel = _currentLevel; これは、ObjectiveCを最初に学習したときに書いた本当に古いコードです。私は当時の例に従っていました。強い型を変更するか、@ synthesize部分を削除すると、この問題が解決する可能性がありますか?私はより多くのC++/ C#/ Java構文に慣れているので、ObjectiveCスタイルのいくつかにはまだ慣れていません。

4

1 に答える 1

6

コードが表示されない場合は、次のことを確認することをお勧めします。

  1. Appleは、幅/高さが1024ピクセルを超える画像はタイルに分割する方がよいとアドバイスしているため、使用する画像のピクセルサイズが小さいかどうかを確認してください。たとえば、AppleのPhotoScroller.appコードを見てください。画像のサイズは小さい場合がありますが(たとえば100 kb)、画像を表示するには、iOSがピクセルあたり4バイトを使用して画像をデコードする必要があることに注意してください。したがって、3000x3000ピクセルの画像は、約34MBのメモリに相当する3000x3000* 4=36,000,000バイトを使用します。
  2. ARCを使用していますが、画像を処理し、画像処理コードを@autoreleasepool {..}で囲む(該当する場合)コード内のfor/whileループを確認してください。例えば:

    for (NSString *imageName in imageNames) {
        @autoreleasepool {
            //... code here to get your images for display ...
        }
    }
    
  3. 多くの画像の取得をどのように処理するかを批判的に見てください。つまり、iOSは「imageNamed」と「imageWithContentsOfFile」を使用してフェッチされた画像をキャッシュします。この手法は、CATiledLayersを使用して大きな画像を処理する場合に特に使用されます。次のコードフラグメントは、画像を取得する2つのフレーバーを示しています。

    // The fetched image is cached by iOS when using:
    UIImage *image1 = [UIImage imageNamed:@"myimagename.png"];
    // You can control memory usage and freeing of the image when using:
    UIImage *image2 = [UIImage imageWithContentsOfFile:@"myPath/myimagename.png
    
  4. AppleのLargeImageDownsizingの例で使用されているコードも見ることができますが、PNGファイルを処理するときにこれが機能しなかったことに注意してください。バグレポート(昨年11月)をAppleに提出しましたが、まだ何も聞いていません。

  5. 最後に、実際のデバイスでのテストを長く待たないでください。開発用MacはターゲットのiDeviceよりも少なくとも10倍高速であり、メモリ関連の問題に気付く前に利用可能なメモリが非常に多いためです。ちなみに、Instruments.appを使用してアプリのプロファイリングを行うことは、常に良い習慣です。

上記の提案がお役に立てば幸いです。ちょうど私の2(ユーロ)セント、まだその価値があります。

于 2013-03-27T22:53:14.157 に答える