2010-12-02 8 views
3

私は私の公共交通機関用の地図上で作業しています。私はSurfaceViewを使用しています、それはタイルベースのマップです。メインスレッド以外に2つのスレッドがあります - 描画スレッドとビットマップ読み込みスレッド。カスタムタイルベースの地図が遅い

ビットマップはSDカードに保存された256x256 PNGです。キャッシュされたビットマップはキャッシュ容量が64ビットです。各ズームレベルごとに異なるビットマップがあり、私のマップには4つのズームレベルがあり、次のレベルごとに2倍のズームがあります。

Nexus Oneではスクロールとピンチズームがスムーズではなく、FPSは15〜20です。タイルがロードされていない場合、FPSは35〜40です。ビットマップ読み込みスレッドの優先度を下げると、私はしばしば地図上に(白い)タイルを載せていないことを見ています - それは非滑らかさよりもさらに悪いです。

どうすればいいですか?私はこれまで2つのアイデアを持っていますし(また、私はポップアップを表示したいというスクロールを

  • は、OpenGLを試してみて、私はそれに時間を費やし、その後のみ3でinreasedそれ私のFPSを見つけるためにしたくありませんマップ)をクリックした後、GLSurfaceViewで行う方法がわかりません。
  • ビットマップ読み込みスレッドに低い優先順位を設定するのは、ユーザーが画面に触れるか、進行中のアニメーションがあるときだけです。私はそれを試みたが、未知の理由で少しでも問題を悪化させるように見えたが、画面に触れたりタッチしたりしても何の効果もなかった。私が修正できるいくつかのバグだった場合、まだ別の問題があります。キネティックスクロールを使ってマップをすばやく移動すると、キャッシュされていないビットマップが多数表示されます。

答えて

2

I/Oをレンダリングスレッドで実行しないでください。 (どのような方法でOpenGLを使用してGLSurfaceViewを使用していないことができますか?)

私はOpenGLのタイルベースのマップビューを書かれているし、それはNexus Oneの上でバターのように滑らかである(FPSを測定したが、それは簡単にだありませんiPhone 4の地図アプリと同じように滑らかである)。そのトリックは、レンダリングスレッドからすべてのI/Oを移動し、ワーカースレッドの優先度を下げ、現在のレンダリングの最後にすぐにrequestRender()を呼び出すことです。ズーム)、つまり、別のスレッドがその信号を待つことはありません。市場でそれを見るためにYell.comを探してください(英国だけかもしれませんが)。

+0

申し訳ありませんが、それはSurfaceViewでなければなりません、私は質問を編集しました。レンダリングスレッドでIOを実行していると思いますか?私は描画スレッドと追加のビットマップロード(IO)スレッドを持っています。 – fhucho

+0

.pngの解読はどうですか?それはあなたの読み込みスレッドでも行う必要があります。そして、あなたの読み込みスレッドは、より低い優先度を持っていなければなりません。そうでなければ、CPUスレッドのUIスレッドはまだ飢えています。既にすべてのことを行っているのであれば、2D Canvas描画APIがどれほど遅いか見ているだけかもしれません。 –

+0

あなたのアプローチはどうですか?表示される各タイルをフレームごとに描画していますか?それは非常に遅いです...あなたが目に見えるように新しいタイルを描画するだけのオフスクリーンビットマップを使用する方がはるかに良いです。 –