มีรูปหลายเหลี่ยมในฉากที่สามารถเข้าถึงฮาร์ดแวร์ที่ทันสมัยในขณะที่ยังคงเรียลไทม์และวิธีการที่จะได้รับ?


11

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

ฉันรู้ว่านี่เป็นคำถามปลายเปิดที่ค่อนข้างกว้างและฉันขอโทษสำหรับสิ่งนั้นฉันแค่คิดว่ามันจะเป็นคำถามที่มีค่าที่จะได้อยู่ตรงนี้


2
ฉันไม่คิดว่าคำถามนั้นจำเป็นต้องมีการเปิดกว้างเกินไป แต่คำตอบเชิงตัวเลขใด ๆ จะผิดภายใน 12 เดือน
Dan Hulme

@DanHulme ใช่ แต่วิธีการที่ใช้ในการเข้าถึงประสิทธิภาพแบบนั้นยังคงเหมือนเดิม และเมื่อไม่เช่นนั้นฉันเห็นคำถามที่ต้องการอัปเดตคำตอบเป็นระยะ ๆ ในไซต์ stackexchange อื่น ๆ ดังนั้นฉันคิดว่าไม่เป็นไร
Llamageddon

7
นี่เป็นไปไม่ได้จริงๆที่จะตอบ ก่อนอื่น "เรียลไทม์" คืออะไร - 60fps 30? น้อยลงหรือไม่ ประการที่สองคำตอบจะแตกต่างกันไปอย่างมากตาม GPU ที่คุณมีและความละเอียดที่คุณใช้ในการแสดงผล ประการที่สามคำตอบจะแตกต่างกันไปอย่างมากขึ้นอยู่กับรายละเอียดของวิธีการแสดงผล ข้อ จำกัด เกี่ยวกับความซับซ้อนของฉากนั้นซับซ้อนกว่าแค่จำนวนรูปหลายเหลี่ยมต่อหนึ่งส่วน แต่เกี่ยวข้องกับสิ่งต่าง ๆ เช่นจำนวนการเรียกสายการเปลี่ยนแปลงสถานะการส่งผ่านและอื่น ๆ - ซึ่งได้รับผลกระทบจากวิธีการทำงานของเครื่องยนต์ ฉากและอื่น ๆ ...
นาธานรีด

1
@Llamageddon พิจารณาความคิดเห็นของคุณฉันไม่แน่ใจว่าสิ่งที่คุณขอจริง ๆ ในอีกด้านหนึ่งชื่อคำถามของคุณค่อนข้างชัดเจน (รูปทรงเรขาคณิตสูงสุดและวิธีการทำเช่นนั้น) แต่เมื่อนาธานชี้ให้เห็นสิ่งนี้เป็นไปไม่ได้ที่จะตอบคำถาม ในความคิดเห็นของคุณคุณบอกว่าคุณต้องการทราบวิธีการลดต้นทุนต่อเฟรม นี่เป็นคำถามที่กว้างมากเพราะคุณสามารถปรับปรุง / เพิ่มประสิทธิภาพของเฉดสี, ​​ฉากกราฟ, โมเดล, พื้นผิว, การใช้ API, ทุกอย่างที่ทำบางส่วนของการเรนเดอร์ของคุณ คุณอาจจะเขียนหนังสือทั้งเล่มเกี่ยวกับเรื่องนี้ (ถ้ายังไม่ได้ทำโดยใคร)
Nero

1
นี่มันช้าไปนิดหน่อย แต่ที่นี่คุณสามารถเห็นตาข่ายแบบคงที่พร้อมจุดยอด 24.000.000 ในเครื่องปั่น และฉันสามารถหมุนอย่างราบรื่นด้วย 40 FPS ฉันคิดว่ามันน่าอัศจรรย์ในสิ่งที่การ์ดกราฟิกสมัยใหม่สามารถทำได้
user6420

คำตอบ:


5

ฉันคิดว่าเป็นที่ยอมรับกันโดยทั่วไปว่าเรียลไทม์คือทุกสิ่งที่อยู่เหนือการโต้ตอบ และอินเทอร์แอคทีฟหมายถึง "ตอบสนองต่ออินพุต แต่ไม่ราบรื่นในความจริงที่ว่าแอนิเมชันดูเหมือนจะสั่นคลอน"
ดังนั้นเวลาจริงจะขึ้นอยู่กับความเร็วของการเคลื่อนไหวที่เราต้องการแสดง โรงภาพยนตร์ฉายที่ 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" ...


1
ล้านคนดูเหมือนจะต่ำไปสำหรับฉัน
joojaa

เพียงแค่ใช้จำนวน MPoly / s ที่การ์ดมีความสามารถและนั่นคือ FPS ที่จะให้ได้ 1 ล้าน ฉันเพิ่งเรียกคืนการทดลองสำหรับตัวเรนเดอร์ภูมิประเทศบน ATI4800HD หากคุณใช้รายการนี้en.wikipedia.org/wiki/List_of_Nvidia_graphics_processing_unitsพวกเขาจะไม่ให้ข้อมูล Vertices / s เริ่มต้นจากยุคของสถาปัตยกรรมแบบครบวงจร แต่ฮาร์ดแวร์อายุ 10 ปีดูเหมือนจะโฆษณาประมาณ 40 FPS สำหรับสามเหลี่ยม 1 ล้าน + cf แก้ไขในคำตอบของฉัน
v.oddou

@ v.oddou ใช่ แต่เพื่อให้ได้ตัวเลขที่ใกล้เคียงคุณต้องทำการแบทช์ของรูปทรงเรขาคณิตหรืออินสแตนซ์ในกรณีของฉากแบบไดนามิกและนั่นคือสิ่งที่ฉันถาม ทำอย่างไรจึงจะไม่บรรจุขวดด้วยตัวคุณเองถึง 2% ของวิธีการที่ฮาร์ดแวร์สามารถทำได้
Llamageddon

@Llamageddon aaah ฉันเห็นว่านั่นเป็นคำถามที่แน่นอน ให้ฉันดูสิ่งที่ฉันสามารถพูดเกี่ยวกับมัน (EDIT2)
v.oddou

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