Xin lỗi về chiều dài, nó hơi cần thiết.
Giới thiệu
Tôi đang phát triển một phần mềm máy tính từ xa (chỉ để giải trí) trong C # 4.0 cho Windows Vista / 7. Tôi đã vượt qua những trở ngại cơ bản: Tôi có một hệ thống nhắn tin UDP mạnh mẽ, thiết kế chương trình tương đối sạch sẽ, tôi đã có một trình điều khiển gương (trình điều khiển gương DFMirage miễn phí từ DemoForge) và tôi đã triển khai NAT traversal cho tất cả Các loại NAT ngoại trừ NAT đối xứng (có mặt trong các tình huống tường lửa của công ty).
Về chuyển / chia sẻ màn hình, nhờ trình điều khiển gương, tôi tự động được thông báo về các vùng màn hình đã thay đổi và tôi có thể chỉ đơn giản là sắp xếp bitmap màn hình luôn thay đổi của trình điều khiển gương thành bitmap của riêng tôi. Sau đó, tôi nén vùng màn hình dưới dạng PNG và gửi nó từ máy chủ đến máy khách của mình. Mọi thứ có vẻ khá tốt, nhưng nó không đủ nhanh. Nó cũng chậm như VNC (btw, tôi không sử dụng giao thức VNC, chỉ là một giao thức nghiệp dư tùy chỉnh).
Từ phần mềm máy tính từ xa chậm nhất đến nhanh nhất, danh sách thường bắt đầu ở tất cả các triển khai giống như VNC, sau đó leo lên Microsoft Windows Remote Desktop ... và sau đó ... TeamViewer. Không hoàn toàn chắc chắn về CrossLoop, LogMeIn - Tôi chưa sử dụng chúng, nhưng TeamViewer cực kỳ nhanh. Nó hoàn toàn sống theo nghĩa đen. Tôi đã chạy một tree
lệnh trên Command Prompt và nó được cập nhật với độ trễ 20 ms. Tôi có thể duyệt web chậm hơn vài mili giây so với trên máy tính xách tay của mình. Mã cuộn theo chiều dọc trong Visual Studio có thời gian trễ 50 ms. Hãy suy nghĩ về giải pháp chuyển màn hình của TeamViewer mạnh mẽ như thế nào để hoàn thành tất cả điều này.
Các VNC sử dụng các móc dựa trên cuộc thăm dò để phát hiện sự thay đổi màn hình và bắt giữ / so sánh màn hình vũ lực ở mức tồi tệ nhất. Tốt nhất, họ sử dụng trình điều khiển gương như DFMirage. Tôi đang ở cấp độ này. Và họ sử dụng một cái gì đó gọi là giao thức RFB.
Microsoft Windows Remote Desktop rõ ràng cao hơn một bước so với VNC. Tôi nghe nói, từ một nơi nào đó trên StackOverflow, Windows Remote Desktop không gửi bitmap màn hình, mà là các lệnh vẽ thực tế. Điều đó khá tuyệt vời, bởi vì nó chỉ có thể gửi văn bản đơn giản (vẽ hình chữ nhật này tại tọa độ này và tô màu nó bằng gradient này)! Remote Desktop thực sự khá nhanh - và đó là cách làm việc tiêu chuẩn ở nhà. Và nó sử dụng một cái gì đó gọi là giao thức RDP.
Bây giờ TeamViewer là một bí ẩn hoàn toàn đối với tôi. Rõ ràng, họ đã phát hành mã nguồn của họ cho Phiên bản 2 (TeamViewer là Phiên bản 7 kể từ tháng 2 năm 2012). Mọi người đã đọc nó và nói rằng Phiên bản 2 là vô dụng - đó chỉ là một vài cải tiến so với VNC với tính năng NAT tự động.
Nhưng phiên bản 7 ... bây giờ nhanh đến mức nực cười. Ý tôi là, nó thực sự nhanh hơn Windows Remote Desktop. Tôi đã phát trực tuyến các trò chơi DirectX 3D với TeamViewer (ở tốc độ 1 khung hình / giây, nhưng Windows Remote Desktop thậm chí không cho phép DirectX chạy).
Nhân tiện, TeamViewer thực hiện tất cả điều này mà không cần trình điều khiển gương. Có một tùy chọn để cài đặt một, và nó chỉ nhanh hơn một chút.
Câu hỏi
Câu hỏi của tôi là, TeamViewer nhanh như thế nào?Nó không phải là có thể. Nếu bạn có độ phân giải 1920 x 1080 ở độ sâu thậm chí 24 bit (độ sâu 16 bit sẽ rất xấu), đó vẫn là 6.220.800 byte. Ngay cả khi sử dụng libjpeg-turbo (một trong những thư viện nén JPG nhanh nhất được sử dụng bởi các tập đoàn lớn), việc nén nó xuống 30KB (hãy cực kỳ hào phóng), sẽ mất thời gian để định tuyến qua các máy chủ của TeamViewer (TeamViewer bỏ qua NAT đối xứng của công ty bằng cách ủy quyền lưu lượng truy cập thông qua máy chủ của họ). Và nén libjpeg-turbo sẽ mất thời gian để nén. Nén JPG chất lượng cao mất 175 mili giây cho ảnh chụp màn hình 1920 x 1080 đầy đủ cho tôi. Và con số đó tăng lên nếu máy tính của máy chủ chạy bộ xử lý Atom. Tôi chỉ đơn giản là không hiểu làm thế nào TeamViewer đã tối ưu hóa việc chuyển màn hình của họ rất tốt. Một lần nữa, hình ảnh kích thước nhỏ có thể bị nén rất cao, nhưng mất ít nhất hàng chục mili giây để nén. Hình ảnh kích thước lớn không mất thời gian để nén, nhưng mất nhiều thời gian để vượt qua. Bằng cách nào đó, TeamViewer hoàn thành toàn bộ quá trình này để có được khoảng 20-25 khung hình mỗi giây. Tôi đã sử dụng màn hình mạng và TeamViewer vẫn không bị lag ở tốc độ 500 Kb / giây và 1 Mb / giây (độ trễ phần mềm VNC trong vài giây với tốc độ truyền đó). Trong thời gian của tôitree
Kiểm tra dấu nhắc lệnh, TeamViewer đã nhận được dữ liệu gửi đến với tốc độ 1 Mb / giây và vẫn chạy 5-6 khung hình / giây. VNC và máy tính để bàn từ xa không làm điều đó. Vậy làm thế nào?
Các câu trả lời sẽ hơi phức tạp và phức tạp, vì vậy vui lòng không đăng 0,02 đô la của bạn nếu bạn chỉ nói rằng vì họ sử dụng UDP thay vì TCP (bạn có tin rằng họ thực sự sử dụng TCP như vậy không).
Tôi hy vọng có một nhà phát triển TeamViewer ở đâu đó trên StackOverflow.
Câu trả lời tiềm năng
Sẽ cập nhật điều này một khi mọi người trả lời.
- Suy nghĩ của tôi, trước hết, rằng TeamViewer có khả năng kiểm soát mạng rất tốt. Ví dụ, họ chia các gói lớn thành dưới kích thước MTU và không bao giờ lãng phí một chuyến đi. Họ có thể có tất cả các loại móc lạ mắt để phát hiện thay đổi màn hình cùng với việc so sánh hình ảnh XOR cực nhanh.