Ich habe eine alte Map Viewer-Anwendung mit WinForms. Es ist sloooooo. (Die Geschwindigkeit war akzeptabel, aber Google Maps, Google Earth kam und Benutzer wurden verwöhnt. Jetzt darf ich machen, wenn schneller :)Koordinatentransformationen auf GPU verschieben
Nach all den offensichtlichen Geschwindigkeit Verbesserungen (Caching, parallele Ausführung, nicht zeichnen Was muss nicht gezeichnet werden, etc.), Mein Profiler zeigt mir, dass der echte Engpass die Koordinatentransformationen beim Konvertieren von Punkten aus dem Kartenraum in den Bildschirmbereich sind. Normalerweise wird ein Conversion-Code sieht wie folgt aus:
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;
}
Die eigentliche Implementierung schwieriger ist. Latitudes/Longitues werden als ganze Zahlen dargestellt. Um keine Genauigkeit zu verlieren, werden sie mit 2^20 (~ 1 Million) multipliziert. So wird eine Koordinate dargestellt.
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;
}
Es ist wichtig, dass die möglichen Skalierungsfaktoren zu Potenz von 2 auch ausdrücklich Dies erlaubt uns gebunden sind, um die Multiplikation mit einem bitshift zu ersetzen. Die eigentliche Algorithmus sieht wie folgt aus:
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 die linke obere Ecke des Bildschirms in der Karte Platz.) Ich denke jetzt diese Berechnung auf die GPU von Offloading. Kann mir jemand ein Beispiel zeigen, wie man das macht?
Wir verwenden .NET4.0, aber der Code sollte vorzugsweise auch unter Windows XP laufen. Außerdem können Bibliotheken unter GPL nicht verwendet werden.
+1 für die theoretischen Grenzen. – user256890
Um die Zahlen in Perspektiven zu setzen, wie hoch ist die ungefähre Geschwindigkeit einer durchschnittlichen 2-Kern-CPU in FLOPs? – user256890
Es hängt davon ab, wie Sie ein FLOP nennen. Nehmen wir an, Ihre 2-Kern-CPU hat eine Taktrate von 2 GHz und ein FLOP benötigt 4 Taktzyklen. Sie könnten 2 * 2/4 = 1 GFLOP machen. Das ist eine sehr grobe Schätzung. –