งบประมาณโมเดล 3 มิติ มีความสำคัญต่อรูปสามเหลี่ยมหรือจุดยอดมากเท่าใด


12

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

มันหมายความว่าฉันไม่ควรกังวลเกี่ยวกับการนับจุดยอดและมองดูที่รูปสามเหลี่ยมนับเท่านั้น?

แก้ไข: ฉันได้ทำการทดลองอีกครั้งฉันได้สร้างเครื่องบินที่มีรูปสามเหลี่ยม 19602 และ 10,000 จุดยอดและอีกอันหนึ่งที่มีจำนวน tirangles เท่ากัน แต่เป็นจุดยอด 39204 ฉันสร้าง 4,000 ทั้งคู่ ตอนนี้จุดยอดน้อยกว่าชนะ 14 fps ถึง 19 fps ดังนั้นฉันเดาว่าโดยทั่วไปจะน้อยกว่าดีกว่า แต่มีความแตกต่างใหญ่เท่านั้น


9
เขียนเกมของคุณและแก้ไขปัญหาที่เกิดขึ้น ปัญหาแบบนี้อาจไม่เกิดขึ้นและคุณจะเสียเวลา
เปล่า

คำตอบ:


16

ลองจินตนาการถึงตะแกรงตาข่ายขนาดใหญ่อย่างที่เราอาจใช้กับภูมิประเทศ เราจะทำให้nมันมีค่าสามเหลี่ยมซึ่งครอบคลุมว่าครึ่งหน้าจอ 1080p ของเราในการดึงสายเดียว

หากเราเชื่อมจุดยอดทั้งหมดของเราและไม่มีตะเข็บเรียบ / พื้นผิวจากนั้นแต่ละสามเหลี่ยมมี 3 จุดยอดและแต่ละจุดยอดจะใช้ร่วมกันโดยสามเหลี่ยม 6 รูปดังนั้นเราจึงมีn/2จุดยอด

ในการแสดงสิ่งนี้เราจำเป็นต้อง:

  • เรียกใช้จุดสุดยอดอย่างน้อยn/2ครั้ง

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

  • คลิปและnรูปสามเหลี่ยมที่คัดมา

  • ปรับภาพใหม่ & สอดแทรกอย่างน้อย 1920x1080 / 2 หรือประมาณ 1 ล้านพิกเซลของเฟรมบัฟเฟอร์ (เนื่องจากเรากล่าวว่าภูมิประเทศของเราครอบคลุมประมาณครึ่งหน้าจอ)

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

  • เรียกใช้ส่วนย่อยสำหรับส่วนทั้งหมด> = 1 ล้านชิ้นส่วน

  • ผสมผลลัพธ์ประมาณ 1 ล้านลงในบัฟเฟอร์เฟรมและความลึก

โอเคทีนี้เรามาจุดยอดทั้งหมดของเรากันแล้วตอนนี้เรามี3nจุดยอดที่จะเรนเดอร์มากกว่าเดิมหกครั้ง ! ขั้นตอนของเราคือ ...

  • เรียกใช้3nครั้งยอดสุดยอด

    (ไม่มีเครื่องหมายดอกจันเนื่องจากการแคชเนื่องจากจุดสุดยอดทั้งหมดถูกใช้เพียงครั้งเดียว แต่นี่หมายความว่าแคชไม่สามารถช่วยเราได้ตลอดเวลา)

  • คลิปและnรูปสามเหลี่ยมที่คัดมา

  • ปรับภาพใหม่ & สอดแทรกอย่างน้อย 1920x1080 / 2 หรือประมาณ 1 ล้านพิกเซลของบัฟเฟอร์เฟรม

  • เรียกใช้ส่วนย่อยสำหรับส่วนทั้งหมด> = 1 ล้านชิ้นส่วน

  • ผสมผลลัพธ์ประมาณ 1 ล้านลงในบัฟเฟอร์เฟรมและความลึก

