ในที่สุดก็ใช้งาน OpenGL เบื้องต้นได้ ที่บอกว่าเบื้องต้นก็เพราะ มันดูเหมือนไม่ได้ช่วยให้ CPU ทำงานน้อยลงเลย หรือมันถูก block ไว้ก็ไม่รู้ แต่มันก็ช่วยให้ frame rate ดีขึ้นแหละนะ หลักๆที่แก้ไป ไม่ใช่เรื่อง multi-thread เพราะออกแบบให้ copy ลง memory ก่อนแล้วค่อยให้ gui thread เรียก glTexSubImage2D อยู่แล้ว แต่เป็นเรื่องการทำงานร่วมกันระหว่าง wxGLCanvas กับ glut และ OpenGL มากกว่า โดยไปออกแบบใหม่ให้ลด layer ของ window ลง ลองไปอ่านใน wiki ดูนะคร้าบ อีกอันหนึ่งคือ การสร้าง texture object ดูเหมือนว่าเราจะสร้างใน constructor ของ wxGLCanvas ไม่ได้นะ ต้องให้มัน show ก่อน
อย่างไรก็ดี คงจะต้องปรับปรุงกันต่อไป เห็นมีการพูดถึง Pixel Buffer Object ไม่รู้ว่าจะช่วยได้ป่าว ต้องลองดูตามที่ไปหามา(อีกแล้ว)
1. Create PBO
2. map buffer
3. give pbo pointer to decoder thread (or put it in pool of free pbo's)
4. decoder copy frame in pbo memory and notify render thread about that, or decoder ask pool for free pbo pointer and copy image data and notify render thread about that.
5. render thread unmap pointer and call glTexSubImage2D
6. render thread mark that pbo to map its pointer again at next frame (or two frames later)
7. at next frame (or two frames later) map pbo pointer and give it to decoder thread (or pool)
Using pool you can handle multiple video stream transfers.
ก๊อปมาจาก ที่นี่ จ้า
ติตตามความคืบหน้ากันต่อไป
วันอังคารที่ 13 พฤษภาคม พ.ศ. 2551
วันอาทิตย์ที่ 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.
จากที่เล่ามาข้างบนจึงมาคิดว่า คงต้องให้การ์ดจออันแสนแพง ทำงานคุ้มค่าหน่อย วิธีหนึ่งที่ทำได้ง่ายๆคือใช้ 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
วันพุธที่ 30 เมษายน พ.ศ. 2551
wxWidgets part: wxThread
หลังจากที่สร้้างฟอร์มเสร็จอย่่างสวยงามได้ดังใจมาแล้ว ก็ถึงคราวใส่อะไรๆลงไป รูปข้างบนผมได้เขียนโค้ดการรับภาพจากกล้อง cctv ซึ่งต่อกับการ์้ด DVR แบบ real-time 4 channel โดยใช้ API คือ Video For Linux 2 และใช้ OpenCV library ช่วยในการจัดการภาพในขั้นตอนต่อๆไป พอดีว่ามีสายอยู่สามเส้นจึงทดลองต่อกล้องได้สามตัวwxWidgets ทำให้ผมประทับใจอีกครั้ง ด้้วยการสนับสนุนการเขียน multi-thread และคำนึงถึงการติดต่่อระหว่าง worker thread และ main thread ซึ่งปรกติจะรัน GUI ทำให้ออกแบบโปรแกรมและเขียนโค้ดได้ง่ายขึ้น
อย่างที่ผมทำนั้น ได้ใช้วิธีการสร้าง worker thread ซึ่งจะทำหน้้าที่ติดต่่อกับกล้อง 1 thread ต่อ 1 ตัวแล้วก็ส่งภาพมาให้ window object แต่ละช่องทำการวาด
จากเอกสารและตัวอย่างนั้นได้แนะนำเอาไว้ว่า
1. ไม่ควรมีการเรียก GUI function จาก thread เกินกว่า 1 thread
2. ถ้าต้องการทำ ให้ใช้วิธี post event แทนซึ่ง function ที่สนับสนุนนั้นเป็น thread safe จึงไม่ต้องกังวล
3. อีก 2 ฟังก์ชั่นที่สำคัญคือ wxMutexGuiEnter และ wxMutexGuiLeave
วันอาทิตย์ที่ 20 เมษายน พ.ศ. 2551
wxFormBuilder part: 3
วันศุกร์ที่ 18 เมษายน พ.ศ. 2551
wxFormBuilder part: 2
หลังจากที่ทดลองใช้กันอยู่วันหนึ่งเต็มๆ ก็ต้องบอกว่าค่อนข้างประทับใจมาก ด้วยเหตุผลหลายๆประการ ดังนี้1. ตัว tool ใช้ง่าย แต่ต้องทำความเข้าใจคอนเซ็ปต์ของมันให้ได้เสียก่อน เมื่อทำความคุ้นเคยได้แล้ว ทีนี้ก็ออกแบบได้ง่าย
2. ตัว code ที่ generate ออกมาเป็น OO ใครที่คุ้นเคยกับการเขียน win32 api ละก็ จะรู้สึกได้ว่ามีส่วนคล้ายกันอยู่มากทีเดียว ทำให้เดาทางได้ง่ายขึ้น
3. อันนี้อ่านมาจากใน forum เค้าว่่าด้วยการทำแบบนี้ คือ แยก gui code ออกจาก logic ทำให้ออกแบบ automate test ของส่วน gui ได้ง่าย
4. มีตัวอย่างการใช้ร่วมกับ OpenCV และ openGL ซะด้วย
5. support multi-threading
ที่เหลือก็เรื่องความเสถียรกับประสิทธิภาพ ก็ต้องลองดูกันต่อไป
วันพฤหัสบดีที่ 17 เมษายน พ.ศ. 2551
GUI toolkit : WxFormBuilder
วันนี้กะว่าจะยกเครื่อง GUI ของโปรแกรม traffic monitor ซึ่งตอนนี้เขียนด้วย FLTK 1.1 แบบง่ายๆไว้ เนื่องด้วยความต้องการที่จะทำให้มันดู professional ขึ้นมา กับคนที่เกลียดการเขียน UI ที่สุดมันจะกลายเป็นเรื่องยุ่งยากใจทันที สิ่งที่ไม่ชอบที่สุดของ FLTK ก็คือ ui designer tool ที่เข้าขั้น ห่วย ไม่ว่าจะเป็นหน้าตาหรือการใช้งาน ฟังดูอาจขัดกับที่เคยแนะนำไป แต่ช่วยไม่ได้อะ พอต้องการที่จะทำให้มันสวยๆ มันรู้สึกอย่างนั้นจริงๆ
วันนี้ก็เลยเสียเวลาทั้งวันในการหา toolkit ตัวใหม่ที่ต้องการจะลงหลักปักฐานด้วยไปตลอดต่อจากนี้ ตอนแรกลังเลว่าจะกลับไปมอง QT/KDE แต่มานึกถึงเรื่อง license แล้วก็เลยไม่อยากเสี่ยง มองหาที่เป็น GPL/LGPL ดีกว่า ด้วยความที่มันเป็น opensource ข้อเสียอย่างหนึ่งก็คือ มันมีให้เลือกเยอะจริงๆ ก็ต้องมานั่งหา นั่งเปรียบเทียบ ลองลงอยู่กันเป็นนานสองนาน การตัดสินใจเลือกตัวใดนั้นจะมีปัจจัยหลักสองข้อคือสนับสนุน OpenGL และ multi-thread
ตอนแรกเลยก็ลอง FLTK 2.0 ซึ่งเวอร์ชั่นนี้บอกว่าเป็น OO มากขึ้น แต่ก็ยังไม่ประทับใจเท่าไร สุดท้ายก็มาจบที่ wxWindows ซึ่งก็ดันมี tool มาเป็นตัวเลือกสำหรับทำ rad หลายตัวอีก ท้ายสุดเมื่อเปรียบเทียบจากตาราง ก็เลยตกลงปลงใจกับ wxFormBuilder v3.0 เวอร์ชั่นนี้ต้องการ wxWidget version 2.8
เนื่องจาก Kubuntu ที่ใช้อยู่เป็น version 7.04 จึงต้องทำการ upgrade wxWidget เสียก่อน เอาละตอนนี้ก็พร้อมที่จะทดลองใช้มันแล้ว ขอเวลาไปลองเล่นก่อน ได้ผลยังงัย ชอบ ไม่ชอบ จะมาบอกอีกที
วันนี้ก็เลยเสียเวลาทั้งวันในการหา toolkit ตัวใหม่ที่ต้องการจะลงหลักปักฐานด้วยไปตลอดต่อจากนี้ ตอนแรกลังเลว่าจะกลับไปมอง QT/KDE แต่มานึกถึงเรื่อง license แล้วก็เลยไม่อยากเสี่ยง มองหาที่เป็น GPL/LGPL ดีกว่า ด้วยความที่มันเป็น opensource ข้อเสียอย่างหนึ่งก็คือ มันมีให้เลือกเยอะจริงๆ ก็ต้องมานั่งหา นั่งเปรียบเทียบ ลองลงอยู่กันเป็นนานสองนาน การตัดสินใจเลือกตัวใดนั้นจะมีปัจจัยหลักสองข้อคือสนับสนุน OpenGL และ multi-thread
ตอนแรกเลยก็ลอง FLTK 2.0 ซึ่งเวอร์ชั่นนี้บอกว่าเป็น OO มากขึ้น แต่ก็ยังไม่ประทับใจเท่าไร สุดท้ายก็มาจบที่ wxWindows ซึ่งก็ดันมี tool มาเป็นตัวเลือกสำหรับทำ rad หลายตัวอีก ท้ายสุดเมื่อเปรียบเทียบจากตาราง ก็เลยตกลงปลงใจกับ wxFormBuilder v3.0 เวอร์ชั่นนี้ต้องการ wxWidget version 2.8
เนื่องจาก Kubuntu ที่ใช้อยู่เป็น version 7.04 จึงต้องทำการ upgrade wxWidget เสียก่อน เอาละตอนนี้ก็พร้อมที่จะทดลองใช้มันแล้ว ขอเวลาไปลองเล่นก่อน ได้ผลยังงัย ชอบ ไม่ชอบ จะมาบอกอีกที
วันอังคารที่ 15 เมษายน พ.ศ. 2551
Kubuntu on Amd64 Phenom
ในที่สุดก็ลงสำเร็จจนได้กับเครื่องใหม่ของทีมที่เป็น Phenom 9500 + HD3870 ปัญหาก็มีหลายอย่างเหลือเกิ๊น ตั้งแต่ write iso image ด้วยโปรแกรมบน Kubuntu แล้วเอามาลงไม่สำเร็จ สุดท้ายจำเลยก็คือ(คิดว่านะ) ตัว writer ที่บ้านนั่นเอง เป็นยี่ห้อ LiteOn แต่เครื่องใหม่เป็น Asus พอเอาไปเขียนด้วยเครื่องที่ทำงาน ซึ่งเป็น Asus เหมือนกัน ก็จบข่าวเลย
ต่อมาก็เรื่องลง driver ของ ATI เทียบกับลง driver ของ Nvidia เจ้าหลังนี่ไม่ค่อยมีปัญหาเท่าไร แต่ข้อดีของ ATI คือจะมีโปรแกรม config มาให้ชื่อ Catalyst ใช้ set feature ต่างๆได้สะดวกดี
ปัญหาต่อมาก็คือไม่สามารถเซ็ตความละเอียดที่ 1680x1050 ได้แม้ว่าจะเข้าไปแก้ xorg.conf ตรงๆ ทางแก้ก็คือ ต้องใช้คำสั่งหรือโปรแกรมที่ทำการ reconfig X-server ใหม่ ถึงจะได้
หลังจากนั้นก็ฉลุย ลง Apache2, trac, svn แต่ยังไม่ได้เซ็ตเลยอะ รำคาญเสียงพัดลมของเคสมาก ทนไม่ไหวซะก่อน นี่ว่าจะแกะออกมาถอดสายไฟออกซะเลย ไม่น่าจะเป็นไรมั้งเนอะ เห็นว่า cpu ตัวนี้ไม่ร้อนเท่าไรแถมเคสก็ใหญ่มีพื้นที่มากอยู๋แล้วด้วย
ต่อมาก็เรื่องลง driver ของ ATI เทียบกับลง driver ของ Nvidia เจ้าหลังนี่ไม่ค่อยมีปัญหาเท่าไร แต่ข้อดีของ ATI คือจะมีโปรแกรม config มาให้ชื่อ Catalyst ใช้ set feature ต่างๆได้สะดวกดี
ปัญหาต่อมาก็คือไม่สามารถเซ็ตความละเอียดที่ 1680x1050 ได้แม้ว่าจะเข้าไปแก้ xorg.conf ตรงๆ ทางแก้ก็คือ ต้องใช้คำสั่งหรือโปรแกรมที่ทำการ reconfig X-server ใหม่ ถึงจะได้
หลังจากนั้นก็ฉลุย ลง Apache2, trac, svn แต่ยังไม่ได้เซ็ตเลยอะ รำคาญเสียงพัดลมของเคสมาก ทนไม่ไหวซะก่อน นี่ว่าจะแกะออกมาถอดสายไฟออกซะเลย ไม่น่าจะเป็นไรมั้งเนอะ เห็นว่า cpu ตัวนี้ไม่ร้อนเท่าไรแถมเคสก็ใหญ่มีพื้นที่มากอยู๋แล้วด้วย
สมัครสมาชิก:
บทความ (Atom)
