คำถามติดแท็ก double-buffering

1
ปัญหาบัฟเฟอร์สองหรือสามแก้ไขในเกมสมัยใหม่อย่างไร
ฉันต้องการตรวจสอบว่าการทำความเข้าใจเกี่ยวกับสาเหตุของการใช้การบัฟเฟอร์สองเท่า (หรือสามเท่า) ถูกต้องหรือไม่: จอภาพที่มีการรีเฟรช 60Hz ของจอภาพ - จอแสดงผล 60 ครั้งต่อวินาที หากจอภาพรีเฟรชจอแสดงผลเขาจะอัปเดตพิกเซลเป็นพิกเซลและบรรทัดสำหรับบรรทัด จอภาพขอค่าสีสำหรับพิกเซลจากหน่วยความจำวิดีโอ ถ้าตอนนี้ฉันเล่นเกมเกมนี้ก็จัดการหน่วยความจำวิดีโอนี้อยู่ตลอดเวลา หากเกมนี้ไม่ใช้กลยุทธ์บัฟเฟอร์ (การบัฟเฟอร์สองครั้งเป็นต้น) ปัญหาต่อไปนี้อาจเกิดขึ้นได้: ตอนนี้จอภาพกำลังรีเฟรชจอภาพ - จอแสดงผลของเขาแล้ว ในขณะนี้จอภาพได้รีเฟรชจอภาพครึ่งแรกแล้ว ในเวลาเดียวกันเกมได้จัดการหน่วยความจำวิดีโอด้วยข้อมูลใหม่ ตอนนี้จอภาพสามารถเข้าถึงจอภาพที่ใช้ในช่วงครึ่งหลังและแสดงข้อมูลที่ถูกจัดการใหม่นี้จากหน่วยความจำวิดีโอ ปัญหาสามารถฉีกขาดหรือริบหรี่ ฉันเข้าใจกรณีของการใช้กลยุทธ์บัฟเฟอร์ถูกต้องหรือไม่? มีเหตุผลอื่นอีกไหม?

3
บัฟเฟอร์สองเท่าในเกม HTML5 Canvas หรือไม่
เกม Canvas ที่เรียบง่ายของฉันดูเหมือนจะทำงานได้ดีบน Chrome และ FF บน Mac / Linux ฉันยังไม่มีโอกาสทดสอบบนสมาร์ทโฟนหรือ Windows มันไม่ได้ใช้การบัฟเฟอร์คู่ แต่ฉันได้เห็นตัวอย่าง JS Canvas บางส่วนที่ใช้ การใช้บัฟเฟอร์คู่แนะนำเมื่อใด มันสร้างความแตกต่างสำหรับเบราว์เซอร์เฉพาะเท่านั้นหรือไม่ มีผลการดำเนินงานที่สำคัญหรือไม่ ขอบคุณ!

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

3
ใช้เวลานานแค่ไหนสำหรับ OpenGL ในการอัพเดทหน้าจอจริง?
ฉันมีแอปทดสอบ OpenGL แบบง่าย ๆ ใน C ซึ่งดึงดูดสิ่งต่าง ๆ เพื่อตอบสนองต่อการป้อนข้อมูลสำคัญ (Mesa 8.0.4, ลองกับ Mesa-EGL และกับ GLFW, Ubuntu 12.04LTS บนพีซีที่ใช้ NVIDIA GTX650) การดึงค่อนข้างง่าย / เร็ว (หมุนประเภทของสิ่งของ) รหัสการทดสอบของฉันไม่ได้ จำกัด จำนวนการจงใจอย่างรอบคอบ แต่อย่างใดมันมีลักษณะดังนี้: while (true) { draw(); swap_buffers(); } ฉันหมดเวลาอย่างระมัดระวังและฉันพบว่าเวลาจากการโทรครั้งเดียวeglSwapBuffers()(หรือglfwSwapBuffersสิ่งเดียวกัน) ต่อไปคือ ~ 16.6 มิลลิวินาที เวลาจากหลังจากการโทรถึงeglSwapBuffers()ก่อนการโทรครั้งถัดไปจะน้อยกว่านั้นเล็กน้อยถึงแม้ว่าสิ่งที่ถูกวาดจะง่ายมาก เวลาที่การแลกเปลี่ยนบัฟเฟอร์ใช้เวลาน้อยกว่า 1 มิลลิวินาที อย่างไรก็ตามเวลาจากแอปเปลี่ยนสิ่งที่มันวาดในการตอบสนองต่อการกดปุ่มเพื่อการเปลี่ยนแปลงที่เกิดขึ้นจริงบนหน้าจอคือ> 150ms (ประมาณ 8-9 เฟรมมูลค่า) วัดจากการบันทึกกล้องของหน้าจอและคีย์บอร์ดที่ 60fps …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.