เทอร์มินัลอีมูเลเตอร์สามารถเร็วเท่ากับ TTY 1-6 ได้หรือไม่?


59

ฉันลองใช้ตัวจำลองเทอร์มินัลเมื่อไม่นานมานี้จาก gnome-terminal, aterm, xterm, wterm, rxvt ในตัว การทดสอบที่ฉันทำอยู่ในลำดับนี้:

  1. เปิดหน้าต่าง tmux ที่มี 2 บานหน้าต่าง
  2. บานหน้าต่างด้านซ้ายจะเป็นงานที่ต้องใช้ความละเอียดสูงเช่นgrep a /et/c -rหรือแบบง่ายtime seq -f 'blah blah %g' 100000
  3. บานหน้าต่างด้านขวาจะเป็นหน้าต่างกลุ่มที่มีไวยากรณ์เปิดไฟล์ใด ๆ ที่มีรหัสมากกว่า> 100 บรรทัด

เมื่อบานหน้าต่างด้านซ้ายกำลังพิมพ์เอาต์พุตจำนวนมากบานหน้าต่างด้านขวาดูเหมือนจะช้ามากและไม่ตอบสนองฉันพยายามเลื่อนเป็นกลุ่ม แต่ใช้เวลา 1-2 วินาทีในการเปลี่ยน เมื่อฉันพยายามกดCtrlCที่บานหน้าต่างด้านซ้ายมันจะรอนานกว่า 10 วินาทีก่อนที่มันจะหยุด

เมื่อฉันทำสิ่งเดียวกันใน TTY (การกดCTRL+ ALT+ ( F[1-6])) มันจะไม่เกิดขึ้นและบานหน้าต่างทั้งสองตอบสนองได้ดีมาก

ฉันเปลี่ยนการกำหนดค่าบางอย่างเช่นตัวอักษร antialias การเปลี่ยนสีใช้การตั้งค่าเริ่มต้นและเปลี่ยนเป็น xmonad และ openbox แต่มันไม่เปลี่ยนแปลงอะไรเลย

ผลลัพธ์ของtime seq -f 'blah blah %g' 100000เทอร์มินัลเหล่านี้ไม่แตกต่างกันมาก แต่การตอบสนองจะแตกต่างกันโดยเฉพาะอย่างยิ่งเมื่อฉันเรียกใช้บานหน้าต่าง tmux (หรือมัลติเพล็กเซอร์อื่น ๆ ) FYI ฉันกำลังเรียกใช้พวกเขาทั้งหมดในโหมดขยายใหญ่สุด

ฉันอ่านเกี่ยวกับเทอร์มินัลบัฟเฟอร์เฟรมแล้ว แต่ไม่แน่ใจว่ามันทำงานอย่างไรและจะใช้เพื่อเร่งเครื่องจำลองเทอร์มินัลของฉันได้อย่างไร

ดังนั้นคำถามของฉันคืออะไรทำให้เทอร์มินัลอีมูเลเตอร์ช้ากว่า TTY มีความเป็นไปได้ที่จะทำให้เร็วเท่า TTY หรือไม่? อาจเป็นการเร่งความเร็วฮาร์ดแวร์หรืออะไรซักอย่าง สิ่งหนึ่งที่ฉันรู้ความละเอียดของฉันในเซิร์ฟเวอร์ X เมื่อใช้งานเทอร์มินัลอีมูเลเตอร์สูงสุดคือ 1920x1080 และเมื่อฉันใช้ TTY มันน้อยกว่านั้น แต่ฉันไม่แน่ใจว่าสิ่งนี้จะส่งผลกระทบต่อประสิทธิภาพการทำงานอย่างไร


ดูเหมือนจะมีบัฟเฟอร์ขนาดใหญ่อยู่ที่ไหนสักแห่ง
Thorbjørn Ravn Andersen

2
แจ้งให้ทราบ tty [1-6] จะไม่เร็วอย่างรวดเร็ว ในเครื่องที่ฉันใช้อยู่คอนโซลข้อความช้ามาก ๆ ในขณะที่ xterm ทำงานได้ดี
把友情留在无盐

คำตอบ:


75

เมื่อ GUI เทอร์มินัลอีมูเลเตอร์พิมพ์สตริงจะต้องแปลงสตริงเป็น codepoints แบบอักษรส่ง codepoints ไปยังตัวแสดงฟอนต์รับบิตแมปกลับและblitบิตแมปนั้นไปยังจอแสดงผลผ่าน X server

ตัวแสดงฟอนต์ต้องเรียกร่ายมนตร์และเรียกใช้ (คุณรู้หรือไม่ว่าฟอนต์ Truetype / Opentype เป็นโปรแกรมที่ทำงานภายในเครื่องเสมือนในฟอนต์เรนเดอร์?) ในระหว่างกระบวนการเรียกใช้ glyph แต่ละครั้งการตัดสินใจจำนวนบ้านั้นเกี่ยวกับการวัดแบบอักษรการจัดช่องไฟ (แม้ว่าแบบอักษร monospace และการจัดช่องไฟไม่เข้ากัน) การปฏิบัติตาม Unicode และก่อนที่เราจะถึง rasteriser ซึ่งอาจใช้ sub พิกเซลที่อยู่ เทอร์มินัลจะต้องนำบัฟเฟอร์ที่สร้างโดยตัวพิมพ์แรสเตอร์และ blit ไปยังตำแหน่งที่ถูกต้องดูแลการแปลงรูปแบบพิกเซลช่องอัลฟา (สำหรับการกำหนดแอดเดรสพิกเซลย่อย) การเลื่อน (ซึ่งเกี่ยวข้องกับการblitting มากขึ้น ) เป็นต้น

