ฉันควรใช้พื้นผิวที่ไม่ได้มีขนาดเท่ากับกำลัง 2 หรือไม่?


40

ในวันแรก ๆ ของ OpenGL และ DirectX ขนาดของพื้นผิวจะต้องเป็นพลังของสอง นั่นหมายถึงการแก้ไขค่าลอยสามารถทำได้อย่างรวดเร็วโดยใช้การเลื่อนและเช่นนั้น

ตั้งแต่ OpenGL 2.0 (และก่อนหน้านั้นผ่านมิติส่วนขยาย) ที่ไม่ใช่พลังงานของสองพื้นผิวได้รับการสนับสนุน

พื้นผิวพลังแห่งสองมีข้อได้เปรียบด้านประสิทธิภาพการทำงานกับ GPU แบบรวมและแยกแบบใหม่หรือไม่? พื้นผิวที่ไม่มีพลังงานสองข้อได้เปรียบมีอะไรบ้าง

ประชากรเดสก์ท็อปที่สำคัญมีการ์ดที่รองรับพื้นผิวที่ไม่ใช่พลังงานหรือไม่?


ดูคำตอบที่ยอดเยี่ยมสำหรับคำถามที่คล้ายกัน: ทำไมรูปภาพสำหรับพื้นผิวบน iPhone จึงต้องมีขนาดกำลังไฟสองเท่า
Dvole

คำตอบ:


15

มีข้อได้เปรียบด้านประสิทธิภาพหรือไม่ในการผสานกับพลังของสองพื้นผิวใน GPU แบบรวมและแยกที่ทันสมัย?

GPU ที่ทันสมัยส่วนใหญ่รองรับพื้นผิวที่ไม่ใช้กำลังสอง (NPOT) และจัดการได้ดี ประสิทธิภาพลดลงค่อนข้างน้อย แต่มีปัญหาเล็กน้อยที่ต้องพิจารณา:

  • เมื่อใช้พื้นผิว NPOT จะใช้พื้นที่ใน RAM มากขึ้นเช่นเดียวกับพื้นผิว POT ขนาดถัดไป ในทางเทคนิคคุณเพียงแค่เสียพื้นที่ที่สามารถนำมาใส่อะไรบางอย่างในนั้น

  • พื้นผิว NPOT อาจถูกจัดการช้าลงอย่างเห็นได้ชัด (ใน OpenGL 2.1 ฉันมีประสิทธิภาพลดลงมากถึง 30%) เมื่อเทียบกับ POT ขนาดถัดไป

  • GPU ที่เก่ากว่าและ GPU บนชิปเซ็ตนั้นไม่ได้ก้าวหน้าไปมากพวกเขามักจะรองรับพื้นผิว NPOT แต่การสนับสนุนค่อนข้างช้าและเงอะงะ

  • แม้แต่ GPU ที่เก่ากว่าก็อาจปฏิเสธที่จะยอมรับ / แสดงพื้นผิว NPOT ได้เลย

  • อาจมีการวางสิ่งประดิษฐ์ที่เกิดจากการแก้ไข mip-map พื้นผิว 25x25 ของคุณอาจมีขอบสีดำที่มีการเพิ่มพิกเซลลงในสิ่งที่มีขนาด 32x32

PS ฉันไม่รู้เกี่ยวกับอุปกรณ์พกพาอย่างแน่นอนอาจมีข้อ จำกัด เพิ่มเติมเกี่ยวกับพื้นผิว POT

หากไม่มีพื้นผิวที่ไม่ใช่พลังงานของข้อดีมีอะไรบ้าง?

เท่าที่ฉันรู้มีเพียง 2 ข้อได้เปรียบ:

  • พวกเขาใช้พื้นที่น้อยลงใน HDD ถ้าพวกเขาไม่ได้บรรจุ (เมื่อพื้นที่ว่างบรรจุให้เพิ่มน้อยมาก)
  • คุณสามารถประหยัดเวลาในการเขียน NPOT -> ตัวแปลง POT คุณจะต้องใช้หนึ่งรุ่นสำหรับรุ่นวางจำหน่าย แต่การใช้พื้นผิว NPOT สำหรับการออกแบบและการสร้างต้นแบบส่วนต่อประสาน / รุ่นนั้นทำได้ดี

