ขออภัยเกี่ยวกับความยาว
บทนำ
ฉันกำลังพัฒนาซอฟต์แวร์เดสก์ท็อประยะไกล (เพื่อความสนุกสนาน) ใน C # 4.0 สำหรับ Windows Vista / 7 ฉันเคยผ่านอุปสรรคพื้นฐาน: ฉันมีระบบส่งข้อความ UDP ที่มีประสิทธิภาพ, การออกแบบโปรแกรมที่ค่อนข้างสะอาด, ฉันมีไดรเวอร์กระจก (ไดรเวอร์กระจก DFMirage ฟรีจาก DemoForge) เปิดใช้งานและฉันใช้ NAT traversal สำหรับทุกคน ประเภท NAT ยกเว้น Symmetric NATs (แสดงในสถานการณ์ไฟร์วอลล์ขององค์กร)
เกี่ยวกับการถ่ายโอน / แชร์หน้าจอต้องขอบคุณไดรเวอร์กระจกฉันได้รับแจ้งโดยอัตโนมัติเกี่ยวกับขอบเขตของหน้าจอที่เปลี่ยนแปลงและฉันสามารถรวบรวมบิตแมปหน้าจอที่เปลี่ยนแปลงตลอดเวลาของไดร์เวอร์มิเรอร์เป็นบิตแมปของฉันเอง จากนั้นฉันบีบอัดพื้นที่หน้าจอเป็น PNG และส่งออกจากเซิร์ฟเวอร์ไปยังไคลเอนต์ของฉัน สิ่งต่าง ๆ ดูดี แต่ไม่เร็วพอ มันช้าเท่ากับ VNC (btw ฉันไม่ได้ใช้โปรโตคอล VNC เป็นโปรโตคอลสมัครเล่นที่กำหนดเอง)
จากซอฟต์แวร์เดสก์ท็อประยะไกลที่ช้าที่สุดไปจนถึงเร็วที่สุดรายการมักจะเริ่มต้นในทุกการใช้งานแบบ VNC จากนั้นปีนขึ้นไปจนถึง Microsoft Windows Remote Desktop ... และ ... TeamViewer ไม่แน่ใจว่าเกี่ยวกับ CrossLoop, LogMeIn - ฉันไม่ได้ใช้พวกเขา แต่ TeamViewer เป็นเมามันรวดเร็ว มันค่อนข้างมีชีวิตอยู่อย่างแท้จริง ฉันรันtree
คำสั่งบนพรอมต์คำสั่งและอัปเดตด้วยความล่าช้า 20 ms ฉันสามารถท่องเว็บได้ช้ากว่าแล็ปท็อปของฉันเพียงไม่กี่มิลลิวินาที รหัสการเลื่อนในแนวตั้งใน Visual Studio มีเวลาหน่วง 50 ms คิดเกี่ยวกับวิธีแก้ปัญหาการถ่ายโอนหน้าจอที่แข็งแกร่งของ TeamViewer เพื่อให้บรรลุทั้งหมดนี้
VNC ใช้ hooks ที่ยึดตามแบบโพลเพื่อตรวจจับการเปลี่ยนแปลงหน้าจอและการดักจับ / เปรียบเทียบหน้าจอที่ดุร้ายที่สุด อย่างดีที่สุดพวกเขาใช้โปรแกรมควบคุมมิเรอร์เช่น DFMirage ฉันอยู่ในระดับนี้ และพวกเขาใช้สิ่งที่เรียกว่าโปรโตคอล RFB
Microsoft Windows Remote Desktop ดูเหมือนจะสูงกว่า VNC ไปหนึ่งก้าว ฉันได้ยินมาจากที่ใดที่หนึ่งบน StackOverflow ว่า Windows Remote Desktop ไม่ส่งบิตแมปหน้าจอ แต่เป็นคำสั่งการวาดที่เกิดขึ้นจริง มันยอดเยี่ยมมากเพราะมันสามารถส่งข้อความแบบง่าย ๆ (วาดสี่เหลี่ยมนี้ที่พิกัดนี้และระบายสีด้วยการไล่ระดับสีนี้)! เดสก์ท็อประยะไกลนั้นค่อนข้างเร็ว - และเป็นวิธีมาตรฐานในการทำงานจากที่บ้าน และใช้สิ่งที่เรียกว่าโปรโตคอล RDP
ตอนนี้ TeamViewer เป็นปริศนาที่สมบูรณ์สำหรับฉัน เห็นได้ชัดว่าพวกเขาเปิดตัวซอร์สโค้ดสำหรับเวอร์ชัน 2 (TeamViewer เป็นเวอร์ชัน 7 ณ เดือนกุมภาพันธ์ 2555) ผู้คนได้อ่านและกล่าวว่าเวอร์ชัน 2 ไม่มีประโยชน์ - มันเป็นเพียงการปรับปรุง VNC เพียงเล็กน้อยด้วยการข้ามผ่าน NAT อัตโนมัติ
แต่เวอร์ชัน 7 ... มันเร็วอย่างน่าขัน ฉันหมายถึงมันเร็วกว่า Windows Remote Desktop จริง ๆ ฉันสตรีมเกม DirectX 3D ด้วย TeamViewer (ที่ 1 fps แต่เดสก์ท็อประยะไกลของ Windows ไม่ยอมให้ DirectX ทำงาน)
อย่างไรก็ตาม TeamViewer ทำสิ่งนี้ทั้งหมดโดยไม่มีไดรเวอร์มิเรอร์ มีตัวเลือกในการติดตั้งและมันก็เร็วขึ้นเล็กน้อย
คำถาม
คำถามของฉันคือ TeamViewer รวดเร็วขนาดไหนมันจะต้องเป็นไปไม่ได้ หากคุณมีความละเอียด 1920 x 1080 ที่ความลึก 24 บิต (ความลึก 16 บิตจะน่าเกลียดอย่างเห็นได้ชัด) ก็ยังคงดิบ 6,220,800 ไบต์ แม้แต่การใช้ libjpeg-turbo (หนึ่งในห้องสมุดบีบอัด JPG ที่เร็วที่สุดที่ใช้โดยองค์กรขนาดใหญ่) บีบอัดมันลงไปที่ 30KB (ขอใจกว้างมาก) จะใช้เวลาในการกำหนดเส้นทางผ่านเซิร์ฟเวอร์ของ TeamViewer (TeamViewer ข้าม NATs Symmetric ของ บริษัท เซิร์ฟเวอร์ของพวกเขา) และการบีบอัด libjpeg-turbo นั้นต้องใช้เวลาในการบีบอัด การบีบอัด JPG คุณภาพสูงใช้เวลา 175 มิลลิวินาทีสำหรับหน้าจอเต็ม 1920 x 1080 สำหรับฉัน และจำนวนนั้นจะเพิ่มขึ้นหากคอมพิวเตอร์ของโฮสต์ทำการประมวลผล Atom ฉันไม่เข้าใจว่า TeamViewer ปรับการถ่ายโอนหน้าจอให้เหมาะสมได้อย่างไร รูปภาพขนาดเล็กอาจถูกบีบอัดสูง แต่ใช้เวลาอย่างน้อยสิบมิลลิวินาทีในการบีบอัด ภาพขนาดใหญ่ไม่ต้องใช้เวลาบีบอัด แต่ต้องใช้เวลานานในการผ่าน อย่างไรก็ตาม TeamViewer ทำให้กระบวนการทั้งหมดนี้เสร็จสมบูรณ์เพื่อให้ได้ประมาณ 20-25 เฟรมต่อวินาที ฉันเคยใช้เครือข่ายมอนิเตอร์และ TeamViewer ยังคงไม่มีความล่าช้าที่ความเร็ว 500 Kbps และ 1 Mbps (ซอฟแวร์ VNC ล้าหลังสองสามวินาทีในอัตราการถ่ายโอนนั้น) ในช่วงของฉันtree
การทดสอบพร้อมรับคำสั่ง TeamViewer ได้รับข้อมูลขาเข้าในอัตรา 1 Mbps และยังคงทำงานอยู่ที่ 5-6 fps VNC และเดสก์ท็อประยะไกลไม่ทำเช่นนั้น ดังนั้นวิธีการที่?
คำตอบจะค่อนข้างซับซ้อนและซับซ้อนดังนั้นโปรดอย่าโพสต์ของคุณ $ 0.02 ถ้าคุณจะบอกว่าเป็นเพราะพวกเขาใช้ UDP แทน TCP (คุณเชื่อหรือไม่ว่าพวกเขาใช้ TCP จริง ๆ เช่นเดียวกับที่สำเร็จ)
ฉันหวังว่าจะมีนักพัฒนา TeamViewer อยู่ที่นี่ใน StackOverflow
คำตอบที่เป็นไปได้
จะอัปเดตสิ่งนี้เมื่อมีคนตอบกลับ
- ความคิดของฉันคือสิ่งแรกคือ TeamViewer มีการควบคุมเครือข่ายที่ดีมาก ตัวอย่างเช่นพวกเขาแบ่งแพ็คเก็ตขนาดใหญ่ให้อยู่ภายใต้ขนาด MTU และไม่ต้องเสียเวลาเดินทาง พวกเขาอาจมีตะขอแฟนซีทุกประเภทเพื่อตรวจจับการเปลี่ยนแปลงหน้าจอพร้อมกับการเปรียบเทียบภาพ XOR ที่เร็วมาก