วันอาทิตย์ที่ 4 พฤษภาคม พ.ศ. 2551

OpenGL and Multithreading

หลังจากที่ต้องการวาดภาพที่ได้จากหลายๆตัวพร้อมๆกัน โดยใช้ multi-thread นั้นก็พบว่า ถ้าไม่ใช้ความสามารถของการ์ดจอเข้ามาช่วยละก็พอแต่ละ window มันใหญ่ขึ้น ก็จะกิน cpu แบบมหาศาล แล้วจะ crash ไปในที่สุด ไม่สามารถรันติดต่อกันเป็นเวลานานๆได้ นั่นเป็นเรื่องที่ยอมรับไม่ได้เลยทีเดียว (จากการทดสอบ ถา้เปิดแค่สองกล้อง จะรันได้ข้ามวัน แต่ถ้าเปิดสี่กล้อง สองชั่วโมงก็ตายแว้วว) อันนี้ไม่เกี่ยวกับเมมโมรี่ แต่สังเกตได้ว่าเกิดจากการที่ main thread ซึ่งทำหน้าที่วาดที่ทุกอย่างนั้นทำงานช้าเกินไป

จากที่เล่ามาข้างบนจึงมาคิดว่า คงต้องให้การ์ดจออันแสนแพง ทำงานคุ้มค่าหน่อย วิธีหนึ่งที่ทำได้ง่ายๆคือใช้ OpenGL ใช่มั้ยครับ แต่ แต่ช้าแต่ ช้าก่อนครับ มันไม่ง่ายอย่างนั้นน่ะสิ เพราะตอนนี้เราทำงานแบบ multihreading ซึ่งตัว OpenGL มันเหมือนจะไม่ได้ออกแบบมาเพื่อการนี้สักเท่าไร ถึงกระนัน้ก็ตาม ไม่ใช่ผมเป็นคนแรกที่คิดจะทำแบบนี้แน่่นอน ว่าแล้วก็ค้นดูจาก google จนได้ link ไปที่ forum ซึ่งมีการพูดคุยเรื่องนี้อยู่ และมีคนแนะนำไว้ว่าอย่างนี้

(I copied this below text from this link)
The basic problem with multithreading in OGL is the fact that OGL context, which contains entire state of the OGL, can be at one time bound to only one thread. Because of this you can not simultaneously modify it from two threads. You basically have three options.
  • You can create one context for each thread and enable sharing of display lists and textures between them. It is likely that this path is not too well supported by the drivers.
  • You can load and prepare the resources by the second thread and let the main thread do the creation call into OGL.
  • If the resource type supports it (e.g. VBO), you can map its memory by the main thread. Fill it in the second thread and unmap it by the main thread
ประเด็นมันอยู่ตรงนี้เอง นั่งทำอยู่สองวัน ได้แค่หน้าจอดำๆ ต้องกลับไปแก้ไขใหม่ ได้เรื่องอย่างไรแล้วจะเอามาให้ชมเป็นตอนต่อไป อ้อ การเขียน OpenGL บน wxWidgets นั้น เค้ามี class wxGLCanvas่ กับ wxGLContext มาให้ใช้ ช่วยให้สะดวกขึ้นมิใช่น้อย

ไม่มีความคิดเห็น: