2011-11-07 11 views
9

私は、デバイスのRAM容量に基づいて調整したいテクスチャー重いOpenGLゲームを持っています。最高の解像度のテクスチャ私はiPhone 4またはiPad2でうまく動作しますが、以前のデバイスはテクスチャを読み込む途中でクラッシュします。私はこれらのテクスチャの低解像度版を持っていますが、それらをいつ使うべきかを知る必要があります。iOSのRAM使用率に対応

私の現在の戦術は、特定の古いデバイス(3GSは低解像度の画面があり、iPadはカメラがありません)を検出し、IPad2以上およびiPhone 4以上の高解像度テクスチャのみを読み込みます。 iPod touchのために何かする必要があります。しかし、モデル検出はAPIやハードウェアの将来の変更に対して脆弱であるため、ハードコーディングのデバイスモデルよりもむしろ機能検出を使用する方がよいでしょう。

私が検討している別の可能性は、高解像度のテクスチャを最初に読み込んだ後に、低メモリ警告が表示されたときにそれらをドロップして置き換えることです。しかし、私は応答のチャンスを得るだろうか分からない。私は、デバッグコンソールに通知が表示される前にアプリが死ぬことが多いことに気付きました。

私が実行しているデバイスに、高解像度バージョンのテクスチャを読み込むにはRAMが不足しているかどうかを検出するにはどうすればよいですか?

私は、OpenGLテクスチャメモリに特有の他の適応技術をいくつか使用していますか?

注:

  1. 私が上で検索し、オフSO可能なRAMの検出に関連した答えを、しかし、それらはすべて基本的にメモリ使用量をプロファイリングし、無駄をなくす(テンポラリの寿命を最小化し、すべてのことに助言しましたguff)。できるだけ多くのことをやったことがあります。古いデバイスに高解像度のテクスチャを詰め込む方法はありません。

  2. PVRTCはオプションではありません。テクスチャには、フラグメントシェーダが使用するデータが含まれており、ロスレスフォーマットで保存する必要があります。

+0

