รายละเอียดพื้นผิวใช้เวลาในการแสดงนานกว่าหรือไม่?


22

สมมุติว่าฉันต้องการวาดสี่เหลี่ยม พื้นผิวของมันคือ "square.png."

คอมพิวเตอร์จะแสดงผลได้ง่ายขึ้นหรือไม่ถ้าพื้นผิวเป็นเพียงสีธรรมดา

แล้วถ้ามันเป็นพื้นผิวที่มีเสียงดังมากด้วยสีแบบสุ่มที่นี่และตรงนั้นล่ะ?

หรือว่าถ้าพื้นผิวนั้นมีเสียงดังในแง่ที่ว่าทุกพิกเซลในนั้นแตกต่างจากที่หนึ่งไปยังอีก แต่เพียงเล็กน้อย?

คำตอบ:


39

เหมือนกับสิ่งส่วนใหญ่ในการพัฒนาเกมและโดยเฉพาะอย่างยิ่งในกราฟิกเกมคำตอบคือ "มันขึ้นอยู่กับ"

ขนาดพื้นผิว

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

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

รายละเอียดพื้นผิว

เนื้อหาของพื้นผิวของคุณไม่มีผลต่อประสิทธิภาพการแสดงผลส่วนใหญ่

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

ซึ่งแตกต่างจากรูปแบบเช่น PNG & JPG ซึ่งบีบอัดได้อย่างมีประสิทธิภาพมากขึ้นในพื้นที่ที่คาดการณ์ของภาพและกินบิตเพิ่มเติมในภูมิภาคที่ซับซ้อนรูปแบบพื้นผิวของ GPU เช่น BTC ETC PVRTC หรือแม้แต่ RGBA ดิบใช้จำนวนบิตต่อบล็อกคงที่ พิกเซล ดังนั้นการทำให้พื้นผิวของคุณมีรายละเอียดมากขึ้นหรือน้อยลงในขณะที่รักษารูปแบบการบีบอัดข้อมูลเดียวกันจะไม่เปลี่ยนขนาดข้อมูลหรือส่งผลกระทบต่อการถ่ายโอนข้อมูลและประสิทธิภาพที่เกี่ยวข้องกับแคช

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

Shader Branching & Indirection

นี่คือเครื่องหมายดอกจันที่ใหญ่ที่สุดในสถานการณ์: คุณอาจใช้อินพุตสีพื้นผิวเพื่อทำการตัดสินใจเช่นเดียวกับif()สาขา ที่นี่รายละเอียดสำคัญสำหรับความเร็ว

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

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

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


ดังนั้นโดยรวม: ไม่เนื้อหาของพื้นผิวไม่มีผลต่อความเร็วในการเรนเดอร์ยกเว้นกรณีที่เกิดขึ้น ;)


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

6
@immibis Minecraft มีพื้นผิวเล็ก ๆ ค่าเริ่มต้นคือ 16x16 ซึ่งพอดีกับแคชพื้นผิวของแต่ละคอร์ที่ไม่ตลก: D และใช่ตัวอย่างพื้นผิวส่วนใหญ่จะเป็นเท็กเซลเดียวกันเว้นแต่ว่าคุณอยู่ห่างจากบล็อกมาก นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งถ้าคุณคำนึงถึงการแบ่งหน้าจอ - ถ้าคุณปิดเหตุผลทั้งชุดสำหรับคอร์ที่ระบุอาจแมปไปที่เท็กเซลเดียวกัน: DA ง่ายกว่า GPU น่าจะทำงานได้ดีกว่าสำหรับพื้นผิวที่มีความคมชัดต่ำ - ความพยายามมากมายถูกทำให้สูญเสียไปกับการปรับให้เหมาะสมที่ไม่ได้ช่วยอะไรสำหรับ Minecraft
Luaan

1
หมายเหตุด้านข้าง: "การใช้จำนวนไบต์ต่อพิกเซลเท่ากัน" เป็นกุญแจสำคัญในการแฮ็กความเร็วที่โค้ดกราฟิกใช้ หากคุณพยายามใช้ PNG ภายในหรือแม้กระทั่งบางอย่างเช่น UTF-8 ที่มีขนาดพิกเซลที่แปรปรวนเพื่อไปยังnพิกเซลที่สามคุณจะต้องผ่านทุกพิกเซลก่อน ที่มีความกว้างพิกเซลไบต์คงเป็นเพียงstart_of_buffer + width * nซึ่งเป็นมากnได้เร็วขึ้นโดยเฉพาะอย่างยิ่งใหญ่
คดีของกองทุนโมนิกา

@ Luaan ฉันหมายความว่าแม้ว่าคุณจะอยู่ห่างไกลจากบล็อกเมื่อมันดึงเท็กเซลหนึ่งอัน (อันใดอันหนึ่งเป็นที่แรก) ก็ควรดึงบางอันที่อยู่ติดกันลงในแคชเช่นกัน
user253751

4
นั่นคือกรณีที่ฉันพูดถึงข้างต้นด้วยการทำแผนที่ เพื่อหลีกเลี่ยงการมีตัวอย่างของเราข้ามไปทั่วพื้นผิวโดยปล่อยให้ช่องว่างขนาดใหญ่ระหว่างที่ไม่มีการใช้แคชไม่มากเราจึงเก็บรุ่น 512x512 และรุ่น 256x256 และ .... จนสุดถึง 1x1 บางครั้ง ดังนั้นเมื่อวาดภาพพื้นผิว 1024x1024 ที่ 16x16 เกมส่วนใหญ่จะอ่านจาก 16x16 mip และทำงานคล้ายกับกรณี Minecraft ขนาด 16x16 ในแง่ของประสิทธิภาพแคช สิ่งนี้ยังช่วยลดการสร้างสมนามนามแฝง sparkly จากการสุ่มตัวอย่าง
DMGregory

1

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

ฮาร์ดแวร์ที่ทันสมัยบางตัวอาจใช้การบีบอัดแบบไม่มีการสูญเสียกับบัฟเฟอร์เหล่านี้: ตัวอย่างเช่น PowerVR มีPVRIC , AMD, การบีบอัดสี Deltaและ ARM มีบางอย่างที่คล้ายกัน จุดประสงค์ของเทคนิคการบีบอัดข้อมูลเหล่านี้คือการลดแบนด์วิดท์โดยรวมซึ่งในทางกลับกันก็สามารถปรับปรุงประสิทธิภาพการแสดงผลได้

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

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

นอกจากนี้คุณอาจพบคำถามและคำตอบที่น่าสนใจ:

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