12

私はiOSの描画を実験してきました。実践的な演習を行うために、棒グラフコンポーネントを作成しました。以下はクラス図です(まあ、画像のアップロードは許可されていませんでした)ので、言葉で書かせてください。UIViewから継承するNGBarChartViewには、NGBarChartViewDataSourceとNGBarChartViewDelegateの2つのプロトコルがあります。コードはhttps://github.com/mraghuram/NELGPieChart/blob/master/NELGPieChart/NGBarChartView.mにあります

棒グラフを描画するために、各棒グラフを異なるCAShapeLayerとして作成しました。これを行った理由は2つあります。1つはUIBezierPathを作成し、それをCAShapeLayerオブジェクトにアタッチすることです。2つは、[Layer hitTest]メソッドを使用して、barItemがタッチされたかどうかを簡単に追跡できます。コンポーネントはかなりうまく機能します。ただし、棒グラフを描画するために採用したアプローチには満足していません。したがって、このメモ。以下について専門家の意見が必要です

  1. CAShapeLayerを使用してBarItemsを作成することにより、私は実際にはUIGraphicsContextを使用していませんが、これは優れたデザインですか?
  2. 私のアプローチでは、UIView内にいくつかのCALayerを作成します。パフォーマンスに基づいて、UIViewで作成できるCALayerの数に制限はありますか?
  3. CGContext *メソッドを使用するのが適切な代替手段である場合、特定のパスにアクセスしたかどうかを識別する正しい方法は何ですか。
  4. タップしたときにバーが点滅するなど、アニメーションの観点からは、レイヤーデザインまたはCGContextデザインの方が優れています。

ヘルプは非常に高く評価されています。ところで、あなたは私のコードとコメントを自由に見ることができます。改善のための提案を喜んで受け入れます。

最高、ムラリ

4

1 に答える 1

17

IMOは、一般的に、あらゆる種類の描画形状に大きな処理能力を必要とします。また、キャッシュされたビットマップをGPUで合成することは、それらすべてを再度描画するよりも非常に安価です。そのため、多くの場合、すべての図面をビットマップにキャッシュし、iOSではCALayerそれを担当します。

とにかく、ビットマップがビデオメモリの制限を超えた場合、Quartzはすべてのレイヤーを一度に合成することはできません。その結果、Quartzは複数のフェーズにわたって単一のフレームを描画する必要があります。そして、これにはいくつかのテクスチャをGPUにリロードする必要があります。これはパフォーマンスに影響を与える可能性があります。iPhone VRAMはシステムRAMと統合されていることが知られているため、これについてはよくわかりません。とにかく、その場合でもさらに作業が必要なのは事実です。システムメモリが不足した場合でも、システムは既存のビットマップを削除し、後で再描画するように要求できます。

  1. CAShapeLayerCGContextあなたの代わりに(あなたがこれを意味したと私は信じます)すべての仕事をします。より低レベルの最適化の必要性を感じた場合は、自分でそれを行うことができます。

  2. はい。明らかに、パフォーマンスの観点からすべてに制限があります。大きなアルファブレンドグラフィックを備えた何百ものレイヤーを使用している場合、パフォーマンスの問題が発生します。とにかく、一般的に、レイヤー構成はGPUによって加速されるため、発生しません。グラフの線がそれほど多くなく、基本的に不透明な場合は、問題ありません。

  3. 知っておく必要があるのは、グラフィックス図面が合成されると、それらを分解して戻す方法はないということだけです。コンポジション自体は非可逆圧縮による一種の最適化であるため、2つのオプションしかありません(1)ミューテーションが必要な場合にすべてのグラフィックを再描画します。または(2)各表示要素(グラフ線など)のキャッシュされたビットマップを作成し、必要に応じて合成します。これは、CALayersが行っていることです。

  4. 絶対にレイヤーベースのアプローチがはるかに優れています。あらゆる種類の自由形状の描画(GPU内で行われる場合でも)は、GPUによる単純なビットマップ構成(2つのテクスチャ三角形になります)よりもはるかに多くの処理能力を必要とします。もちろん、レイヤーがビデオメモリの制限を超えない限り。

これがお役に立てば幸いです。

于 2011-09-11T20:09:39.147 に答える