2010-12-05 7 views
1

私はこのアプリを設計しており、ユーザーが指で描くことができるセクションがあります。操作の取り消しを行うと、ユーザーが描画を開始するときに、現在の描画コンテンツをすばやく把握してどこかに保存する必要があります。iPhone - ディスクのボトルネックを改善する

私は最初にアンドゥをCGLayerとして、また画像として保存しようとしましたが、私のアプリのメモリ使用量は7Mbから19Mbに増加しました。 19 MBでは、比較的安全です。なぜなら、24 Mbは、物事を超えて理論上の限界であるように見えます。問題は、私は多くのメモリを必要とする私のアプリケーションの別のセクションを持っていると私はこれを実行すると、メモリは19から28メガバイトにピーク、それは危険にさらされる危険です。

次に、ディスクにイメージを保存することにしました。ユーザーがTouchesBeganを起動したときに画像を保存しなければならないときに起こる小さな隙間を防ぐために、私は洗練された範囲で、ディスクメソッドへの節約を行いましたが、今はほとんどギャップを感じません。私はほとんど感じていないが、私はまだ少しの毛の隙間を感じると言った、私は< 0.1sライン開始の描画にかかると言うだろう。

ファイルの保存を管理するキュー操作を起動します。

あなたがこれを改善する方法を想像できる他の方法はありますか?

おかげ

答えて

3

mmapCGBitmapContextCreateを使用すると、ファイルに基づいてイメージが作成されます。カーネルは必要なときにファイルの部分を遅延ページングします。

これをrjobidonの提案と組み合わせると、頻繁にスナップショットを作成することになり、堅牢で迅速な取り消しシステムが得られるはずです。

+0

ありがとうございます。あなたは、あなたが何を言っているかを模範的に示すリンクやコードを持っていますか?**全体の画像**を取得しているかどうかわかりません。:) – SpaceDog

+0

空のキャンバスから始めましょう。ユーザーが描画操作を実行すると、それらを再生できるようにキューに記録します。ユーザーが取り消しを押すと、キャンバスを消去してキュー内の操作を再生します(最後のものを除く)。キューが長すぎると、元に戻す操作に時間がかかり、ユーザーエクスペリエンスが低下します。 – rpetrich

+0

これはスナップショットが入る場所です。すべてのn個のコマンドは、フロントバッファの生の内容をディスクに保存するので、取り消し「再生」プロセスは最初から部分的にレンダリングされたイメージから開始することができます。最適化として、ファイルディスクリプタをメモリバッファとして扱うことができるように、mmapを使うことをお勧めします。ファイルを開き、必要なサイズに展開し、先頭に戻り、mmapしてmemory-受け取ったアドレスをCGBitmapContextCreateに渡して、直接ディスクに書き込むCGContextを取得することもできます。 – rpetrich

3

私は、ベクターデータ、あなたがプレイして元に戻す非常に迅速かつ使用千倍のメモリで割ることができ、この方法として、画像を保存することをお勧めします。たとえば、あなたができる唯一の店舗:

  • ジェスチャー座標(x、y)
  • ジェスチャータイプ(touchBegan、touchEnded)
  • ペン変化(色、幅、効果)も

あなたは現在の画像をレンダリングするためのキャンバスを持っています。

幸運を祈る!

+1

これは、ディスクへの高速な永続性を維持しながら、元に戻す/やり直し機能をほぼ無料で利用できるため、Core Dataを使用してベクトル描画操作を保存すると特に簡単に実行できます。 –

+0

データベースを使用してベクトルデータを格納する方が配列に格納する方が速いことを意味しますか?なぜコアデータが私にディスクへの高速永続性を与えるのでしょうか?そして最終的な質問:消去のようなもののベクトルデータを持つことは変わっていませんか?つまり、ユーザーの指がたくさんの線(=点)を描いていると想像してください。次に、消しゴムを選択し、ピクセルの一部を消去します(ピクセルは、TouchesMovedによって取得されたポイントと正確に同じではありません)。だから、幾つかの絵や絵を描いた後のある時点で、彼は描きを終わらせます。この時点で私のデータベースには何兆ものポイントがあります。 – SpaceDog

+0

...正しいイメージを描くためにキャンバスが空白だったので、その図面の全履歴のように、すべてのシーケンスを再描画する必要があります。この時点で速い? – SpaceDog

1

前回の操作の最後に保存するのはどうですか?その後、各ストロークの開始が瞬間になります。

数秒間描画を一時停止すると元に戻すことができるので、元のストロークではなく元の描画に戻すことができます。望ましいことがある。

+0

ありがとうございます。私はそのようなことをすることを考えましたが、私のテストでは、何かを描くのと同時にタイマーが節約をしました。したがって、場合によっては、不運がいくつかの方法で一致する特定のリズムを描くとタイマーを使用すると、図面の一部を失う可能性があります。これはテスト中に数回発生します。 – SpaceDog