Maaf tentang panjangnya, itu agak perlu.
pengantar
Saya sedang mengembangkan perangkat lunak desktop jarak jauh (hanya untuk bersenang-senang) di C # 4.0 untuk Windows Vista / 7. Saya telah melewati rintangan dasar: Saya memiliki sistem pesan UDP yang kuat, desain program yang relatif bersih, saya punya driver cermin (driver cermin DFMirage gratis dari DemoForge) aktif dan berjalan, dan saya telah menerapkan NAT traversal untuk semua Jenis NAT kecuali NAT Simetris (ada dalam situasi firewall perusahaan).
Mengenai transfer / berbagi layar, terima kasih kepada driver cermin, saya secara otomatis diberitahu tentang daerah layar yang berubah dan saya dapat dengan mudah menyusun bitmap layar driver cermin yang selalu berubah ke bitmap saya sendiri. Lalu saya kompres wilayah layar sebagai PNG dan mengirimkannya dari server ke klien saya. Hal-hal terlihat cukup bagus, tetapi tidak cukup cepat. Ini sama lambatnya dengan VNC (btw, saya tidak menggunakan protokol VNC, hanya protokol amatir khusus).
Dari perangkat lunak desktop jarak jauh paling lambat hingga yang tercepat, daftar biasanya dimulai dari semua implementasi mirip VNC, kemudian naik ke Microsoft Windows Remote Desktop ... dan kemudian ... TeamViewer. Tidak begitu yakin tentang CrossLoop, LogMeIn - Saya belum pernah menggunakannya, tetapi TeamViewer sangat cepat. Secara harfiah hidup. Saya menjalankan tree
perintah pada Command Prompt dan diperbarui dengan penundaan 20 ms. Saya dapat menelusuri web hanya beberapa milidetik lebih lambat dari pada laptop saya. Kode gulir secara vertikal di Visual Studio memiliki jeda waktu 50 ms. Pikirkan tentang seberapa kuat solusi transfer layar TeamViewer harus menyelesaikan semua ini.
VNC menggunakan kait berbasis jajak pendapat untuk mendeteksi perubahan layar dan menangkap / membandingkan layar dengan kasar secara terburuk. Yang terbaik, mereka menggunakan driver cermin seperti DFMirage. Saya di level ini. Dan mereka menggunakan sesuatu yang disebut protokol RFB.
Microsoft Windows Remote Desktop tampaknya berjalan satu langkah lebih tinggi dari VNC. Saya mendengar, dari suatu tempat di StackOverflow, bahwa Windows Remote Desktop tidak mengirim bitmap layar, tetapi perintah menggambar yang sebenarnya. Itu cukup brilian, karena hanya bisa mengirim teks sederhana (gambar kotak ini pada koordinat ini dan warnai dengan gradien ini)! Remote Desktop sangat cepat - dan ini adalah cara standar untuk bekerja dari rumah. Dan ia menggunakan sesuatu yang disebut protokol RDP.
Sekarang TeamViewer adalah misteri bagi saya. Rupanya, mereka merilis kode sumber mereka untuk Versi 2 (TeamViewer adalah Versi 7 pada Februari 2012). Orang-orang telah membacanya dan mengatakan bahwa Versi 2 tidak berguna - bahwa itu hanya beberapa perbaikan dari VNC dengan NAT traversal otomatis.
Tapi Versi 7 ... sekarang sangat cepat. Maksud saya, ini sebenarnya lebih cepat dari Windows Remote Desktop. Saya telah mengalirkan game DirectX 3D dengan TeamViewer (pada 1 fps, tetapi Windows Remote Desktop bahkan tidak mengizinkan DirectX untuk menjalankan).
Omong-omong, TeamViewer melakukan semua ini tanpa driver cermin. Ada opsi untuk menginstal satu, dan itu mendapat sedikit lebih cepat.
Pertanyaan
Pertanyaan saya adalah, bagaimana TeamViewer begitu cepat?Itu tidak mungkin. Jika Anda memiliki resolusi 1920 x 1080 bahkan kedalaman 24 bit (kedalaman 16 bit akan terasa jelek), itu masih 6.220.800 byte mentah. Bahkan dengan menggunakan libjpeg-turbo (salah satu pustaka kompresi JPG tercepat yang digunakan oleh perusahaan besar), mengompresnya menjadi 30KB (mari kita menjadi sangat murah hati), akan membutuhkan waktu untuk merutekan melalui server TeamViewer (TeamViewer mem-bypass Symmetric NATs perusahaan hanya dengan mem-proxy lalu lintas melalui server mereka). Dan kompresi libjpeg-turbo akan membutuhkan waktu untuk dikompres. Kompresi JPG berkualitas tinggi membutuhkan 175 milidetik untuk screenshot 1920 hingga 1080 penuh untuk saya. Dan angka itu naik jika komputer host menjalankan prosesor Atom. Saya tidak mengerti bagaimana TeamViewer telah mengoptimalkan transfer layar mereka dengan sangat baik. Sekali lagi, gambar ukuran kecil mungkin sangat terkompresi, tetapi gunakan setidaknya puluhan milidetik untuk mengompres. Gambar ukuran besar tidak membutuhkan waktu untuk dikompres, tetapi membutuhkan waktu lama untuk melewatinya. Entah bagaimana, TeamViewer menyelesaikan seluruh proses ini untuk mendapatkan sekitar 20-25 frame per detik. Saya telah menggunakan monitor jaringan, dan TeamViewer masih tertinggal dengan kecepatan 500 Kbps dan 1 Mbps (perangkat lunak VNC tertinggal selama beberapa detik pada kecepatan transfer itu). Selama sayatree
Command Prompt test, TeamViewer menerima data masuk dengan kecepatan 1 Mbps dan masih menjalankan 5-6 fps. VNC dan remote desktop tidak melakukan itu. Jadi bagaimana?
Jawabannya akan sedikit rumit dan rumit, jadi tolong jangan posting $ 0,02 Anda jika Anda hanya akan mengatakan itu karena mereka menggunakan UDP bukan TCP (apakah Anda yakin mereka benar-benar menggunakan TCP sama berhasilnya).
Saya berharap ada pengembang TeamViewer di StackOverflow.
Jawaban Potensial
Akan memperbarui ini setelah orang membalas.
- Pikiran saya, pertama-tama, TeamViewer memiliki kontrol jaringan yang sangat baik. Sebagai contoh, mereka membagi paket besar menjadi tepat di bawah ukuran MTU dan tidak pernah membuang-buang perjalanan. Mereka mungkin memiliki segala macam kait mewah untuk mendeteksi perubahan layar bersama dengan perbandingan gambar XOR yang sangat cepat.