ฉันมีแอปทดสอบ 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
ดังนั้นคำถาม:
การดึงบัฟเฟอร์ระหว่างการโทรเพื่อสลับบัฟเฟอร์อยู่ที่ไหนและแสดงขึ้นบนหน้าจอจริงหรือไม่ ทำไมความล่าช้า? ดูเหมือนว่าแอพจะวาดภาพหลายเฟรมก่อนหน้าจอตลอดเวลา
แอปพลิเคชัน OpenGL สามารถทำอะไรได้บ้างเพื่อทำให้วาดหน้าจอได้ทันที (เช่น: ไม่มีการบัฟเฟอร์เพียงบล็อกจนกว่าการวาดจะเสร็จสมบูรณ์ฉันไม่ต้องการปริมาณงานสูงฉันต้องใช้เวลาในการตอบสนองต่ำ)
แอปพลิเคชันสามารถทำอะไรเพื่อให้การจับสลากทันทีเกิดขึ้นเร็วที่สุดเท่าที่จะทำได้
แอปพลิเคชันจะรู้ได้อย่างไรว่าสิ่งที่อยู่บนหน้าจอจริงในขณะนี้? (หรือนานแค่ไหน / กี่เฟรมที่ล่าช้าบัฟเฟอร์ปัจจุบันคืออะไร?)