ในการเปรียบเทียบการเขียนสตริงไปยังเทอร์มินัลเสมือนที่ทำงานในโหมดข้อความ (หมายเหตุ: ไม่ใช่คอนโซลกราฟิก) เกี่ยวข้องกับการเขียนสตริงนั้นไปยังหน่วยความจำวิดีโอ 'สวัสดีชาวโลก!' เกี่ยวข้องกับการเขียน 13 ไบต์ (13 คำ 16 บิตหากคุณต้องการสีด้วย) Rasteriser ตัวอักษร X ยังไม่ได้เริ่มการออกกำลังกายยืดและข้อนิ้วแตกและเราเสร็จแล้ว นี่คือเหตุผลที่โหมดข้อความมีความสำคัญอย่างไม่น่าเชื่อในทศวรรษที่ผ่านมา มันเร็วมากที่จะใช้ แม้การเลื่อนจะง่ายกว่าที่คุณคิด: แม้แต่บน MDA และ CGA ที่ใช้ Motorola 6845 คุณก็สามารถเลื่อนหน้าจอในแนวตั้งได้ด้วยการเขียนค่า 8 บิตเดียวไปยังรีจิสเตอร์ (อาจเป็น 16 ... มันยาวเกินไป) วงจรรีเฟรชหน้าจอที่เหลือทำ คุณกำลังเปลี่ยนที่อยู่เริ่มต้นของเฟรมบัฟเฟอร์เป็นหลัก

ไม่มีสิ่งใดที่คุณสามารถทำได้เพื่อทำให้เทอร์มินัลกราฟิกเร็วเท่าเทอร์มินัลโหมดข้อความบนคอมพิวเตอร์เครื่องเดียวกัน แต่โปรดจำไว้ว่ามีคอมพิวเตอร์ที่มีโหมดข้อความช้ากว่าเทอร์มินัลกราฟิกที่ช้าที่สุดที่คุณเคยเห็นในคอมพิวเตอร์สมัยใหม่ พีซี IBM ดั้งเดิมค่อนข้างแย่ (DOS ทำการเลื่อนซอฟต์แวร์ถอนหายใจ) เมื่อฉันเห็นคอนโซล Minix เครื่องแรกของฉันที่ 80286 ฉันรู้สึกทึ่งกับความเร็วในการเลื่อน (กระโดด) ความคืบหน้าเป็นสิ่งที่ดี

อัปเดต: วิธีเร่งความเร็วเทอร์มินัล

