WinForms を使用するレガシー マップ ビューア アプリケーションがあります。それは遅いです。(以前は速度は許容範囲でしたが、Google マップ、Google Earth が登場し、ユーザーは甘やかされました。今では、より高速であれば作成を許可されています :)
すべての明白な速度の改善 (キャッシング、並列実行、描画する必要のないものを描画しないなど) を行った後、私のプロファイラーは、ポイントをマップ空間からスクリーン空間に変換するときの座標変換が本当のチョーク ポイントであることを示しています。 . 通常、変換コードは次のようになります。
public Point MapToScreen(PointF input)
{
// Note that North is negative!
var result = new Point(
(int)((input.X - this.currentView.X) * this.Scale),
(int)((input.Y - this.currentView.Y) * this.Scale));
return result;
}
実際の実装はよりトリッキーです。緯度/経度は整数で表されます。精度が失われないように、2^20 (~ 100 万) を掛けます。座標はこのように表されます。
public struct Position
{
public const int PrecisionCompensationPower = 20;
public const int PrecisionCompensationScale = 1048576; // 2^20
public readonly int LatitudeInt; // North is negative!
public readonly int LongitudeInt;
}
可能なスケール係数も 2 の累乗に明示的にバインドされていることが重要です。これにより、乗算をビットシフトに置き換えることができます。したがって、実際のアルゴリズムは次のようになります。
public Point MapToScreen(Position input)
{
Point result = new Point();
result.X = (input.LongitudeInt - this.UpperLeftPosition.LongitudeInt) >>
(Position.PrecisionCompensationPower - this.ZoomLevel);
result.Y = (input.LatitudeInt - this.UpperLeftPosition.LatitudeInt) >>
(Position.PrecisionCompensationPower - this.ZoomLevel);
return result;
}
(UpperLeftPosition は、マップ空間の画面の左上隅を表します。) この計算を GPU にオフロードすることを考えています。誰かがそれを行う方法の例を教えてもらえますか?
.NET4.0 を使用していますが、コードはできれば Windows XP でも実行する必要があります。さらに、GPL の下のライブラリは使用できません。