3

詳細なグラフィックを多く使用するプロジェクトに取り組んでいます。常に表示されるスプライト、背景などの量のため、メモリ フットプリントが大きくなります。アニメーションやスプライトにはcocos2D、UIやメニューなどにはUIKitを使用しています。

デバイスが Retina ディスプレイの iPod Touch である場合、UIKit に標準解像度の画像を強制的に使用させることで、iPod Touch (同等の iPhone よりもメモリが少ない) のメモリ使用量を削減できるようにしたいと考えています。cocos2d でフラグを設定して SD イメージを強制的にロードすることはできますが、同様のオプションや UIKit の回避策は見つかりませんでした。

要約すると、このプロジェクトは、次のように、SD と Retina の両方のフレーバーのすべてのイメージを含むユニバーサル バイナリです。

画像.png

image@2x.png

iPhone 4、4S、および 5 (すべて Retina ディスプレイを搭載) では、イメージの @2x バージョンをロードするデフォルトの UIKit 動作が必要です。

iPod Touch 第 4 世代 (およびおそらく第 5 世代) では、image@2x.png ファイルも利用可能ですが、UIKit に SD image.png ファイルを強制的にロードさせたいと考えています。

これは、Retina ディスプレイを搭載したこれらのデバイスのメモリ フットプリントを削減するためですが、RAM は電話の半分です。

これを有効にするためのアイデアや回避策を誰かが持っていれば、本当に感謝しています!

4

3 に答える 3

2

私のコメントを回答として追加すると、

デバイスに基づいて画像を取得するには、独自のメソッドを作成する必要がある場合があります。その場合、@2x で画像に名前を付けるべきではありません。メソッドは、デバイスと Retina ディスプレイに基づいて画像を取得し、UIImageオブジェクトの作成に使用できる画像の名前を返す必要があります。このメソッドは、 に追加されたカテゴリにすることができますUIImage

例:-

[UIImage testImageNamed:@"test.png"];

デバイスと網膜/非網膜の解像度を返すか、それに基づくtestImageNamedカテゴリとしてメソッドを実装します。UIImagetestRetina.pngtest.png

更新: あるいは、@2x 自体 (test.png および test@2x.png) で画像を保持できるように、このカテゴリの iPod touch デバイスに対して次のことを試すこともできます。これが機能するかどうかはわかりません。fileName に「test」しかない場合、これは test.png 自体をフェッチする可能性があると想定していますが、これは試していません。これは間違いなく試してみる価値があります。

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];
[UIImage imageWithData:imageData];

上記を追加するのは iPod touch のみで、その他のデバイスでは正常に戻る可能性があります[self imageNamed:@"test.png"];

于 2012-11-16T23:55:07.517 に答える
1

@2x バージョンが存在しないことを保証できるように、iPod に別のイメージをロードするのが最善の方法だと思います。このようにしてRAMを節約できますが、実際には画像の繰り返しのためにアプリケーションが重くなります...

それが役に立てば幸い!またね!

于 2012-11-16T23:25:06.833 に答える
-1

次のような名前の関数を使用して、UIImage にカテゴリを記述します。

myImageNamed:(NSString*)名前

次に、UIDevice を使用して現在のデバイスを特定し、使用するイメージのバンドルを検索します。

次のようになります。

- (UIImage*)myImageNamed:(NSString*)name
{
    if (!notIpodTouch) {
       return [self imageNamed:name];
    }

    //search through mainBundle for file with passed in name
    //return that

}
于 2012-11-16T23:36:20.613 に答える