@ poigeได้กล่าวถึงสามในคำตอบของเขาแล้ว แต่นี่เป็นของฉันเอง:

  • ลดขนาดของเทอร์มินัล อาคารผู้โดยสารของฉันมีแนวโน้มที่จะเติบโตจนกว่าพวกเขาจะเติมหน้าจอและพวกเขาก็ช้าเช่นที่พวกเขาทำ ฉันรู้สึกโมโหรำคาญรำคาญกับกราฟิกเทอร์มินัลจากนั้นฉันปรับขนาดและทุกอย่างดีขึ้น :)
  • (@poige) ใช้โปรแกรมจำลองเทอร์มินัลอื่น คุณสามารถเพิ่มความเร็วได้อย่างมหาศาลด้วยคุณสมบัติที่ทันสมัยบางอย่าง xtermและrxvtทำงานได้ดีจริงๆมันมีโปรแกรมจำลองเทอร์มินัลที่ยอดเยี่ยม ฉันสงสัยว่าการทดสอบของคุณอาจแสดงว่าพวกเขาทำงานได้ดีกว่าการทดสอบแบบ 'ทันสมัย'
  • (@poige) อย่าใช้แบบอักษรที่ปรับขนาดได้ ปี 1986 อาจเรียกและขอให้เครื่องปลายทางกลับมา แต่คุณไม่สามารถปฏิเสธได้ว่าจะเร็วกว่านี้ ;)
  • (@poige) ปิดแรสเตอร์แบบอักษรลงโดยการปิดการกำหนดแอดเดรส anti-aliasing / sub-pixel และการบอกใบ้ ส่วนใหญ่อนุญาตให้แทนที่ในตัวแปรสภาพแวดล้อมดังนั้นคุณไม่จำเป็นต้องทำเช่นนี้ทั่วโลก หมายเหตุ: ไม่มีจุดหมายหากคุณเลือกแบบอักษรบิตแมป
  • สิ่งนี้จะได้รับความเสียหายมากที่สุด: อย่าใช้ (หลายบานหน้าต่าง)tmux - รันสองขั้วแยกกัน เมื่อtmuxแสดงสองบานหน้าต่างจะต้องใช้คำสั่งเทอร์มินัลเพื่อเลื่อนเคอร์เซอร์ไปรอบ ๆ แม้ว่าเทอร์มินัลไลบรารีสมัยใหม่นั้นเร็วและดีที่สุดในการปรับให้เหมาะสม แต่ก็ยังคงขโมยไบต์จากแบนด์วิธเทอร์มินัลดิบของคุณ เพื่อเลื่อนเคอร์เซอร์ไปยังแถวโดยพลการในสถานีธันวาคม VT ESC [ row ; col Hได้ที่คุณส่ง นั่นคือ 6-10 ไบต์ ด้วยเทอร์มินัลหลายตัวคุณกำลังแยกงานออกไปโดยไม่จำเป็นต้องวางตำแหน่งเพิ่มประสิทธิภาพบัฟเฟอร์และสิ่งอื่น ๆ ทั้งหมดcursesและใช้ประโยชน์จากคอร์ CPU หลาย ๆ ตัว

5
+1 แต่สิ่งที่ tmux นั้นซับซ้อนกว่าการส่งรหัสยกเว้นบางอย่างออกไป เทอร์มินัลหมายถึงเลื่อนทั้งหน้าต่างไม่ใช่ครึ่งหนึ่ง ดังนั้นเมื่อ tmux ต้องย้ายข้อความทั้งหมดในบานหน้าต่างด้านซ้ายขึ้นบรรทัดมันเพียงแค่สร้างบรรทัดใหม่และปล่อยให้เทอร์มินัลขยับขึ้นมันต้องวาดใหม่ทั้งบานหน้าต่าง
Patrick

1
ค่อนข้างถูกต้อง! ฉันลืมเรื่องนั้นไป แม้ว่าจะมีได้รับขั้วที่สามารถเลื่อนเป็นส่วนหนึ่งของหน้าจอ (IIRC มันถูกเรียกว่า 'ปกป้อง' ส่วนของหน้าจอ - มันถูกนำมาใช้ในรูปแบบอื่น ๆ ) มันก็ไม่เคยมีความยืดหยุ่นโดยเฉพาะอย่างยิ่งและอาจจะไม่ได้รับการสนับสนุนโดยการเลียนแบบขั้วที่ทันสมัย แม้ว่าคุณจะพบว่าคำสั่งที่ล้าสมัยจริงๆยังคงใช้อยู่ในปัจจุบัน
Alexios

ตอบกลับหลังจาก 3 ปี แต่หวังว่าบางคนจะพบว่ามีประโยชน์ ฉันสังเกตเห็นความล่าช้าเฉพาะเมื่อฉันแยกแนวตั้งในเสียงเรียกเข้าของฉัน (ใช่แม้กระทั่ง NERDTree) แต่การแบ่งตามปกติดูเหมือนจะไม่เป็นปัญหาในระหว่างการเลื่อน
กรีด

17

ในขณะที่ @Alexios อธิบายเหตุผลได้ค่อนข้างดีฉันสามารถพูดถึงหลายสิ่งหลายอย่างซึ่งค่อนข้างบรรเทาอาการปวด:


1
นอกจากนี้และนี่คือสิ่งที่เจ็บปวดลดขนาดของเทอร์มินัล (OP ใช้หน้าต่าง 1920x1200px) ฉันชอบอาคารผู้โดยสารขนาดใหญ่และฉันมักจะเติบโตจนกว่าพวกเขาจะใหญ่เกือบเท่ากับหน้าจอ แต่ความเร็วเทอร์มินัลจะลดลงเมื่ออาคารเติบโต แม้แต่konsole(ซึ่งฉันชอบ)
Alexios

3
konsoleทำการปรับปรุงหน้าจอขี้เกียจ: แทนที่จะแสดงผลทันทีมันจะรอเวลาเล็กน้อยเพื่อให้ได้ผลลัพธ์มากขึ้นเพื่อที่จะอัปเดต "แบตช์" นี่คือเหตุผลว่าทำไมมันถึงทำงานได้ดีจนถึงจุดที่ต้องตอบสนองอย่างเต็มที่กับการทดสอบความเครียดของ OP
ninjalj

2
ค่อนข้างแน่ใจว่าการแสดงผลแบบอักษรถูกแคชในบางจุด ฉันไม่คิดว่าพิกเซลที่เป็นตัวอักษร f จะถูกเรนเดอร์ซ้ำอีกครั้งจากการกำหนดเวกเตอร์ทุกครั้งที่มันถูกคัดลอกไปยัง pixmap (เว้นแต่จะต้องมีการแสดงผลในขนาดใหม่หรือมุมใหม่) ฉันจะไม่โต้แย้งความจริงที่ว่ามีบางตัวอักษรบิตแมปที่ดีจริงๆซึ่งอาจเป็นตัวเลือกที่ดีที่สุดสำหรับการปรากฏตัวเพียงอย่างเดียวถ้ามันเกิดขึ้นกับขนาดที่คุณต้องการ
Peter Cordes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.