ฉันจะสำรวจฉากที่ไม่พอดีกับหน่วยความจำได้อย่างไร


11

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

มีวิธีใดบ้างไหม? ฉันพยายามคิดถึงวิธีการคำนวณจำนวนมากที่เกี่ยวข้องกับเซตย่อยของฉากในคราวเดียวเพื่อลดจำนวนครั้งที่ต้องโหลดลงในหน่วยความจำ มีวิธีอื่นในการปรับปรุงความเร็วในกรณีเช่นนี้หรือไม่?

คำตอบ:


10

หากฉากนั้นไม่พอดีกับหน่วยความจำคุณกำลังเข้าสู่ฟิลด์ของการเรนเดอร์นอกคอร์ โดยทั่วไปมีสองวิธีดังนี้ a) สร้างฉากตามต้องการ b) โหลดฉากตามต้องการ

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

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

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

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

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

นอกจากนี้คุณยังสามารถรวมวิธีการนี้เข้ากับอัลกอรึทึมการจัดเรียงเรย์เช่นแรเงาเรียงลำดับที่รอการตัดบัญชีสำหรับการติดตามเส้นทางการผลิตเพื่อหลีกเลี่ยงการเฆี่ยนตีเนื่องจากรังสีที่ไม่ต่อเนื่องกัน บทความที่กล่าวถึงอธิบายถึงสถาปัตยกรรมของ Hyperion renderer ของ Disney ที่ใช้สำหรับ Big Hero 6 ฉันเชื่อว่าดังนั้นจึงมีโอกาสมากที่สุดที่จะจัดการฉากในระดับการผลิต


1
มันน่าสนใจมาก! เช่นเดียวกับกระดาษ Disney ที่คุณเชื่อมโยง
John Calsbeek

+1 คำตอบมากมายต่อสิ่งที่ฉันสงสัยอยู่เสมอ!
Rotem

7

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

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

วิธีนี้จะโหลดกล่องตามที่ต้องการเท่านั้น: เมื่อรังสีกระทบกับกล่องที่มีขอบเขตกล่องจะถูกโหลดเพื่อแก้ไขการชน ในภายหลังเมื่อต้องโหลดกล่องอื่นกล่องที่ไม่ได้ใช้จะถูกลบเพื่อให้มีที่ว่างสำหรับกล่องใหม่

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


ใช่บางสิ่งเช่นนี้
joojaa

1

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

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

มีหลายกรณีที่สิ่งนี้ล้มเหลว แต่มีประสิทธิภาพพอสมควรในที่เก็บฉากส่วนใหญ่หากคุณไม่แสดงสัญญาณรบกวน ...

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