ฉันจำเป็นต้องใช้ API กราฟิกหรือไม่


22

จำเป็นหรือไม่ที่จะต้องใช้ API กราฟิกเพื่อเร่งความเร็วฮาร์ดแวร์ในเกม 3 มิติ? ระดับของการพึ่งพา API ของการ์ดกราฟิกเช่น OpenGL, DirectX , CUDA, OpenCLหรืออะไรอย่างอื่น

ฉันสามารถสร้าง API กราฟิกหรือไลบรารีของตัวเองสำหรับเกมของฉันได้หรือไม่? แม้ว่ามันจะยาก แต่ในทางทฤษฎีแล้วมันเป็นไปได้หรือไม่ที่แอพพลิเคชั่น 3D ของฉันจะติดต่อกับไดรเวอร์กราฟิกและแสดงทุกอย่างบน GPU อย่างอิสระหรือไม่?


30
CUDA และ OpenCL ไม่ใช่กราฟิก API
สบู่

4
หากต้องการ "ติดต่อไดรเวอร์กราฟฟิก" อย่างอิสระคุณต้องมี API เสมอ!
Josef

21
ไม่ว่าคุณไม่ต้องการ API สำหรับกราฟิกคุณสามารถเข้าถึงไดร์เวอร์ได้โดยตรง แต่ก็ไม่ได้หยุดอยู่แค่นั้นคุณสามารถเขียนไดร์เวอร์ของคุณเองเพื่อพูดคุยกับฮาร์ดแวร์โดยตรงหากคุณต้องการ แต่คำถามต่อไปของคุณมีความสำคัญมากกว่า: "ฉันควรใช้ API กราฟิกหรือไม่" ใช่คุณควรทำ
เควิน

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

3
ในตอนนี้ไม่มีการ์ดกราฟิก (หรือระบบปฏิบัติการ) ที่ไม่รองรับ OpenGL มันทำงานกับทุกสิ่งอย่างแท้จริงดังนั้นหากเหตุผลเดียวที่คุณไม่ต้องการใช้สำหรับ "ความเข้ากันได้" นั้นเป็นเรื่องที่ไม่มีมูลความจริงอย่างสมบูรณ์
Sandalfoot

คำตอบ:


39

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

Windows, Linux, OSX และอื่น ๆ ทั้งหมดห้ามการเข้าถึงฮาร์ดแวร์โดยตรงกับแอปพลิเคชันโดยพลการ นี่เป็นสิ่งสำคัญสำหรับเหตุผลด้านความปลอดภัย: คุณไม่ต้องการให้แอปสุ่มใด ๆ สามารถอ่านหน่วยความจำ GPU โดยพลการได้ด้วยเหตุผลเดียวกับที่คุณไม่ต้องการให้แอปสุ่มใด ๆ สามารถอ่านหน่วยความจำระบบได้ สิ่งต่าง ๆ เช่น framebuffer สำหรับบัญชีธนาคารของคุณหรืออะไรก็ตามที่ไม่ได้อยู่ในหน่วยความจำ GPU คุณต้องการให้สิ่งนั้นถูกแยกและได้รับการป้องกันและควบคุมการเข้าถึงโดยระบบปฏิบัติการของคุณ

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

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


รุ่งโรจน์นอกจากนี้ที่ดีในการอภิปราย คุณเรียนรู้สิ่งใหม่ทุกวัน.
วิศวกร

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

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

27

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

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

โปรดจำไว้ว่าการเรนเดอร์ CPU นั้นไม่มีประสิทธิภาพและมีประสิทธิภาพต่ำเมื่อเทียบกับ GPU


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

1
จุดดี @ChrisHayes ... แก้ไขเพื่อเพิ่ม บางครั้งสมมติว่าสิ่งต่าง ๆ นั้นชัดเจน
วิศวกร

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

5
@DavidZ คุณเขียนไดรเวอร์หรือไม่ คุณรู้หรือไม่ว่าการเชื่อมต่อกับฮาร์ดแวร์ที่ซับซ้อนเมื่อคุณไม่มีสเปคเมื่อแม้แต่วิศวกรที่ใช้งานโดยผู้ผลิตการ์ดใช้เวลาหลายเดือนในการพัฒนาไดรเวอร์ ตอนนี้คูณด้วยสถาปัตยกรรมที่คุณต้องสนับสนุน ถ้าฉันบอกว่า "มันเป็นไปไม่ได้ที่จะปีนขึ้นไปบน Everest โดยไม่มีอุปกรณ์" แน่นอนว่ามีโอกาสที่คุณจะทำได้ แต่จริงๆแล้วมันมีโอกาสน้อยมาก ... ทำไมทุกคนจะโต้แย้งประเด็น
วิศวกร

1
ถาม OP ว่าทำไมพวกเขาต้องการโต้แย้งประเด็น ;-) แต่โดยเฉพาะอย่างยิ่งหลังจากการแก้ไขมันค่อนข้างชัดเจนว่าเป็นสิ่งที่พวกเขาต้องการ
David Z

8

APIs เช่น OpenGL หรือ DirectX มีการใช้งานเป็นบางส่วนโดยระบบปฏิบัติการและมีการใช้งานบางส่วนโดยไดรเวอร์กราฟิกเอง

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


6

เริ่มระบบพีซีของคุณเป็น MS-DOS จากนั้นใช้สำเนาของPC Game Programmers EncyclopediaคุณสามารถเขียนลงในVESAของการ์ดโดยตรงและลงในหน่วยความจำวิดีโอ ฉันยังมีรหัสที่ฉันเขียนเมื่อ 20 ปีก่อนเพื่อทำสิ่งนี้และแสดง 3D พื้นฐานในซอฟต์แวร์