このスレッド[iOSの空きメモリ](http://stackoverflow.com/questions/5012886)で詳しく説明しているように、合計RAMとフリーRAMの統計情報を取得できることに注意してください。また、iPhone 4でコードをテストしたところ、うまくいきました! –

答えて

11

デバイスの物理RAMの合計(最大)を取得するには、[NSProcessInfo processInfo].physicalMemoryを使用してください。

Documentationを参照してください。

0

限り私は1つを行うことができます3つの最も重要なことを知っているようである - のiOSを見つけようとして楽器に警告& 2.

  • プロフィールコード1を送信するとき

    1. - (void)didReceiveMemoryWarningを実装して応答漏れ& memの最適な実装方法。
    2. デバイスタイプを検出する&おそらくその情報を使用します。
    3. スペースを節約するために、PVRTCのようなテクスチャ圧縮を使用してください。

    私はあなたがそれらの大部分をやっていると思います。 1つのことは、iOSデバイスのRAM容量が正確に分からないことです。 AppleはiOSデバイスの技術仕様を公開していません。

    また、100メガバイトの消費量の後でのみ、mem警告が表示されるとは想定できません。 iOSが提供する警告は、デバイスの現在の状態によって異なります&実行中の他のアプリケーション&どのくらいのメモリを消費していますか。だからそれは難しい。

    私は2のセクションを読まなければならない提案することができます - Best Practices for Working with Texture DataTuning Your OpenGL ES Application

  • 2

    最も重要なのは、あなたがこのような場合には、高または低解像度のテクスチャを使用するの天気をされたメモリ管理のために知っておく必要があると思います。私が使用する最も簡単な方法は、これまでのすべてのデバイスのこの作品、この

    CGFloat scale = [[UIScreen mainScreen] scale]; 
    if ((scale > 1.0) || (self.view.frame.size.width > 320)) { 
         highRes = TRUE; 
    } 
    

    をチェックすることですと、新しいデバイスは、高解像度を使用する将来性でなければなりません。 あなたもすぐそこアスペクト比を計算するかもしれない

    aspect = self.view.frame.size.width/self.view.frame.size.width 
    

    最初HIGHRESをロードし、それがロード私のスタートアップのほとんどが費やされている私の3G上で、アプリのロード時間を殺すしないでください(偶数(iphone対iPadの後に役立ちます)低解像度)のテクスチャは、ちょうどこの最初の権利をテストし、ハイレストのものに触れないでください。

    古いデバイスでは、大きなテクスチャのため警告なしにプログラムが終了し、デバッガがビデオメモリの消費量をトラップできず、それ自体が死ぬことがあります。

    さらに最適化するには、実際に使用されている最小のテクスチャサイズを確認するためにミップマップを調整します(3Dオブジェクトを使用する場合のみ)。

    メモリは実際には共有されているので、システムメモリと競合しています。古いデバイスでは使用するMBの制限がありますが、それでもシステムメモリです。

    メモリ管理については、多くの方法があります。最も簡単なのは、読み込まれたテクスチャと、メモリ警告が来たときに必要なテクスチャをマークする必要があります。 this blog postに文書化され、素敵なきれいなAPI here(対応する.mファイル内totalMemoryの実装を参照)として実行されるような。

    +0

    詳細な対応をありがとうございます。私はこれを受け入れることができません。なぜなら、フィーチャ検出を使用する代わりにRAMを検出する方法の中心的な問題に答えることができないからです(あるいは、それは不可能であるか、追求する価値がないのでしょうか?)。 1.0 "を使ってiPhone 4を検出しました。私はそのことを考えていませんでした。 –

    +0

    jailbreakingせずにメモリを検出して検出できる唯一の方法は、すべてを埋めることと、どれだけ持っているかを測定することです。また、メモリは実行中の他のすべてのアプリケーション(sytemsもの、メールなど)と共有されるので、物理メモリの量が分かっていてもそれほど価値はありません。だからこそ私はそのルートを忘れてしまった、それはあなたが探している強固な地位ではない。 – led42

    +0

    あなたの言葉は、私がビデオメモリを別々のものと考えるべきではないか、RAMの測定をあきらめるべきかについて曖昧でした。私は他の実行中のアプリは気にしない。実験的には、256MBのデバイスは常にクラッシュしますが、512MBのデバイスは決してクラッシュしません。また、あなたの提案されたテストは最新のiPod Touch - retina&256 MBで失敗し、モデル検出の脆弱性に対する私の懸念を強調しています。ちなみに、iPod Touchの問題を解決するための狩猟は、私が別々に投稿する可能性のある答えにつながった。 –

    7

    合計物理RAMは、sysctl()を介して利用可能です。

    私は利便性と後世のためにブログのコードを解除しました:

    #include <sys/sysctl.h> 
    
    size_t phys_mem() 
    { 
    int mib[] = { CTL_HW, HW_PHYSMEM }; 
    size_t mem; 
    size_t len = sizeof(mem); 
    sysctl(mib, 2, &mem, &len, NULL, 0); 
    return mem; 
    } 
    

    Appleは、このようにsysctl()を使用してアプリを承認する場合、私は知りません。これは文書化されていますが、Mac OS Xの場合のみです。

    +1

    これはApp Storeアプリで承認されてしまったことはありますか? – Nate

    +2

    @Nate:はい。 [Your World](http://itunes.apple.com/us/app/your-world/id412566625?mt=8)は、384 MBを超えるデバイスに96メガピクセルのアースを搭載しています。それ以外の場合は、24メガピクセルのバージョンに戻ります。数字には何も特別なものはありません。それはできるデバイスとできないデバイスの間のちょうど中間の方法です。 –

    +2

    [NSProcessInfo processInfo] .physicalMemory – Steve

    関連する問題