私はWinFormsを使用して従来のマップビューアアプリケーションを持っています。それはsloooooowです。 (速度は許容されるが、Google Maps、Google Earthが登場し、ユーザーは腐敗してしまった。)もっと速くすればもっと速く作ることができるようになりました:GPUに座標変換をオフロード
明白な速度向上何も描画する必要はありません、など)、私のプロファイラは私が実際の窒息ポイントは座標変換であることを私に示してマップスペースからスクリーンスペースにポイントを変換するとき。 通常、変換コードは次のようになります。
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は、マップスペースの画面の左上隅をrepresentents。) 私はGPUにこの計算をオフロードするの、今考えています。誰も私に例を示すことができますか?
私たちは.NET4.0を使用しますが、コードはWindows XPでも実行するのが望ましいです。さらに、GPLの下にあるライブラリは使用できません。
+1理論的境界を示すため。 – user256890
数字をパースペクティブに入れるだけで、平均2コアCPUのおよその速度はどのくらいですか? – user256890
これはあなたがFLOPと呼ぶものによって異なります。たとえば、2コアCPUのクロック速度が2 GHzで、FLOPが4クロックサイクルかかるとします。あなたは2 * 2/4 = 1 GFLOPを行うことができます。それは非常に原油の推定値です。 –