หรือคุณสามารถใช้ DirectX ได้ เป็นเลเยอร์นามธรรมที่บางมาก ๆ และยังให้คุณเขียนลงในบัฟเฟอร์วิดีโอโดยตรงแล้วสลับไปยังหน้าจอ

นอกจากนี้ยังมีวิธีการที่รุนแรงของการสร้างฮาร์ดแวร์วิดีโอของคุณเอง


4

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

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

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


4

โดยสรุป: ในทางทฤษฎีคุณสามารถทำได้ แต่มันเป็นไปไม่ได้และคุณจะไม่ได้รับประโยชน์ใด ๆ ข้อ จำกัด ของ API ในปัจจุบันมีน้อยลงทุกวันคุณมี CUDA และ OpenCL และ shaders ดังนั้นการควบคุมอย่างเต็มที่จึงไม่เป็นปัญหาอีกต่อไป


คำอธิบายแบบเต็ม:

ตอบนี้เป็นที่น่าเบื่อใช่ คำถามที่แท้จริงคือทำไม ?

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

ด้วย GPU คุณจะได้รับประสิทธิภาพที่ดีขึ้น แต่เสียอิสรภาพมากมาย นักพัฒนากราฟิกกำลังผลักดันเพื่อให้ได้อิสรภาพกลับคืนมา ดังนั้นปรับแต่งท่อทุกวัน คุณสามารถทำอะไรได้เกือบทุกอย่างด้วย CUDA / OpenCL และแม้จะเป็นเงาโดยไม่ต้องสัมผัสกับไดรเวอร์


1

คุณต้องการคุยกับฮาร์ดแวร์ คุณต้องใช้วิธีการพูดคุยกับฮาร์ดแวร์ วิธีนั้นคือส่วนต่อประสานกับฮาร์ดแวร์ นั่นคือสิ่งที่ OpenGL, DirectX, CUDA, OpenCL และสิ่งอื่นใด

หากคุณอยู่ในระดับที่ต่ำกว่าคุณกำลังใช้อินเทอร์เฟซระดับต่ำกว่า แต่คุณยังคงใช้อินเทอร์เฟซเฉพาะการ์ดที่ไม่ทำงานกับการ์ดที่แตกต่างกันมากเท่าการ์ดระดับที่สูงกว่า


1

เพื่อรับการเร่งความเร็วฮาร์ดแวร์ 3Dโดยไม่ต้องใช้ API แบบดั้งเดิมคุณจำเป็นต้องเขียนโค้ดของคุณเองเพื่อจำลองการทำงานของไดรเวอร์กราฟิก ดังนั้นวิธีที่ดีที่สุดในการเรียนรู้วิธีการทำเช่นนี้คือการดูรหัสของไดรเวอร์กราฟิก

สำหรับการ์ด NVIDIA คุณควรดูโครงการโอเพ่นซอร์สนูโว พวกเขามีคอลเลกชันของทรัพยากรที่ดีที่นี่

สำหรับกราฟิกการ์ดยี่ห้ออื่นคุณสามารถค้นหาโครงการและเอกสารประกอบที่คล้ายกันได้

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


1

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

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

Abstractions เช่น OpenGl หรือ DirectX อนุญาตให้ผู้ผลิตฮาร์ดแวร์ให้รหัสของตัวเอง (ไดรเวอร์) ที่นำไปสู่ฐานรหัสทั่วไปดังนั้นเกมมีแนวโน้มที่จะทำงานกับฮาร์ดแวร์ที่ไม่ได้มีอยู่เมื่อเขียนเกม


0

ก่อนอื่น CUDA และ OpenCL ไม่ใช่กราฟิก apis พวกเขาคำนวณ apis

ปัญหาเกี่ยวกับการเขียนกราฟิก API ของคุณเองนั้นซับซ้อนมาก คุณสามารถเชื่อมต่อกับฮาร์ดแวร์ได้โดยตรง แต่ไม่มีการรับประกันว่าถ้ามันทำงานบนระบบที่มี X CPU, X GPU, จำนวน ram และระบบปฏิบัติการ X มันจะทำงานบนระบบที่มี Y CPU, Y GPU และอื่น ๆ ข้อดีอย่างหนึ่งคือ DirectX นั้นทำงานกับไดร์เวอร์โหมดเคอร์เนล มันถูกรูทเข้าไปในเคอร์เนล นอกจากนี้กราฟิก apis ไม่ได้ถูกสร้างขึ้นเพื่อรองรับ GPU GPUs (และไดรเวอร์) สร้างขึ้นเพื่อรองรับ ดังนั้นคุณสวยมากไม่สามารถสร้างกราฟิก api ถ้าคุณสร้างระบบปฏิบัติการของคุณเองและใช้ x86 ให้ VGA ขัดจังหวะ แต่คุณยังคงไม่สามารถเชื่อมต่อกับ GPU ได้อย่างถูกต้องและคุณจะติดค้างที่ความละเอียดต่ำ

ฉันเข้าใจว่าคุณต้องการสร้างทุกอย่างด้วยตัวเองและไม่ใช้เครื่องมือหรืออะไรทำนองนั้น แต่การสร้างกราฟิก API ของคุณเองจะสร้างความไม่สะดวกให้กับผู้ใช้


0

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

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

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