Uzunluk için üzgünüm, biraz gerekli.
Giriş
Windows Vista / 7 için C # 4.0'da bir uzak masaüstü yazılımı (sadece eğlence için) geliştiriyorum. Temel engellerden geçtim: Sağlam bir UDP mesajlaşma sistemim, nispeten temiz program tasarımım var, bir ayna sürücüm var (DemoForge'dan ücretsiz DFMirage ayna sürücüsü) ve çalışıyoruz ve herkes için NAT geçişi uyguladım Simetrik NAT'lar dışındaki NAT türleri (kurumsal güvenlik duvarı durumlarında bulunur).
Ekran aktarımı / paylaşımı ile ilgili olarak, ayna sürücüsü sayesinde, değiştirilen ekran bölgelerinden otomatik olarak haberdar oluyorum ve ayna sürücüsünün sürekli değişen ekran bit eşlemini kendi bitmap'ime marshal edebilirim. Sonra ekran bölgesini PNG olarak sıkıştırıyorum ve sunucudan istemcime gönderiyorum. İşler oldukça iyi görünüyor, ama yeterince hızlı değil. VNC kadar yavaş (btw, VNC protokolünü kullanmıyorum, sadece özel bir amatör protokol).
En yavaş uzak masaüstü yazılımından en hızlıya kadar, liste genellikle tüm VNC benzeri uygulamalarda başlar, daha sonra Microsoft Windows Uzak Masaüstü'ne yükselir ... ve sonra ... TeamViewer. CrossLoop, LogMeIn hakkında pek emin değilim - Onları kullanmadım, ancak TeamViewer inanılmaz derecede hızlı. Kelimenin tam anlamıyla canlı. tree
Komut İstemi'nde bir komut çalıştırdım ve 20 ms gecikmeyle güncellendi. Web'e dizüstü bilgisayarımdakinden birkaç milisaniyede daha yavaş göz atabilirim. Visual Studio'da dikey olarak kod kaydırma 50 ms gecikme süresi vardır. Tüm bunları gerçekleştirmek için TeamViewer'ın ekran aktarma çözümünün ne kadar sağlam olması gerektiğini düşünün.
VNC'ler, ekran değişimini ve kaba kuvvet ekran yakalama / en kötü durumlarını tespit etmek için anket tabanlı kancalar kullanır. En iyi ihtimalle DFMirage gibi bir ayna sürücüsü kullanıyorlar. Ben bu seviyedeyim. Ve RFB protokolü adı verilen bir şey kullanıyorlar.
Microsoft Windows Uzak Masaüstü görünüşe göre VNC'den bir adım daha yükseğe çıkıyor. StackOverflow'da bir yerden Windows Uzak Masaüstü'nün ekran bitmap'leri değil, gerçek çizim komutları gönderdiğini duydum. Bu oldukça parlak, çünkü sadece basit metin gönderebilir (bu dikdörtgeni bu koordinatta çizin ve bu gradyanla renklendirin)! Uzak Masaüstü gerçekten çok hızlı - ve evden çalışmanın standart yolu. Ve RDP protokolü denilen bir şey kullanıyor.
Şimdi TeamViewer benim için tam bir gizem. Görünüşe göre, Sürüm 2 için kaynak kodlarını yayınladılar (TeamViewer Şubat 2012 itibariyle Sürüm 7'dir). İnsanlar bunu okudu ve Sürüm 2'nin işe yaramaz olduğunu söyledi - otomatik NAT geçişi ile VNC üzerinde sadece birkaç iyileştirme olduğunu.
Ama Versiyon 7 ... şimdi çok hızlı. Yani, aslında Windows Uzak Masaüstü'nden daha hızlı. TeamViewer ile DirectX 3D oyunlar yayınladım (1 fps'de, ancak Windows Uzak Masaüstü DirectX'in çalışmasına bile izin vermiyor).
Bu arada, TeamViewer tüm bunları bir ayna sürücüsü olmadan yapar . Bir tane yüklemek için bir seçenek var ve sadece biraz daha hızlı hale geliyor.
Soru
Sorum şu: TeamViewer nasıl bu kadar hızlı?Bu mümkün olmamalı. 24 bit derinlikte bile 1920 x 1080 çözünürlüğe sahipseniz (16 bit derinlik fark edilir derecede çirkin olurdu), yine de 6.220.800 bayt ham. Libjpeg-turbo (büyük şirketler tarafından kullanılan en hızlı JPG sıkıştırma kitaplıklarından biri) bile kullanıldığında, 30KB'ye kadar sıkıştırılması (son derece cömert olalım), TeamViewer sunucuları üzerinden geçiş yapmak zaman alacaktır (TeamViewer, kurumsal Simetrik NAT'ları trafiği proxy üzerinden geçirerek zaman alacaktır sunucuları). Ve bu libjpeg-turbo sıkıştırmasının sıkıştırılması zaman alacaktı. Yüksek kaliteli JPG sıkıştırma benim için tam 1920 x 1080 ekran görüntüsü için 175 milisaniye sürüyor. Ve ana bilgisayarın bilgisayarı bir Atom işlemci kullanıyorsa bu sayı artar. TeamViewer'ın ekran aktarımını nasıl bu kadar iyi optimize ettiğini anlamıyorum. Yine, küçük boyutlu görüntüler oldukça sıkıştırılmış olabilir, ancak sıkıştırmak için en az on milisaniye sürün. Büyük boyutlu görüntülerin sıkıştırılması zaman almaz, ancak geçmesi uzun zaman alır. Her nasılsa, TeamViewer saniyede yaklaşık 20-25 kare elde etmek için tüm süreci tamamlar. Bir ağ monitörü kullandım ve TeamViewer 500 Kbps ve 1 Mbps hızlarında hala gecikmiyor (VNC yazılımı bu aktarım hızında birkaç saniye gecikiyor). Sırasındatree
Komut İstemi testi, TeamViewer 1 Mbps hızında gelen verileri alıyordu ve hala 5-6 fps çalıştırıyordu. VNC ve uzak masaüstü bunu yapmaz. Nasıl?
Cevaplar biraz karmaşık ve karmaşık olacak, bu yüzden eğer sadece TCP yerine UDP kullandıklarını söyleyecekseniz, 0,02 $ 'ınızı göndermeyin (aslında TCP'yi başarılı bir şekilde kullandıklarına inanırsınız).
StackOverflow üzerinde bir yerde bir TeamViewer geliştirici olduğunu umuyorum.
Potansiyel Yanıtlar
Kullanıcılar yanıtladıktan sonra bunu güncelleyecek.
- Düşüncelerim, her şeyden önce, TeamViewer'ın çok iyi bir ağ kontrolüne sahip olduğudur. Örneğin, büyük paketleri MTU boyutunun hemen altına bölerler ve asla bir yolculuğu boşa harcamazlar. Muhtemelen son derece hızlı XOR görüntü karşılaştırmalarıyla birlikte ekran değişikliklerini tespit etmek için her türlü süslü kancaya sahiptirler.