พื้นผิวใช้หน่วยความจำใน GPU มากแค่ไหน?


9

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

คำตอบ:


16

ไฟล์ JPG และ PNG เกือบทุกครั้งจะมีขนาดเล็กบนดิสก์มากกว่าในหน่วยความจำ พวกเขาจำเป็นต้องคลายการบีบอัดแบบทันทีเพื่อรับข้อมูล RGB แบบดิบซึ่งต้องการพลังการประมวลผลที่มากขึ้นสำหรับการโหลดและ RAM เพิ่มเติมหลังจากนั้น เอ็นจิ้นสมัยใหม่จำนวนมากเลือกที่จะจัดเก็บรูปแบบเดียวกันบนดิสก์เช่นเดียวกับที่ทำในหน่วยความจำซึ่งนำไปสู่ไฟล์ที่มีขนาดเท่ากับความต้องการหน่วยความจำของพื้นผิว (แต่ยังมีขนาดใหญ่กว่า PNG หรือ JPG) RGB / RGBA และ S3TC / DXTn / BCn เป็นรูปแบบที่ใช้กันอย่างแพร่หลายเนื่องจากมีการอ่านหน่วยความจำโดยตรงโดยไม่ต้องดำเนินการใด ๆ (พื้นผิว DXT ถูกบีบอัดไว้ล่วงหน้า)

ดังนั้นขนาดเหล่านี้สำหรับรูปแบบพื้นผิวทั่วไปที่ต่างกัน:

  • L (ความสว่างเช่น greyscale): ความกว้าง * ความสูง * 1 ไบต์
  • LA (ความสว่างและอัลฟาทั่วไปสำหรับฟอนต์): ความกว้าง * ความสูง * 2 ไบต์
  • RGB (สี, ไม่มีตัวอักษร): width * height * 3 bytes
  • RGBA (สีพร้อมอัลฟ่า): ความกว้าง * ความสูง * 4 ไบต์
  • DXT1 / BC1 (สี, อัลฟาไบนารี): (กว้าง * สูง * 4 ไบต์) / 8 (อัตราส่วนการบีบอัด 8: 1)
  • DXT3 / BC2 (สี, อัลฟ่าที่คมชัด) / DXT5 / BC3 (สี, การไล่ระดับสีอัลฟา): (ความกว้าง * ความสูง * 4 ไบต์) / 4 (อัตราส่วนการบีบอัด 4: 1)

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

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


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

แน่นอนว่าทำได้ แต่ตรวจสอบสินทรัพย์ที่ใช้ในเกมที่สร้างด้วย Unreal Engine, Source และอื่น ๆ พวกเขามักจะไม่ถูกบีบอัดบนดิสก์เพราะทุกวันนี้มีเนื้อที่ว่างบนดิสก์มากกว่าเพียงพอที่จะปล่อยให้ทรัพยากรไม่บีบอัด และพื้นที่ที่บันทึกไว้ไม่ได้ทำขึ้นสำหรับ RAM และเวลา CPU เพิ่มเติมที่จำเป็นในการแตกไฟล์ในการโหลดแต่ละครั้ง
r2d2rigo

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

ส่วนใหญ่ถูกต้องยกเว้นว่ารูปแบบ RGB ปกติไม่มีอยู่จริงบน GPU ดู: opengl.org/wiki/Common_Mistakes#Texture_upload_and_pixel_reads
Maximus Minimus

9

เห็นได้ชัดว่ามันขึ้นอยู่กับรูปแบบ

ลองเปลี่ยนพื้นผิวสี่เหลี่ยมจัตุรัส 256 คูณ 256 พิกเซล หากไม่มีการบีบอัด 32- บิตพร้อมช่องอัลฟา (เป็นColorXNA) แสดงว่าใช้ขนาด256KB ( 256*256*4ไบต์)

รูปแบบ 16 บิต (เช่นBgr565) เห็นได้ชัดว่าจะมีขนาดเพียงครึ่งหนึ่ง - 128KB

จากนั้นคุณก็เข้าสู่รูปแบบการบีบอัด ใน XNA คุณมี DXT1, DXT3 และ DXT5 (หรือที่รู้จักในชื่อS3 Compression ) นี่เป็นรูปแบบการบีบอัดที่สูญเสีย นอกจากนี้ยังเป็นรูปแบบบล็อกตาม - ซึ่งหมายความว่าคุณสามารถสุ่มตัวอย่างจากมัน (เพราะคุณรู้ว่าบล็อกพิกเซลอยู่ใน) นอกจากนี้ยังเร็วกว่าเพราะคุณใช้แบนด์วิดท์น้อยลง

อัตราส่วนการบีบอัดของ DXT1 คือ 8: 1 และสำหรับ DXT3 และ DXT5 คือ 4: 1

ดังนั้นภาพของ DXT1 256x256 เป็น32KB และ DXT3 หรือ DXT5 เป็น64KB

แล้วมีMipmapping หากเปิดใช้งานสิ่งนี้จะสร้างชุดของภาพในหน่วยความจำกราฟิกแต่ละขนาดครึ่งหนึ่งของขนาดก่อนหน้า ดังนั้นสำหรับภาพ 256x256 ของเรา: 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2, 1x1 พื้นผิวที่มีการแม็ปการทำแผนที่มีขนาดประมาณ133%ของขนาดดั้งเดิม


