qgmap alpha3 リリース

お知らせ:新しいバージョンが出ています。最新バージョンはダウンロードページ

リリースしますと宣言してからだいぶ時間が経ってしまいましたが、qgmap の alpha3 をリリースします。

SL-C1000で動作確認してます。SDカード等にもインストール可能です。

今回の修正点は主に動作の高速化です。

  • 拡大処理を独自実装して高速化
  • QPixmapCache のキャッシュサイズ変更 (1MB->8MB)
  • 拡大前の QImage をキャッシュするように変更

最後の拡大前画像のキャッシュ化は開発メモには書いてませんでしたが、QPixmapCache だけでは拡大後の画像しかキャッシュしないため、拡大する度に前の同じ画像を何度もロードし直していました。

そのため、VGA画面全部が4倍拡大の場合、ちょうどいい場所であれば1枚の画像だけロードして、それを4倍拡大すればいいものを、律儀に同じ拡大前画像を何度もロードしていました。

ただ、今回の修正の1番目と3番目は拡大補完時の高速化で、等倍地図での高速化は2番目の修正のみなので、地図の必要領域の全縮尺をダウンロードしている人にはあまり高速化は体感できないかもしれません。

私みたいに地図の容量をケチるためにダウンロード範囲を最低限までチマチマ削っている人には効果大かも (^^;

そろそろデバッグコードも綺麗に消して、バージョン 0.1 としてリリースしてもいいかなぁ。

qgmap 開発メモ – 拡大処理を実装

QImage の scanLine を直接書き換えることで拡大する処理を書いてみた。整数倍だけなので簡単に書けた。

時間を測ってみると、倍率によらず 6~7ms 位。 QPixmap::xForm() は 36ms~122msなので比較にならないくらい速い。

拡大の有無にかかわらず、画像1枚あたり 80 ~ 120ms 程度でロードできるようになった。

あと、QPixmapCache を使ってキャッシュしてるつもりだったんだけど、キャッシュサイズがデフォルトでは 1MB らしい。地図1枚で 256x256x4byte=256kB だから、4枚しかキャッシュできてなかった。VGA1画面では最大 12枚の地図が必要なので、全くキャッシュの意味がなかったということに。照れる

とりあえず 8MB (=地図32枚分) に増やしてみたところ、確かに動作が軽くなった。

拡大処理の独自実装と、キャッシュの拡大で体感で分かるほどスクロールがスムーズに。まぁ、一応実用レベルなのかなぁ。個人的にはまだ引っかかる感じは気に入らないけど。

ソースを整理したらリリースします。

qgmap 開発メモ – 画像読み込み関係の処理時間

qgmap の画像読み込みや拡大処理を高速化したい。

スタイラスで地図をグリグリやってると、画像読み込みのタイミングで、カクッ、カクッと引っかかるような感じがする。できれば PC で Google Map を使ったときみたいになめらかにしたいなぁと。特に拡大補完する場合は体感でわかるくらい重くなるので、拡大処理も見直したい。

ということで、画像読み込みや拡大処理の時間を測ってみた。

Google Map の画像は 256×256 の 8bit パレットの PNG 画像となっている。少しだけ 4bit, 2bit, 1bit PNG も混じっているみたいだけど。

今の qgmap では、QPixmap::load() を使って画像を読み込んで、拡大時は QPixmap::xForm() で拡大している。この xForm() は、QMatrix というクラスで座標変換の行列を設定して変換するんだけど、行列の係数はもちろん浮動小数点で指定するので、ここがすごく重そうな感じ。

とりあえず、QPixmap::load() と、QPixmap::xForm() の時間を測ってみる。

Qtには QTime という時間関係のクラスがあり、これで簡単にある区間の時間が測れるらしい。便利じゃのう。

QTime t;
t.start();
測りたい処理
printf("%dms\n", t.elapsed());

こんな感じ。printf 使うあたりが C++ に染まれていない証拠。

適当に測って平均するとこんな感じになった。

  • QPixmap::load()   70.0ms
  • QPixmap::xForm()  2倍拡大 (128×128→256×256)  122.1ms
  • QPixmap::xForm()  4倍拡大 (64×64→256×256)  69.4ms
  • QPixmap::xForm()  8倍拡大 (32×32→256×256)  50.3ms
  • QPixmap::xForm()  16倍拡大 (16×16→256×256)  36.2ms

拡大処理は拡大元の面積に比例するようだ。思ってたよりも遅いなぁ。

ついでに、QImage::load() と、QPixmap::convertFromImage() の時間も測ってみた。

  • QImage::load()   22.5ms
  • QPixmap::convertFromImage()  58.5ms

Qimage::load() は PNGのデコード、convertFromImage() でスクリーンの32bppへ変換とローテーションをしてるのかな。両方合わせて QPixmap::load() よりちょっと長いくらいか。

これくらいなら、拡大する時は、QImage::load() → 独自拡大処理 → QPixmap::convertFromImage() の方が速そうだ。拡大しない時は QPixmap::load() で直接ロードで。

それにしても画像1枚読むだけで 0.1 秒近くかかってるんだな。縦方向にスクロールさせると最大4枚同時にロードするから、0.4秒以上止まっちゃうわけで。そりゃ引っかかる感じがするわけだ。根本的にはスレッド化してバックグラウンドでロードしないと解決しなそうだ。

qgmap alpha2 リリース

お知らせ:新しいバージョンが出ています。最新バージョンはダウンロードページ

qgmap の alpha2 版をリリースしました。

修正点は1点だけ。

  • 縮尺選択のスライダを実装

これだけですが、見た目はグッと Google Maps に近づきました。見た目は重要ですねぇあっかんべー

本物はスライダが左側にあるのですが、右利きの私がスタイラスで操作するには、スライダが右側の方が使いやすかったので、右側に配置しました。GM_Liteも右側にスライダがあるのはそういう理由なのでしょうか?

qgmap 0.0-alpha2 スクリーンショット
スクリーンショット (右端にスライダを追加しました)

何気にウリの1つの拡大補完もアピールしてます。笑う

今回はソースも公開します。C++初心者ということと、動くことを優先して可読性は無視しているので、とても読めたもんじゃないです。照れる

今はまだ恥ずかしいソースですが、経験とともに徐々によくなっていけばいいなと。

ライセンスはGPLです。

次はスクロール時の引っかかり改善 or 拡大処理の高速化かなぁ。

qgmap とりあえず公開

お知らせ:新しいバージョンが出ています。最新バージョンはダウンロードページ

風邪をひいてしまってしばらく進捗が止まってましたが、 qgmap がとりあえず最低限動くようになったのでα版として公開します。

動作には別途、実用工房さんの GM_Lite で切り出した地図データが必要です。

 動作確認は SL-C1000 で行っていますが、おそらく VGAザウルスであれば動くのではないかと思います。

上のリンクから、ipk ファイルをダウンロードし、ザウルスへインストールします。本体、SDカードのどちらにもインストールできます。

インストールするとアプリケーションタブに下のようなアイコンが追加されます。

 qgmapアイコン

qgmapを起動すると、以下のような画面になります。

qgmap初期起動時の画面

初回起動時は、地図データのパスが設定されていないため、地図が表示されません。

設定するには、画面左上のアイコンをクリックし、

メニュー

「Map Path」 を選択します。

すると、画像のパスを設定するダイアログが表示されますので、GM_Liteで切り出したデータの imgsディレクトリの場所を入力します。

 

パス設定ダイアログ

スクリーンショットをみて気づいたんですが、OKが2つありますねあっかんべーダサッ!

今の所は、パスは手打ちで入力になっています。いずれ「参照」ボタンをつけてGUIでディレクトリを選択できるようにする予定です。

地図表示

 OKを押すと地図が表示されます。

タッチパネル操作で上下左右にスクロールします。

キーバインドは以下のようになっています。

  • 「I」、「O」キー ・・・ ズームイン、ズームアウト
  • カーソルキー ・・・ 上下左右にスクロール
  • 「SHIFT」+カーソルキー ・・・ 大きくスクロール

特徴としては、下の2つくらいでしょうか。

  • GM_Lite on Opera よりは早い(?)
  • 指定縮尺の地図がない場合は、広域の地図を拡大して使用。(最大16倍まで) 

欠点や、制限事項は以下のとおりです。

  • 拡大処理が遅い。(スクロール時に引っかかる)
  • 拡大地図の右端、下端がおかしい。(Qt-2.3.2のバグか?)
    上のスクリーンショットでも変な線が入っているのはそのせいです。
  • GM_Lite on Operaに比べて機能が少ない
  • インプットスタイルとビュースタイルの切り替えに未対応
    起動後に切り替えると表示がおかしくなります。

今後は以下のような開発をしていく予定です。(上位のほうが優先)

  • スクロール時の引っ掛かりをなくす
    → スレッド化して、地図画像の読み出しや拡大が終わり次第随時表示するように変更する。
  • 拡大処理のバグ対応
    → Qtの拡大処理が遅いということもあり、自前で拡大処理を書いてしまおうかな。
  • ズームレベルのスライダ実装
  • 縮尺画像の表示
  • PHS、GPS連動
    → GM_Liteと同じく、/tmpに緯度・経度のファイルを書いておき、それを読み出す。
  • 住所検索
    → GM_Lite相当にしたいな

こんな感じでしょうか。ゆっくり地道に改造していきます。

ソースは近いうちに公開する予定です。