ปัญหาใดที่อาจเกิดขึ้นได้หากคุณใช้ทั้ง MonoGame API และ API กราฟิกพื้นฐาน


10

มีปัญหาอะไรบ้างหากพวกเขาสร้างเกมด้วย MonoGame และเริ่มโทรศัพท์ไปยัง API กราฟิกพื้นฐานเช่นกัน?

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

ฉันพยายามทำวิจัยเล็กน้อยผ่านทาง Google และไซต์ GD.SE และฉันก็หาอะไรไม่ได้มากมาย บางที MonoGame ได้ครอบคลุมฐานส่วนใหญ่จริง ๆ แล้ว แต่ถ้าฉันต้องการแก้ไขปัญหาที่โดดเด่นหรือคุณลักษณะที่ยังไม่ได้ใช้งานด้วยตนเอง

ถ้าเป็นเช่นนั้นปัญหาแบบใดที่อาจเกิดขึ้นและมีวิธีใดบ้างที่จะช่วยบรรเทาปัญหาเหล่านี้ได้?

คำตอบ:


12

ในกรณีส่วนใหญ่ปัญหาเหล่านี้จะตกอยู่ในหมวดหมู่ของ "พฤติกรรมที่ไม่ได้กำหนด" (ไม่ใช่ในแง่ของ C ++ แต่เป็นความเข้าใจที่กว้างขึ้น)

สิ่งที่คุณต้องทำคือหลีกเลี่ยงสิ่งที่เป็นนามธรรมโดย MonoGame (เป็นตัวอย่างแน่นอนว่าสิ่งนี้ใช้กับ API ระดับสูง ๆ เช่นนั้น) ในการทำเช่นนี้คุณสามารถทำให้การรับประกันคงที่ในชั้นเรียนถูกละเมิดซึ่งหมายความว่าสมมติฐานที่ผู้เขียน MonoGame สามารถเขียนรหัสได้ภายใต้อาจไม่เป็นจริงอีกต่อไปและรหัสอาจทำงานโดยไม่คาดคิด รหัสของคุณเองไม่สามารถพึ่งพาการรับรองค่าคงที่ของสิ่งที่เป็นนามธรรมได้อีกต่อไปตั้งแต่คุณทำลายมัน

พฤติกรรมที่ไม่คาดคิดนี้จะรวมถึงขอบเขตทั้งหมดของพฤติกรรมดังกล่าวตั้งแต่การเรนเดอร์แบบธรรมดาไปจนถึงการล่มหรือหน่วยความจำเสียหาย

  • ตัวอย่างเช่นหากคุณเล่นซอกับสถานะการเรนเดอร์ API บางตัวโดยเรียกใช้รอบ ๆ โมโนเกมตัวเองมันอาจไม่สามารถตรวจจับการเปลี่ยนแปลงสถานะนั้นได้ (เพราะมันอาจจะไม่สำรวจ API พื้นฐานสำหรับการเปลี่ยนแปลงมันมีประสิทธิภาพมากกว่า สมมติว่าเป็นตัวควบคุม API และติดตามการเปลี่ยนแปลงเหล่านั้น) ดังนั้นในการตัดสินใจครั้งต่อไปว่าอาจไม่จำเป็นต้องอัปเดตสิ่งที่ควรได้รับการอัปเดตและฉากของคุณอาจไม่ถูกต้อง

  • หรือคุณอาจยุ่งกับ API พื้นฐานและเปลี่ยนแปลงจำนวนการอ้างอิงของวัตถุอุปกรณ์บางอย่าง (สมมติว่า D3D) ซึ่งหมายความว่ามันอาจได้รับการปล่อยตัวก่อนกำหนดจากภายใต้ MonoGame หรือไม่ได้ตั้งใจปล่อยออกมาทำให้เกิดความผิดพลาดหรือทรัพยากรรั่วไหล

  • หรือคุณสามารถทำสิ่งที่ใช้งานได้ แต่เนื่องจากคุณล้อเล่นในลักษณะที่ไม่ได้รับการสนับสนุนและด้วยคุณสมบัติที่ไม่มีเอกสารหรือรูปแบบการเข้าถึงที่ไม่คาดคิดคุณสามารถค้นหารหัสของคุณได้อย่างไม่น่าเชื่อในรุ่นถัดไป

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

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

เป็นการดีที่คุณจะหลีกเลี่ยงสิ่งนี้อย่างสิ้นเชิงแม้ว่า


3

ฉันเห็นด้วยกับคำตอบของ Josh อย่างเต็มที่ แต่ฉันต้องการเพิ่มความคิด

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

หากคุณพบว่าตัวเองต้องการทำสิ่งที่ MonoGame ไม่สนับสนุนหรือมีปัญหาในการค้นหาเอกสารขั้นแรกให้ถามคำถามเฉพาะเจาะจงเพิ่มเติมเกี่ยวกับสิ่งที่คุณพยายามทำ คุณอาจพบว่ามีวิธีการทำอยู่แล้วหรืออาจเป็นคุณสมบัติที่วางแผนไว้ซึ่งยังไม่ได้ใช้งาน

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


3

ในส่วนที่เกี่ยวกับวิธีการลดปัญหาที่เกิดขึ้นจากการรวมแนวคิดทั้งสองนั้น

MonoGame เป็นโอเพ่นซอร์สปรับเปลี่ยนโดยตรงและคุณไม่จำเป็นต้องกังวลเกี่ยวกับปัญหาจากการใช้งานทั้งคู่

หากคุณคิดว่าคุณต้องการสิ่งเพิ่มเติมในนั้นโดยทั้งหมด: สร้างทางแยก ใช้รหัสฐานนั้นและเพิ่มของคุณไว้ด้านบน คอมไพล์ไฟล์ MonoGame และไปที่นั่น วิธีนี้จะช่วยให้คุณอัปเดตทางแยกของโมโนเกมเมื่อมีการอัปเดต (แน่นอนว่าคุณจะต้องแก้ไขข้อขัดแย้งใด ๆ ที่อาจเกิดขึ้นในกระบวนการ)


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

1
คำถามนี้จะตอบคำถามได้อย่างไร

1
เราสามารถหลีกเลี่ยงปัญหาใด ๆ ที่เกิดขึ้นจากการรวมสอง (monogame + the API ที่ขีดเส้นใต้) โดยการแก้ไขโดยตรงที่แหล่ง monogame (นั่นคือในที่เดียว) โปรดสังเกตคำถามสุดท้ายของเขา: "ถ้าเป็นเช่นนั้นปัญหาอะไรที่อาจเกิดขึ้นและมีวิธีใดบ้างที่จะช่วยบรรเทาปัญหาเหล่านี้ได้?"
Timotei

จุดดี Timotei ฉันได้ทำการแก้ไขเล็กน้อยเพื่อให้ชัดเจนยิ่งขึ้นในสิ่งที่คุณตอบ
MichaelHouse

ฉันชอบประเด็นนี้ ฉันคิดว่ามันจะสมเหตุสมผลกว่าหากพยายามหาสถานที่ที่เหมาะสมภายใน monogame เพื่อใช้งานฟีเจอร์มากกว่าจะเป็นการใช้งานเฉพาะในไลบรารีเกมของคุณเอง มีข้อผิดพลาดที่ชัดเจนของการไม่เข้าใจชื่อเกมอย่างถูกต้องและยังคงนำไปใช้อย่างไม่ถูกต้อง แต่นั่นเป็นปัญหาอื่นโดยสิ้นเชิง
SpartanDonut
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.