มีผู้ใช้เดสก์ท็อปจำนวนมากที่ไม่มีการ์ดที่รองรับพื้นผิวที่ไม่ได้กำลังไฟหรือไม่?

เท่าที่ฉันรู้และทดสอบบนพีซี - ใช่ นั่นรวมถึงร้อยละที่สำคัญของ GPU ความเร็วลดลง / เล็กน้อยข้อผิดพลาดและร้อยละเล็กน้อยของการ์ดที่จะไม่จัดการ NPOT เลย


6

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

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


4

มีข้อ จำกัด สำหรับพื้นผิว NPOT บนฮาร์ดแวร์รุ่นเก่า ตามที่กล่าวไว้ในวิกิ OpenGL นี้ฮาร์ดแวร์ที่เก่ากว่าบางตัวต้องการ NPOTs ที่จะไม่มี mipmaps พื้นผิวที่ถูกบีบอัดต้องการการจัดแนวพิกเซล 4x4 แต่ฮาร์ดแวร์ใหม่ควรจัดการได้อย่างสมบูรณ์

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

เหตุใดจึงใช้ NPOT แทน POT ถ้าคุณมีภาพที่มีขนาด NPOT ให้พูดเช่น 1600x1200 การใช้พื้นผิวพิกเซล 2048x2048 จะทำให้เสียหน่วยความจำวิดีโอจำนวนมาก


3
หากคุณใช้รูปแบบพื้นผิวที่ถูกบีบอัดในหน่วยความจำ (ตัวอย่างเช่น PVR หรือ DXT) การปรับขนาดให้เหลือกำลังสองถัดไปคือการใช้หน่วยความจำพื้นผิวที่น้อยกว่าอย่างไม่มีนัยสำคัญ
Tetrad

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

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

-1

พลังของพื้นผิว 2 เพิ่มประสิทธิภาพประมาณ 30% สำหรับ GPU ทุกประเภทไม่เพียง แต่ GPU เก่า (เร็วขึ้น 30% คือความแตกต่างระหว่าง GPU ระดับสูงและค่าเฉลี่ยหนึ่ง) พวกเขาใช้ RAM 30% แต่ต้องการ vram น้อยกว่าพวกเขาเพิ่มคุณภาพโดย การให้ขนาดพื้นผิวที่เหมาะสมสำหรับระยะทางที่เฉพาะเจาะจงมันทำงานเหมือนการต่อต้านนามแฝงสำหรับพื้นผิวสิ่งประดิษฐ์เส้นมืดควรได้รับการจัดการโดยเอ็นจิ้นเกมและเครื่องมือ aaa จัดการกับมันได้ดี


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

ขอโทษฉันเข้าใจผิดคำถามด้วยพลังของ 2 คุณถูก จำกัด ที่ 2048, 1024, 512 ฯลฯ อาจเป็นเหตุผลหลัก
yusef ghatavi

ยังไม่มีอำนาจ 2 มีประโยชน์สำหรับพื้นผิวที่ไม่ต้องการ mipmaps เช่นพื้นผิว gui และพื้นผิวสำหรับตัวละครคนแรกที่มักจะอยู่ใกล้กับกล้อง
yusef ghatavi

-3

โปรแกรมโปรแกรมเมอร์ของฉันมีขนาดที่ถูกต้องเท่านั้น

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


6
โดยปกติหนึ่งตำแหน่งรูปหลายเหลี่ยมไม่ใช่พื้นผิวบนหน้าจอ รูปหลายเหลี่ยมสามารถให้ได้ตามความต้องการของยูวี - ไม่จำเป็นต้องไปจาก 0 ถึง 1; หากพื้นผิวของคุณกว้างเพียง 30 มันก็ดีที่จะไปที่ 0.9375 (ซึ่งเป็นอีกเหตุผลหนึ่งที่ทำให้พื้นผิว POT ดี - UV เป็นตัวแทนที่แน่นอน)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.