ฉันทำงานเกี่ยวกับการพัฒนาแอพพลิเคชั่นที่มีระบบ GUI "คงไว้" มากมาย (ด้านล่างเพิ่มเติมเกี่ยวกับสิ่งที่ฉันหมายถึง) เช่น MFC, QT, Forms, SWING และเฟรมเวิร์ก GUI บนเว็บหลายปีที่ผ่านมา ฉันมักจะพบแนวคิดของระบบ GUI ที่ซับซ้อนและเงอะงะมากเกินไป จำนวนกิจกรรมการติดต่อกลับผู้ฟังสำเนาข้อมูลบางสิ่งบางอย่างที่ทำให้เป็นสตริง - การแปลง (และอื่น ๆ ) เป็นแหล่งที่มาของข้อผิดพลาดและปวดหัวเสมอเมื่อเทียบกับส่วนอื่น ๆ ในแอปพลิเคชัน (แม้จะใช้การเชื่อมโยงข้อมูล / รุ่น "ถูกต้อง")
ตอนนี้ฉันกำลังเขียนเกมคอมพิวเตอร์ :) ฉันทำงานกับ GUI หนึ่งจนถึงขณะนี้: Miyagi (ไม่เป็นที่รู้จัก แต่โดยทั่วไปแล้วความคิดเดียวกันกับระบบอื่น ๆ ทั้งหมด)
มันช่างน่ากลัว
สำหรับสภาพแวดล้อมการแสดงผลแบบเรียลไทม์เช่นเกมฉันรู้สึกว่าระบบ GUI ที่ "คงไว้" นั้นล้าสมัยกว่าเดิม อินเทอร์เฟซผู้ใช้โดยทั่วไปไม่จำเป็นต้องมีการจัดวางอัตโนมัติหรือมีหน้าต่างที่ปรับขนาดได้แบบทันที แต่พวกเขาต้องการโต้ตอบอย่างมีประสิทธิภาพมากกับข้อมูลที่เปลี่ยนแปลงอยู่เสมอ (เช่นตำแหน่ง 3 มิติของโมเดลในโลก)
สองสามปีที่ผ่านมาฉันสะดุดกับ "IMGUI" ซึ่งโดยทั่วไปเหมือนกับโหมดกราฟิกทันที แต่สำหรับส่วนต่อประสานผู้ใช้ ฉันไม่ได้ให้ความสนใจมากนักเนื่องจากฉันยังคงพัฒนาแอพพลิเคชั่นอยู่และฉาก IMGUI นั้นดูเหมือนจะไม่กว้างและไม่ประสบความสำเร็จเลย ยังคงเป็นวิธีที่พวกเขาดูเหมือนจะเซ็กซี่และสง่างามอย่างเต็มที่ทำให้ฉันต้องการเขียนบางอย่างสำหรับโครงการต่อไปโดยใช้ UI นี้ (ฉันไม่สามารถโน้มน้าวให้ใครทำงาน: (... )
ให้ฉันสรุปสิ่งที่ฉันหมายถึงโดย "คงไว้" และ "ทันที":
Retained GUI: ในขั้นตอนการกำหนดค่าเริ่มต้นแยกต่างหากคุณสร้าง "ตัวควบคุม GUI" เช่นป้ายกำกับ, ปุ่ม, กล่องข้อความ ฯลฯ และใช้วิธีการอธิบาย (หรือโปรแกรมทางด้านเทคนิค) บางอย่างในการวางไว้บนหน้าจอ ส่วนควบคุมถือสถานะส่วนใหญ่ของตนเองในหน่วยความจำเช่น X, Y ตำแหน่ง, ขนาด, เส้นขอบ, การควบคุมเด็ก, ข้อความป้ายกำกับ, รูปภาพและอื่น ๆ คุณสามารถเพิ่มการโทรกลับและผู้ฟังเพื่อรับข้อมูลเหตุการณ์และอัปเดตข้อมูลในการควบคุม GUI
GUI ทันที: ไลบรารี GUI ประกอบด้วยฟังก์ชัน "RenderButton", "RenderLabel", "RenderTextBox" หนึ่งครั้ง (... : แก้ไขอย่าสับสนโดยRenderอุปสรรค ฟังก์ชั่นเหล่านี้ยังใช้ตรรกะที่อยู่เบื้องหลังตัวควบคุมเช่นการป้อนข้อมูลผู้ใช้การสำรวจตัวอักษรการจัดการตัวละครซ้ำความเร็วเมื่อผู้ใช้กดปุ่มค้างไว้และอื่น ๆ ... ) ที่คุณสามารถเรียกใช้ "ทันที" เพื่อทำการควบคุม ไม่จำเป็นต้องเขียนลง GPU ทันทีโดยปกติจะจำได้สำหรับเฟรมปัจจุบันและจัดเรียงเป็นชุดที่เหมาะสมในภายหลัง) ห้องสมุดไม่มี "สถานะ" ใด ๆ สำหรับสิ่งเหล่านี้ หากคุณต้องการซ่อนปุ่ม ... อย่าเรียกใช้ฟังก์ชัน RenderButton ฟังก์ชั่น RenderXXX ทั้งหมดที่มีการโต้ตอบกับผู้ใช้เช่นปุ่มหรือช่องทำเครื่องหมายมีค่าส่งคืนที่ระบุว่าผู้ใช้คลิกปุ่มดังกล่าวหรือไม่ ดังนั้น "RenderGUI" ของคุณ ฟังก์ชั่นดูเหมือนว่าจะเป็นฟังก์ชั่น if / else ที่คุณโทรหาหรือไม่เรียกใช้ฟังก์ชั่น RenderXXX ของคุณขึ้นอยู่กับสถานะเกมของคุณและตรรกะการอัพเดทข้อมูลทั้งหมด การจัดเก็บข้อมูลทั้งหมดคือ "นอก" gui และส่งผ่านไปยังฟังก์ชั่น Render ตามความต้องการ (แน่นอนว่าคุณจะแบ่งฟังก์ชั่นใหญ่ออกเป็นหลาย ๆ ส่วนหรือใช้ abstractions บางคลาสเพื่อจัดกลุ่มส่วนของ gui เราไม่ได้เขียนโค้ดเหมือนในปี 1980 อีกต่อไปใช่ไหม?))
ตอนนี้ฉันพบว่า Unity3D ใช้วิธีพื้นฐานแบบเดียวกันกับระบบ GUI ในตัว อาจมี GUI สองสามตัวที่ใช้วิธีนี้เช่นกัน?
ยัง .. เมื่อมองไปรอบ ๆ ดูเหมือนว่าจะมีอคติที่แข็งแกร่งต่อระบบ GUI ที่คงอยู่หรือไม่? อย่างน้อยฉันก็ไม่พบวิธีการนี้ยกเว้นใน Unity3D และชุมชน IMGUI ดั้งเดิมดูเหมือนว่าจะค่อนข้างเงียบ ..
ดังนั้นทุกคนทำงานร่วมกับทั้งความคิดและมีความเห็นที่แข็งแกร่ง?
แก้ไข: ฉันสนใจความคิดเห็นมากที่สุดซึ่งเกิดจากประสบการณ์จริง ฉันคิดว่ามีการพูดคุยกันอย่างดุเดือดในฟอรัม IMGUI เกี่ยวกับ "ความอ่อนแอเชิงทฤษฎี" ของวิธีการแบบ GUI ทันที แต่ฉันมักจะพบว่าการรู้แจ้งเกี่ยวกับจุดอ่อนในโลกแห่งความเป็นจริงยิ่งขึ้น