ฉันคิดว่าเป็นที่ยอมรับกันโดยทั่วไปว่าเรียลไทม์คือทุกสิ่งที่อยู่เหนือการโต้ตอบ และอินเทอร์แอคทีฟหมายถึง "ตอบสนองต่ออินพุต แต่ไม่ราบรื่นในความจริงที่ว่าแอนิเมชันดูเหมือนจะสั่นคลอน"
ดังนั้นเวลาจริงจะขึ้นอยู่กับความเร็วของการเคลื่อนไหวที่เราต้องการแสดง โรงภาพยนตร์ฉายที่ 24 FPS และเป็นแบบเรียลไทม์สำหรับหลาย ๆ กรณี
จากนั้นสามารถตรวจสอบรูปหลายเหลี่ยมที่เครื่องสามารถจัดการได้อย่างง่ายดายโดยตรวจสอบด้วยตนเอง เพียงแค่สร้าง VBO patch เพียงเล็กน้อยสำหรับการทดสอบอย่างง่ายและตัวนับ FPS ตัวอย่าง DirectX หรือ OpenGL จำนวนมากจะทำให้คุณได้เตียงทดสอบที่สมบูรณ์แบบสำหรับมาตรฐานนี้
คุณจะพบว่าคุณมีการ์ดกราฟิกระดับไฮเอนด์ที่คุณสามารถแสดงรูปหลายเหลี่ยมได้ประมาณ 1 ล้านรูปในเวลาจริง อย่างไรก็ตามอย่างที่คุณบอกว่าเอ็นจิ้นจะไม่เรียกร้องการสนับสนุนอย่างง่ายดายเพราะข้อมูลฉากในโลกแห่งความจริงจะทำให้เกิดหมูประสิทธิภาพจำนวนหนึ่งซึ่งไม่เกี่ยวข้องกับการนับโพลีกอน
คุณมี:
- อัตราการเติม
- การสุ่มตัวอย่างพื้นผิว
- เอาต์พุต ROP
- การโทรออก
- แสดงสวิตช์เป้าหมาย
- การอัพเดทบัฟเฟอร์ (ชุดหรืออื่น ๆ )
- การวาดทับ
- ความซับซ้อนของ shader
- ความซับซ้อนของไปป์ไลน์ (ข้อเสนอแนะใด ๆ ใช้? การแรเงารูปทรงเรขาคณิตแบบวนซ้ำ? การบดเคี้ยว?)
- จุดซิงก์กับ CPU (การอ่านพิกเซลหรือไม่
- รูปหลายเหลี่ยมความร่ำรวย
ขึ้นอยู่กับจุดอ่อนและจุดแข็งของการ์ดกราฟิกจุดใดจุดหนึ่งเหล่านี้จะเป็นคอขวด มันไม่เหมือนที่คุณพูดได้อย่างแน่นอนว่า "นั่นนั่นคือสิ่งนั้น"
แก้ไข:
ฉันต้องการเพิ่มสิ่งนั้นไม่มีใครสามารถใช้รูปแบบข้อมูลจำเพาะของ GFlops ของการ์ดที่เฉพาะเจาะจงหนึ่งใบและแมปแบบเชิงเส้นตรงกับความสามารถในการผลักรูปหลายเหลี่ยม เนื่องจากความจริงที่ว่าการรักษารูปหลายเหลี่ยมจะต้องผ่านคอขวดที่ต่อเนื่องกันในท่อกราฟิกตามที่อธิบายในรายละเอียดที่นี่: https://fgiesen.wordpress.com/2011/07/03/a-trip-through-the-graphics -pipeline-2011-part-3 /
TLDR: จุดยอดต้องพอดีกับแคชขนาดเล็กก่อนการประกอบแบบดั้งเดิมซึ่งเป็นสิ่งที่เรียงตามลำดับ (ลำดับจุดสุดยอดบัฟเฟอร์มีความสำคัญ)
หากคุณเปรียบเทียบ GeForce 7800 (อายุ 9 ปี?) กับปีนี้ 980 ดูเหมือนว่าจำนวนการปฏิบัติการต่อวินาทีที่สามารถเพิ่มขึ้นได้หนึ่งพันเท่า แต่คุณสามารถเดิมพันได้ว่ามันจะไม่ผลักรูปหลายเหลี่ยมให้เร็วขึ้นพันเท่า (ซึ่งจะประมาณ 200,000 ล้านวินาทีต่อวินาทีด้วยการวัดแบบง่ายๆ)
EDIT2:
เพื่อตอบคำถาม "สิ่งที่สามารถทำได้เพื่อเพิ่มประสิทธิภาพของเครื่องยนต์" ใน "ไม่ต้องสูญเสียประสิทธิภาพมากเกินไปในการเปลี่ยนสถานะและค่าใช้จ่ายอื่น ๆ "
นั่นเป็นคำถามที่อายุเท่าเครื่องยนต์ และมีความซับซ้อนมากขึ้นตามความคืบหน้าของประวัติศาสตร์
อันที่จริงในสถานการณ์โลกแห่งความจริงข้อมูลฉากทั่วไปจะมีวัสดุหลายอย่างพื้นผิวมากมายเฉดสีที่แตกต่างกันจำนวนมากแสดงเป้าหมายและผ่านและบัฟเฟอร์จุดสุดยอดและอื่น ๆ หนึ่งเครื่องยนต์ที่ฉันทำงานด้วยทำงานร่วมกับแนวคิดเรื่องแพ็กเก็ต:
หนึ่งแพ็คเก็ตคือสิ่งที่สามารถแสดงผลได้ด้วยการโทรออกครั้งเดียว
มันมีตัวระบุถึง:
- บัฟเฟอร์จุดสุดยอด
- บัฟเฟอร์ดัชนี
- กล้อง (ให้ผ่านและเป้าหมายการแสดงผล)
- รหัสวัสดุ (ให้ shader พื้นผิวและ UBO)
- ระยะห่างจากตา
- มองเห็นได้
ดังนั้นขั้นตอนแรกของแต่ละเฟรมคือการเรียกใช้การเรียงลำดับอย่างรวดเร็วในรายการแพ็กเก็ตโดยใช้ฟังก์ชั่นการจัดเรียงที่มีโอเปอเรเตอร์ที่ให้ความสำคัญกับการมองเห็นจากนั้นผ่านไปตามวัตถุแล้วตามด้วยเรขาคณิต
การวาดวัตถุที่ใกล้จะได้รับการ prirority เพื่อเพิ่มการเลือกสรรต้น Z สูงสุด
การผ่านเป็นขั้นตอนคงที่ดังนั้นเราจึงไม่มีทางเลือกนอกจากให้ความเคารพ
วัสดุเป็นสิ่งที่แพงที่สุดในการเปลี่ยนสถานะหลังจากแสดงผลเป้าหมาย
แม้ในระหว่างรหัสวัสดุที่แตกต่างกันการสั่งซื้อย่อยสามารถทำได้โดยใช้เกณฑ์การเรียนรู้เพื่อลดจำนวนการเปลี่ยนแปลงของ Shader (ราคาแพงที่สุดในการดำเนินการเปลี่ยนสถานะวัสดุ) และการเปลี่ยนแปลงการผูกมัดพื้นผิวครั้งที่สอง
หลังจากการสั่งซื้อทั้งหมดนี้หนึ่งสามารถใช้พื้นผิวขนาดใหญ่พื้นผิวเสมือนจริงและการแสดงผลน้อยแอตทริบิวต์ ( ลิงค์ ) หากเห็นว่าจำเป็น
เกี่ยวกับเอ็นจิ้น API ยังมีสิ่งหนึ่งที่พบบ่อยคือการเลื่อนการออกคำสั่งการตั้งค่าสถานะที่ลูกค้าต้องการ หากไคลเอนต์ร้องขอ "set camera 0" จะเป็นการดีที่สุดที่จะเก็บคำขอนี้ไว้และหากลูกค้าเรียก "set camera 1" ในภายหลัง แต่ไม่มีคำสั่งอื่นในระหว่างนั้นเอ็นจิ้นสามารถตรวจจับความไร้ประโยชน์ของคำสั่งแรกและวางมันได้ . นี่คือการกำจัดความซ้ำซ้อนซึ่งเป็นไปได้โดยใช้กระบวนทัศน์ "เก็บรักษาไว้อย่างเต็มที่" โดยขัดกับกระบวนทัศน์ "ทันที" ซึ่งจะเป็นเพียงเสื้อคลุมเหนือ API ดั้งเดิมและออกคำสั่งที่ถูกต้องตามคำสั่งของรหัสลูกค้า ( ตัวอย่าง: virtrev )
และในที่สุดด้วยฮาร์ดแวร์ที่ทันสมัยซึ่งมีราคาแพงมาก (ในการพัฒนา) แต่ขั้นตอนที่น่าจะได้ผลตอบแทนสูงคือการเปลี่ยน API เป็น metal / mantle / vulkan / DX12 style และเตรียมคำสั่งการเรนเดอร์ด้วยมือ
เอ็นจินที่เตรียมคำสั่งการเรนเดอร์สร้างบัฟเฟอร์ที่เก็บ "รายการคำสั่ง" ที่ถูกเขียนทับในแต่ละเฟรม
มักจะมีความคิดของกรอบ "งบประมาณ" เกมสามารถจ่ายได้ คุณต้องทำทุกอย่างใน 16 มิลลิวินาทีเพื่อให้คุณแบ่งเวลา GPU อย่างชัดเจน "2 ms สำหรับ lightpre pass", "4 ms สำหรับ material pass", "6 ms สำหรับแสงทางอ้อม", "4 ms สำหรับ postprocesses" ...