7

PNG が XCode iPhone プロジェクトに追加されると、コンパイラは pngcrush を使用してそれを最適化します。デバイスに読み込まれると、画像のレンダリング パフォーマンスは非常に高速になります。

私の問題は、アプリケーションが実行時に外部ソースから PNG をダウンロードすることです (Google Data API を使用して、Picasa Web アルバムから)。残念ながら、これらの画像のパフォーマンスは非常に悪いです。画像の上にカスタム レンダリングを行うと、内部に保存されているものよりも 100 倍遅くなります。これは、ダウンロードした画像が最適化されていないことが原因であると強く疑っています。

iPhoneで実行時に外部からダウンロードしたPNGを最適化する方法を知っている人はいますか? それができる授業を期待しています。pngcrush のソース コードを自分のアプリに追加することも検討しましたが、これは思い切った方法に思えます。私はまともな答えを自分で見つけることができませんでした。どんな助けにもとても感謝しています。

ありがとう!

更新: 一部の人々は、ファイルのサイズが原因である可能性があると示唆していますが、そうではありません。テスト中に、まったく同じ PNG の埋め込みバージョンとダウンロード バージョンの使用を切り替えるトグル ボタンを追加しました。唯一の違いは、埋め込まれたものがコンパイル中に「pngcrush」によって最適化されたことです。これにより、(RGBA から BRGA への) バイト交換とアルファの事前乗算が行われます。( http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html )

また、私が言及しているパフォーマンスはダウンロードではなく、レンダリングです。画像の上にカスタム ペイントを重ね合わせます (UIView の drawRect メソッドをオーバーライドします)。背景がダウンロードされたバージョンの場合は非常に途切れ途切れになり、埋め込まれた (したがって最適化された) バージョンの場合は非常に滑らかになります。繰り返しますが、それはまったく同じファイルです。唯一の違いは最適化です。これは、実行時にイメージをダウンロードした後、デバイス上で実行できることを望んでいます。

みんなの助けをありがとう!

4

7 に答える 7

7

あなたが投稿したそのリンクは、あなたの質問にほとんど答えています。

ビルド プロセス中に、XCode は png を前処理して、iPhone のグラフィック チップにより適した形式にします。

このように処理されていない Png は、非ネイティブ形式を処理する低速のレンダリング パスを使用する可能性が高く、アルファは色ごとに個別に計算する必要があります。

したがって、2 つのオプションがあります。

  1. pngcrush と同じ作業を実行し、順序付け/事前乗算アルファを交換します。高速化は、これらのいずれかまたは両方が原因である可能性があります。

  2. イメージをロードしたら、そこから新しいイメージを「作成」できます。この新しいイメージは iPhone のネイティブ フォーマットである必要があるため、パフォーマンスが向上します。欠点は、潜在的にもう少し多くのメモリを消費する可能性があることです。

例えば

CGRect area = CGRectMake(0, 0, width, height);
CGSize size = area.size;
UIGraphicsBeginImageContext(size);

[oldImage drawInRect:area];

UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
于 2009-03-13T18:29:36.147 に答える
3

100 倍遅く「見える」と言うという事実は、実験を行っていないことを示していますが、推測 (PNG の最適化である必要があります) を行っており、直感に基づいてパスをたどっています。

問題を解決しようとする前に、時間をかけて問題を確認する必要があります。私の直感では、PNG の最適化は問題ではないと言っています。これは主に画像の読み込みに影響しますが、いったんメモリに格納されると、元のファイル形式は関係ありません。

とにかく、AB 比較を試す必要があります。最適化された PNG を別の場所からロードするコードを取得して比較するか、2 つの PNG タイプで描画を行うだけのテスト アプリを作成する必要があります。問題が何であるかを確認したら、pngcrush をアプリにコンパイルする必要があるかどうかを判断できます。

于 2009-03-13T00:33:54.687 に答える
1

ダウンロードした元のサイズでpngを保存していますか?大きな画像の場合、レンダリングにかなりの時間がかかります。

于 2009-03-12T23:47:01.227 に答える
1

pincrush を試して、通常の png ファイルをクラッシュした png ファイルに変換します

于 2010-10-08T06:55:14.300 に答える
1

それを行うには良い方法のようです (iPhone で pngcrush を実行できず、高速化が期待できないため)、pngcrush を実行するプロキシを介してリクエストを行うことです。プロキシは、あなたが感じる 100 倍の苦痛を実際にいくらか得ることができる優れた馬力を持っています。

于 2009-03-13T03:19:54.710 に答える
0

drawRect:UIView のメソッドをオーバーライドして、画像の上に描画しているとします。その上にカスタムのものを重ねて画像全体を繰り返し描画することで、アニメーションを実行しようとしていますか?

カスタムのものを別のビューまたはレイヤーに配置し、OS にバックグラウンドでの結果の合成を処理させると、より良い結果が得られる場合があります。OS は、実際に変更した画面の部分のみを更新し、画像全体を頻繁に再描画することはありません。

于 2009-03-13T20:24:05.980 に答える