เหตุใดเราจึงมีกรอบกราฟิกเช่น OpenGL และ DirectX เมื่อเกมสามารถวาดพิกเซลได้โดยตรง


16

เกมและแอพพลิเคชั่นที่เน้นกราฟิกอื่น ๆ ใช้เฟรมเวิร์กเช่น OpenGL และ DirectX พวกมันต้องการคุณสมบัติเช่น pixel shader และ DX12

แต่ทำไมเราต้องใช้เฟรมเวิร์กและฟีเจอร์ GPU ทั้งหมดเมื่อเราสามารถวาดทุก ๆ พิกเซลทีละพิกเซลได้?

ขั้นแรกเกมจะต้องรวบรวมในลักษณะดังนั้นจึงถูกวาดพิกเซลโดยพิกเซล สิ่งนี้มีแนวโน้มที่จะทำให้เกมใช้งานได้ดี แต่จะเร็วกว่าและทำงานกับ GPU สี 32 บิตใด ๆ (แม้กระทั่งเก่า)

ฉันรู้ว่าเกม 3 มิติแรกถูกวาดทีละพิกเซล แต่ทำไมพวกเขาถึงไม่ทำในตอนนี้


โดยทั่วไปแล้วการทำสิ่งเดียวในหลาย ๆ อย่างนั้นมีประสิทธิภาพและคิดได้ง่ายกว่าทำทุกสิ่ง
user541686

2
เพราะทุกเกมจะต้องมีการเขียนใหม่สำหรับการ์ดกราฟิกทุกอัน เว้นแต่ว่าพวกเขาไม่ได้ใช้กราฟิกการ์ด แต่ก็ช้า
user253751

ฉันคิดว่า บริษัท GPU ต้องสร้างไดรเวอร์ DirectX ของตัวเอง
Suici Doga

1
"แต่ทำไมเราต้องใช้เฟรมเวิร์กและฟีเจอร์ GPU ทั้งหมดเมื่อเราสามารถวาดทุก ๆ พิกเซลทีละพิกเซลได้" นั่นเป็นวิธีที่ทำได้ในวันเฒ่าที่ดี Wolfenstein 3D, Doom, Duke Nukem 3D, Quake และเกมอื่น ๆ ส่วนใหญ่ในช่วงปลายปี '90 ใช้การเรนเดอร์ซอฟต์แวร์ที่บริสุทธิ์ (Quake เสนอตัวเลือก OpenGL เป็นตัวเลือก)
el.pescado

1
@MatthewRock คุณไม่มีประโยชน์ แน่นอนคุณสามารถรวมระบบปฏิบัติการกับเกมภายในคอนเทนเนอร์นักเทียบท่าและแจกจ่ายคอนเทนเนอร์ ด้วยวิธีนี้ผู้ใช้ไม่จำเป็นต้องติดตั้งการอ้างอิงไลบรารีสำหรับ distro
Navin

คำตอบ:


23

ความเร็วเป็นสาเหตุที่พบบ่อยที่สุดว่าทำไมจึงไม่ทำเช่นนี้ ในความเป็นจริงคุณสามารถทำสิ่งที่คุณเสนอถ้าคุณสร้างระบบปฏิบัติการของคุณเองมันจะช้ามากด้วยเหตุผลทางสถาปัตยกรรม ดังนั้นการสันนิษฐานว่ามันเร็วกว่านั้นมีข้อบกพร่องเล็กน้อย แม้ว่ามันจะเร็วกว่า แต่ก็มีประสิทธิภาพน้อยลงในแง่ของการพัฒนา (เช่นเพิ่มความเร็ว 1% สำหรับการทำงาน 10 เท่า)

การคัดลอกข้อมูลจาก CPU ไปยังการ์ดกราฟิกเป็นการทำงานที่ค่อนข้างช้า ยิ่งคุณคัดลอกความเร็วในการอัปเดตน้อยลงเท่าไหร่ ดังนั้นคุณควรมีข้อมูลส่วนใหญ่ใน GPU ของคุณและอัปเดตข้อมูลจำนวนเล็กน้อยเท่านั้น มีโลกที่แตกต่างระหว่างการคัดลอกมากกว่า 320x200 พิกเซลเทียบกับ 1920x1200 หรือมากกว่านั้น ดูจำนวนพิกเซลที่คุณต้องอัปเดตเพิ่มขึ้นเป็นสองเท่าเมื่อด้านข้างโตขึ้น

ตัวอย่าง: การบอกให้ GPU ย้ายรูปภาพขนาด 10 พิกเซลนั้นถูกกว่าการคัดลอกพิกเซลแบบแมนนวลไปยังหน่วยความจำวิดีโอในตำแหน่งต่างๆ

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

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