4

GPU ส่วนใหญ่สามารถอ่านรูปแบบการบีบอัดที่เฉพาะเจาะจงได้เท่านั้น เช่น. BC *, DXT * ไม่ใช่รูปแบบเช่น png ดังนั้นใช่มันเป็นความจริงส่วนใหญ่ที่. png จะใช้พื้นที่ในหน่วยความจำวิดีโอมากกว่าบนดิสก์

พื้นผิวสามารถเก็บบีบอัดหรือไม่บีบอัดในหน่วยความจำวิดีโอและหน่วยความจำระบบ

สำหรับพื้นผิวที่ไม่มีการบีบอัดกฎทั่วไปของหัวแม่มือคือมันจะใช้พื้นที่จำนวนเท่ากันในหน่วยความจำวิดีโอเช่นเดียวกับในรูปแบบที่ไม่มีการบีบอัดในหน่วยความจำระบบ

สำหรับพื้นผิวที่บีบอัด DXT1 GPU จัดเก็บ 8 ไบต์สำหรับไทล์ 4x4 แต่ละอันในพื้นผิวของคุณ ข้อมูลที่ไม่มีการบีบอัด (ที่ 8 บิตต่อช่อง RGB) โดยปกติแล้วจะเป็น 4x4x3 = 48 ไบต์ดังนั้นนั่นคืออัตราส่วนการบีบอัด 6: 1 สำหรับพื้นผิวที่ถูกบีบอัดของ DXT3 / DXT5 GPU จะจัดเก็บ 16 ไบต์สำหรับไทล์ 4x4 แต่ละอันในพื้นผิวของคุณ นั่นคืออัตราส่วนการบีบอัดที่ลดลงเล็กน้อยที่ 3: 1

มีข้อ จำกัด บางประการที่มีพื้นผิวที่ไม่บีบอัดและมีการบีบอัด:

  • หน่วยความจำส่วนใหญ่ถูกจัดสรรในหน้า (ขนาดที่แตกต่างกันระหว่าง GPU) ขนาดคงที่ เช่น. 4KB และบ่อยครั้งที่ไม่ได้ถูกจัดสรรย่อยและแบ่งปันกับข้อมูล GPU อื่น ๆ กล่าวคือ หากพื้นผิวของคุณมีขนาดเล็กกว่าขนาดหน้ารอยใน vid mem มักจะยังคงเป็นขนาดหน้ากระดาษ

  • gpus บางตัวมีข้อกำหนดการจัดตำแหน่งที่เฉพาะเจาะจงมาก ในอดีต GPU บางรุ่นมีข้อกำหนดว่าพื้นผิวมีขนาดเท่ากับ 2 สิ่งนี้มักจะต้องใช้เพื่อสนับสนุนการเป็นตัวแทนแบบ swizzled (ดู Morton Ordering: http://en.wikipedia.org/wiki/Z-order_(curve )) เพื่อปรับปรุงการเข้าถึงท้องถิ่นเมื่อทำการสุ่มตัวอย่างจากพื้นผิว นี่หมายความว่าพื้นผิวที่มีขนาดคี่จะถูกบุรองเพื่อรักษาข้อกำหนดเหล่านี้ (โดยทั่วไปการเว้นระยะนี้ถูกจัดการโดยคนขับ) แม้ว่ามอร์เดอร์ - ออร์เดอร์นั้นไม่จำเป็นต้องใช้ใน gpus ยุคใหม่ แต่ก็อาจจะมีอาการท้องอืดที่จะสนับสนุนข้อกำหนดเฉพาะของ GPU

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

  • หากคุณเปิดใช้งานการทำแผนที่ mips เพิ่มเติมจะใช้งานโดยเฉลี่ยประมาณหนึ่งในสามของระดับ mip พื้นฐาน YMMV อิงตามคำเตือนข้างต้น


0

AFAIK คือความกว้างของภาพ * สูง * BPP ซึ่งเป็นอิสระหากเป็น PNG, JPG หรือ BMP ฉันไม่รู้ว่า DDS หรือรูปแบบการบีบอัดอื่น ๆ นั้นถูกจัดวางอย่างไร

การทำแผนที่ Mip จะเพิ่มความต้องการหน่วยความจำวิดีโอ

ความรู้ของฉันในหัวข้อนี้อาจจะล้าสมัยไปเล็กน้อย ฉันละทิ้ง 3D มานานแล้ว


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

1
โดยปกติ "ระยะห่าง" หมายถึงความยาวของ scanline เป็นไบต์ (ใน Freetype และ SDL) และ "stride" หมายถึงช่องว่างระหว่างองค์ประกอบซึ่งอาจเป็นพิกเซลหรือ scanlines (เช่นในข้อโต้แย้งชิ้นที่ 3 ของ OpenGL และ Python) ค่าทั้งสองจำเป็นต้องใช้ในการประมวลผลภาพ แต่โดยทั่วไป "ปกติ" pitch = width * bytes_per_pixel และ stride = 0 คำเหล่านี้มักจะถูกใช้อย่างหลวม ๆ และสับสนดังนั้นควรตรวจสอบเอกสาร API สำหรับห้องสมุดที่คุณเลือก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.