... รอทุกขั้นตอนยกเว้นขั้นตอนแรกเหมือนกัน! ดังนั้นงานส่วนใหญ่ที่ GPU ทำในการเรียกแบบดึงปกติไม่เกี่ยวข้องโดยตรงกับจำนวนจุดยอดที่ใช้ จำนวนการครอบคลุมหน้าจอการลบล้างและการนับสามเหลี่ยมทั้งหมดทำให้มีค่าใช้จ่ายมากขึ้น

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


สิ่งที่เกี่ยวกับค่าใช้จ่ายในการส่งจุดยอดเหล่านั้นไปยังหน่วยความจำ?
MichałLeszczyński

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

จะเพิ่มสิ่งนี้ตามที่ฉันกำลังทำป่าไม้ ฯลฯ ในเกมของฉัน เมื่อฉันเริ่มฉันเริ่มใช้การโทรแบบสุ่ม (ฉันใช้เครื่องมือของตัวเองซึ่งอาจไม่สอดคล้องกับคำถามของคุณ) ในการวาดแบบจำลองด้วย verts เท่านั้นในตัวมันเองก็โอเคประสิทธิภาพก็ดี แต่เมื่อฉันเริ่มใช้การจัดทำดัชนีฉันได้รับการปรับปรุงประสิทธิภาพเนื่องจากมีการใช้ verts ร่วมกันและแคชดังนั้นการคำนวณบางอย่างจึงไม่ได้ทำสองครั้ง สิ่งที่สำคัญที่สุดคือการทดสอบ verts เพียงอย่างเดียวนั้นไม่ใช่ตัวบ่งชี้ verts ที่ดีที่สุดเทียบกับ tri counts ไปป์ไลน์ของคุณอาจได้รับผลกระทบมากเกินไป ในขณะที่คำตอบอื่น ๆ หมายถึง
ErnieDingo

2

ทั้ง

นอกจากว่าคุณกำลังพูดถึงจำนวน tris (ล้าน) จำนวนมหาศาลสิ่งที่คุณสนใจก็คือ:

  • จำนวนพิกเซลที่แสดงผล
  • ค่าใช้จ่ายของชิ้นส่วน shader
  • จำนวนการเรียกสาย (โดยมีขีด จำกัด อย่างยิ่งขึ้นอยู่กับอุปกรณ์)

24 vertices คูณ 4000 cubes ให้ 96'000 vertices

640x380 พิกเซลให้ 243'200 แฟรกเมนต์และอุปกรณ์ส่วนใหญ่รองรับความละเอียดที่ใหญ่กว่ามาก

คุณสามารถเรียกใช้การทดสอบของคุณใหม่ด้วย 1'000'000 คิวบ์เพื่อหลีกเลี่ยงปัญหาคอขวดการเรียก (1 โมเดลเดียวสำหรับ 1'000 คิวบ์)


2
สิ่งนี้ขึ้นอยู่กับฉากและวิธีการแสดงของคุณ หากคุณมีฉากที่มีการเบิกจ่ายค่อนข้างน้อยการประมวลผลจุดสุดยอดอย่างแน่นอนสามารถควบคุมประสิทธิภาพของคุณได้ นอกจากนี้จำนวนการเรียกการดึงไม่ได้เป็นปัญหา (สำหรับบาง API) มากเท่ากับการเปลี่ยนแปลงสถานะระหว่างการเรียกการดึง
Nicol Bolas

1

น่าสังเกตว่าถ้าคุณใช้แอปพลิเคชั่น WebGL การนับจุดสุดยอดอย่างรวดเร็วจะกลายเป็นคอขวดในแง่ของขนาดไฟล์สำหรับผู้ใช้ในการดาวน์โหลด จำนวนสามเหลี่ยมเท่ากัน แต่มักจะมีจุดยอดมากกว่า 2-3 เท่ามากกว่าที่แสดงในซอฟต์แวร์ DCC การแกะที่ดีกว่าสามารถช่วยได้มากในกรณีนี้โดยมีตะเข็บน้อย

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