Tôi có ứng dụng xem bản đồ cũ bằng WinForms. Đó là sloooooow. (Tốc độ được chấp nhận, nhưng Google Maps, Google Earth xuất hiện và người dùng bị hư hỏng. Bây giờ tôi được phép thực hiện nếu nhanh hơn :)Tắt tải chuyển đổi tọa độ sang GPU
Sau khi thực hiện tất cả các cải thiện tốc độ rõ ràng (caching, thực thi song song, không vẽ những gì không cần phải rút ra, vv), profiler của tôi cho tôi thấy rằng điểm nghẹt thở thực sự là biến đổi tọa độ khi chuyển đổi điểm từ không gian bản đồ sang không gian màn hình. Thông thường một mã chuyển đổi trông như thế này:
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;
}
Việc thực hiện thực sự là phức tạp hơn. Độ cao/longitues được biểu diễn dưới dạng số nguyên. Để tránh mất độ chính xác, chúng được nhân lên 2^20 (~ 1 triệu). Đây là cách phối hợp được biểu diễn.
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;
}
Điều quan trọng là các yếu tố quy mô có thể được ràng buộc rõ ràng với sức mạnh của 2. Điều này cho phép chúng tôi thay thế phép nhân bằng bithift. Vì vậy, các thuật toán thực trông như thế này:
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 góc trên bên trái của màn hình trong không gian bản đồ.) Tôi nghĩ hiện nay của việc dỡ tải tính toán này cho GPU. Bất cứ ai có thể chỉ cho tôi một ví dụ làm thế nào để làm điều đó?
Chúng tôi sử dụng .NET4.0, nhưng mã tốt nhất nên chạy trên Windows XP. Hơn nữa, các thư viện thuộc GPL mà chúng tôi không thể sử dụng.
+1 để hiển thị ranh giới lý thuyết. – user256890
Chỉ cần đặt các con số theo quan điểm, tốc độ gần đúng của CPU 2 lõi trung bình trong FLOP là bao nhiêu? – user256890
Tùy thuộc vào những gì bạn gọi là FLOP. Giả sử CPU 2 lõi của bạn có tốc độ xung nhịp là 2 GHz và FLOP mất 4 chu kỳ đồng hồ. Bạn có thể làm 2 * 2/4 = 1 GFLOP. Đó là một ước tính rất thô sơ. –