เมื่อสร้างเกมคุณมักจะสร้างวัตถุเกมต่อไปนี้ซึ่งหน่วยงานทั้งหมดได้รับมา:
public class GameObject{
abstract void Update(...);
abstract void Draw(...);
}
ดังนั้นในการอัพเดทลูปคุณวนซ้ำทุกออบเจ็กต์เกมและให้โอกาสพวกเขาเปลี่ยนสถานะจากนั้นในการวาดลูปถัดไปให้คุณวนซ้ำอีกครั้งกับออบเจ็กต์เกมทั้งหมดและให้โอกาสพวกเขาวาดตัวเอง
แม้ว่าวิธีนี้จะทำงานได้ค่อนข้างดีในเกมง่ายๆที่มีตัวเรนเดอร์แบบง่ายมันมักจะนำไปสู่วัตถุเกมขนาดยักษ์สองสามตัวที่จำเป็นต้องจัดเก็บแบบจำลองพื้นผิวที่หลากหลายและแย่ที่สุดของวิธีการวาดไขมันทั้งหมด กลยุทธ์การเรนเดอร์ปัจจุบันและคลาสการเรนเดอร์ใด ๆ ที่เกี่ยวข้อง
ถ้าฉันจะเปลี่ยนกลยุทธ์การเรนเดอร์จากไปข้างหน้าเป็นการเลื่อนออกไปฉันจะต้องอัปเดตออบเจกต์เกมจำนวนมาก และวัตถุเกมที่ฉันทำไม่สามารถนำกลับมาใช้ใหม่ได้อย่างที่ควรจะเป็น แน่นอนว่าการสืบทอดและ / หรือการแต่งเพลงสามารถช่วยฉันต่อสู้กับการทำสำเนารหัสและทำให้มันง่ายขึ้นเล็กน้อยในการเปลี่ยนการใช้งาน แต่ก็ยังรู้สึกขาด
วิธีที่ดีกว่าอาจจะเป็นการลบวิธีการดึงออกจากคลาส GameObject ทั้งหมดและสร้างคลาส Renderer GameObject ยังคงต้องมีข้อมูลบางอย่างเกี่ยวกับการมองเห็นของมันเช่นสิ่งที่รูปแบบที่จะเป็นตัวแทนด้วยและสิ่งที่ควรจะทาสีพื้นผิวในรูปแบบ แต่วิธีการทำจะถูกปล่อยให้แสดง อย่างไรก็ตามมีกรณีชายแดนจำนวนมากในการเรนเดอร์ดังนั้นแม้ว่านี่จะเป็นการลบการเชื่อมต่ออย่างแน่นหนาจาก GameObject ไปยัง Renderer Renderer จะยังคงต้องรู้เกี่ยวกับวัตถุทั้งหมดของเกมซึ่งจะทำให้อ้วนทุกคนรู้และ แน่นคู่ สิ่งนี้จะละเมิดแนวปฏิบัติที่ดีไม่กี่อย่าง บางที Data-Oriented-Design อาจทำเรื่องหลอกลวงได้ วัตถุในเกมจะเป็นข้อมูลแน่นอน แต่ตัวแสดงผลจะได้รับแรงผลักดันจากสิ่งนี้อย่างไร ฉันไม่แน่ใจ.
ดังนั้นฉันจึงสูญเสียและไม่สามารถคิดทางออกที่ดีได้ ฉันพยายามใช้หลักการของ MVC และในอดีตฉันมีความคิดบางอย่างเกี่ยวกับวิธีการใช้สิ่งนั้นในเกม แต่เมื่อเร็ว ๆ นี้ดูเหมือนจะไม่เหมาะสมเท่าที่ฉันคิด ฉันชอบที่จะรู้ว่าคุณแก้ไขปัญหานี้อย่างไร
อย่างไรก็ตามขอปะยางรถฉันสนใจในการบรรลุเป้าหมายการออกแบบต่อไปนี้
- ไม่มีตรรกะการแสดงผลในวัตถุเกม
- ข้อต่อหลวมระหว่างวัตถุในเกมและเอ็นจิ้นการเรนเดอร์
- ไม่มี renderer ที่รู้ทั้งหมด
- การสลับรันไทม์ระหว่างโปรแกรมแสดงผลดีกว่า
การตั้งค่าโครงการในอุดมคติจะเป็น 'เกมลอจิก' แยกต่างหากและแสดงโครงการลอจิกที่ไม่จำเป็นต้องอ้างอิงซึ่งกันและกัน
รถไฟความคิดนี้เริ่มต้นขึ้นเมื่อฉันได้ยิน John Carmack พูดใน twitter ว่าเขามีระบบที่ยืดหยุ่นได้เขาสามารถสลับเอ็นจิ้นการเรนเดอร์ในเวลาทำงานและยังสามารถบอกระบบของเขาให้ใช้ตัวเรนเดอร์ทั้งสอง ในเวลาเดียวกันเพื่อให้เขาสามารถตรวจสอบความแตกต่าง ระบบที่ฉันตั้งโปรแกรมจนถึงขณะนี้ยังไม่ยืดหยุ่นแม้แต่น้อย