PS: API ไม่ทำให้เป็นไปไม่ได้ที่จะทำการอัปเดตนี้เหมือนกับเกมเก่า ๆ มันไม่มีประสิทธิภาพแค่นั้นแหละ ไม่ใช่เพราะความคิด API แต่เป็นช่วงเวลาที่ไม่มีประสิทธิภาพ

PPS: นี่คือเหตุผลที่พวกเขากำลังจะเปิดตัว Vulkan


6
See the number of pixels you need to update grows exponetially when the sides grow.ฉันคิดว่ากำลังสอง
คธูลู

"การคัดลอกข้อมูลจาก CPU ไปยังการ์ดกราฟิกเป็นการทำงานที่ค่อนข้างช้า" นี่เป็นเรื่องจริง แต่ไม่เกี่ยวข้อง การคัดลอกมากกว่าสองสามล้านพิกเซลที่ 60 fps สามารถทำได้อย่างง่ายดายผ่านลิงค์ PCI-E ที่เรียบง่าย (มันต้องการเพียงไม่กี่ร้อยเมกะไบต์ต่อวินาที)
Coxy

2
@ pjc50 ไม่ผิด แต่ก็ไม่จริงเหมือนกัน GPU มีความเชี่ยวชาญในการเรียกใช้โปรแกรมเดียว (โดยปกติจะเป็น shader) พร้อมกันกับข้อมูลจำนวนมาก ดังนั้นคุณต้องทำการดำเนินการเดียวกันกับข้อมูลจำนวนมากเพื่อใช้พลังการประมวลผลของ GPU หากโปรแกรมของคุณไม่ทำงานคุณควรรันโปรแกรมบน CPU
Nero

2
x22x

1
คุณพูดคุยเกี่ยวกับการคัดลอกและย้าย แต่สิ่งที่สำคัญกว่าคือการสร้างภาพที่แท้จริง คุณต้องกำหนดว่าวัตถุใดที่จะมองเห็นได้ ณ จุดใดมันจะถูกจุดอย่างไรสิ่งที่จะเป็นเอฟเฟกต์ของควันและอื่น ๆ GPUs ได้รับการปรับให้เหมาะสมที่สุดในการดำเนินการเหล่านี้อย่างรวดเร็วและขนาน API ทำให้ง่ายต่อการแสดงการดำเนินงานทั่วไป
IM

15

ทำงานกับ GPU สี 32 บิตใด ๆ (แม้กระทั่งเก่า)

บิตของประวัติศาสตร์ที่นี่: นี่เป็นวิธีที่เกมทำขึ้นบนพีซีจนกระทั่งตัวเร่งความเร็วกราฟิกเริ่มพร้อมใช้งานในช่วงกลางยุค 90 มันใช้งานได้จริงกับฮาร์ดแวร์ทั้งหมดเพราะฮาร์ดแวร์ไม่ค่อยทำอะไรเลย

ตัวเร่งความเร็วแบบกราฟิกช่วยให้การวาดภาพของพิกเซลเร็วกว่าซีพียูอย่างมากโดยใช้ฮาร์ดแวร์พิเศษและการขนาน ตัวเร่งประกอบด้วยจำนวนแกนประมวลผล พีซีตั้งโต๊ะจะมีแกนระหว่าง 1-8 คอร์ขึ้นอยู่กับอายุ การ์ดกราฟิก GTX970Ti ของฉันมีคอร์ 1664 (หนึ่งพันหกร้อยหกสิบสี่!) เห็นได้ชัดว่าการเต้นพีซีสำหรับความเร็วดิบโดยทางยาว

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


APU ของแล็ปท็อปของฉันมี 256 shader cores @ 686MHZ ในขณะที่แท็บเล็ตของฉันมี 192
Suici Doga

สวัสดี Titan X มี 5760 แกนในนั้น
Daniel

@Daniel มีเกมใดบ้างที่ Titan X ไป <30fps ที่สูงเป็นพิเศษ Titan X นั้นทรงพลังมาก
Suici Doga

Ummm หนึ่งในนั้นอาจจะ: maximumpc.com/10-most-graphically-demanding-pc-games
Daniel

@Daniel ผู้พัฒนาเกมเหล่านี้ต้องมีการ์ด Titan X 2-4 ใบ :)
Suici Doga

14

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

คณิตศาสตร์การวาดที่เกิดขึ้นนั้นเป็นแบบเดียวกับที่มันย้อนกลับไปในสมัย ​​Doom แต่ตอนนี้มันทำงานบน ALUs หลายร้อย / พันตัวแทนที่จะเป็นแกน CPU หนึ่งกำมือ APIs แผนที่จะเป็นชุดคำสั่ง GPU ชุดเดียวกันโดยทั่วไปอยู่เบื้องหลัง พวกมันอยู่ตรงนั้นเพื่อหยุดคุณไม่ต้องเขียนชุด GPU gnarly จำนวนมากบนแพลตฟอร์มของผู้จำหน่ายหลาย ๆ ราย

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