게임에서 픽셀을 직접 그릴 수있는 OpenGL 및 DirectX와 같은 그래픽 프레임 워크가있는 이유는 무엇입니까?


16

게임 및 그래픽을 많이 사용하는 다른 응용 프로그램은 OpenGL 및 DirectX와 같은 프레임 워크를 사용합니다. 또한 픽셀 쉐이더 및 DX12와 같은 기능이 필요합니다.

그러나 모든 것을 한 픽셀 씩 그릴 수있을 때 왜 이러한 프레임 워크와 GPU 기능이 필요한가?

먼저, 게임은 픽셀 단위로 그려 지도록 컴파일되어야합니다. 이것은 게임 실행 파일을 크게 만들 가능성이 높지만 32 비트 컬러 GPU (이전의 것)에서도 더 빠르며 작동합니까?

첫 번째 3D 게임이 픽셀 단위로 그려 졌음을 알지만 지금 왜 그렇게하지 않습니까?


일반적으로 많은 작업에 대해 한 번의 작업을 수행하는 것이 모든 작업을 개별적으로 수행하는 것보다 더 효율적이고 생각하기 쉽습니다.
user541686

2
모든 그래픽 카드마다 모든 게임을 다시 작성해야하기 때문입니다. 그들이 그래픽 카드를 사용하지 않으면 느리게 진행됩니다.
user253751

그 GPU 회사가 자신의 다이렉트 X 드라이버를 만들 수 있다고 생각
Suici 도가

1
"하지만 픽셀 단위로 모든 것을 그릴 수있을 때 왜 이러한 모든 프레임 워크와 GPU 기능이 필요한가?" 그건 이 좋은 똑똑한 '일에서 수행 된 방법. Wolfenstein 3D, Doom, Duke Nukem 3D, Quake 및 90 년대 후반의 대부분의 다른 게임은 순수한 소프트웨어 렌더링을 사용했습니다 (Quake는 OpenGL 렌더러를 옵션으로 제공했습니다).
el.pescado

1
@MatthewRock 당신은 도움이되지 않습니다. 도커 컨테이너 안에 OS를 게임과 함께 번들로 묶어 배포 할 수 있습니다. 이렇게하면 사용자는 배포판을 위해 라이브러리 종속성을 설치할 필요가 없습니다.
Navin

답변:


23

이것이 수행 되지 않는 가장 일반적인 이유는 속도입니다 . 실제로 자신의 운영 체제를 만들면 아키텍처상의 이유로 인해 속도가 매우 느려집니다. 따라서 더 빠르다는 가정은 약간의 결함이 있습니다. 속도가 더 빠르더라도 개발 측면에서는 효율성이 떨어집니다 (예 : 작업의 10 배 동안 1 % 속도 증가).

CPU에서 그래픽 카드로 데이터를 복사하는 작업은 비교적 느립니다. 복사 속도가 낮을수록 업데이트 속도가 빨라질 수 있습니다. 따라서 이상적으로는 GPU에 대부분의 데이터가 있고 작은 데이터 덩어리 만 업데이트합니다. 1920x1200 이상에 비해 320x200 픽셀 이상의 복사에는 차이가 있습니다. 측면이 커질 때 업데이트해야하는 픽셀 수가 2 차적으로 증가하는 것을 확인하십시오.

예 : 다른 위치의 비디오 메모리에 수동으로 픽셀을 복사하는 것보다 이미지를 10 픽셀 오른쪽으로 이동하도록 GPU에 지시하는 것이 더 저렴합니다.

왜 API를 통해 이동해야합니까? 단순히 시스템이 아니기 때문입니다. 운영 체제에서는 안전상의 이유로 원하는 작업을 수행 할 수 없습니다. 둘째, 운영 체제는 하드웨어를 추상화해야하기 때문에 OS조차도 추상화 된 시스템 인 API를 통해 드라이버와 통신합니다.

실제로 모든 작업을 직접 수행 한 경우 거의 0에 가까운 시스템이 더 빠를 가능성을 평가합니다. C와 어셈블리를 비교하는 것과 같습니다. 물론 어셈블리를 작성할 수는 있지만 요즘 컴파일러는 꽤 똑똑하고 항상 더 잘 최적화됩니다. 생산성이 저하 될 수 있어도 수동으로 개선하기는 어렵습니다.

추신 : API는 오래된 게임처럼이 업데이트를 수행하는 것을 불가능하게하지 않습니다. 그게 전부 비효율적입니다. API가 아니라 비효율적 인 기간이기 때문입니다.

PPS : 이것이 Vulkan을 출시하는 이유입니다.


6
See the number of pixels you need to update grows exponetially when the sides grow.2 차적으로 생각합니다.
크 툴후

"CPU에서 그래픽 카드로 데이터를 복사하는 작업은 비교적 느립니다." 이것은 사실이지만 관련이 없습니다. 60fps에서 수백만 픽셀 이상을 복사하는 것은 심지어 적당한 PCI-E 링크에서도 쉽게 달성 할 수 있습니다 (초당 수백 메가 바이트 만 필요)
Coxy

2
@ pjc50 그건 잘못된 것이 아니라 사실도 아닙니다. GPU는 많은 양의 데이터에서 단일 프로그램 (보통 셰이더)을 병렬로 실행하는 데 특화되어 있습니다. 따라서 GPU의 컴퓨팅 성능을 실제로 사용하려면 많은 데이터에 대해 동일한 작업을 수행해야합니다. 프로그램이 그렇지 않으면 CPU에서 프로그램을 실행하는 것이 좋습니다.
Nero

2
엑스22엑스

1
복사 및 이동에 대해 이야기하지만 더 중요한 것은 실제 이미지 생성입니다. 어느 시점에 어떤 물체가 보일지, 어떻게 점등되는지, 연기의 영향 등을 결정해야합니다. GPU는 이러한 작업을 빠르고 병렬로 수행하도록 고도로 최적화되어 있습니다. API를 사용하면 일반적인 작업을 쉽게 표현할 수 있습니다.
IMil

15

32 비트 컬러 GPU (오래된 것)에서도 작동합니까?

역사의 비트 : 90 년대 중반 그래픽 가속기가 출시 될 때까지 PC에서 게임을 수행 한 방식입니다. 하드웨어가 많이하지 않았기 때문에 실제로 모든 하드웨어에서 작동했습니다.

그래픽 가속기는 특수 하드웨어 및 병렬 처리를 사용하여 CPU보다 훨씬 빠르게 픽셀을 그릴 수 있습니다. 가속기는 많은 프로세서 코어를 포함합니다. 데스크탑 PC는 연령에 따라 1-8 개의 코어를 갖습니다. 내 GTX970Ti 그래픽 카드에는 1664 개의 코어가 있습니다. 이것은 분명히 원초 속도로 PC를 능가합니다.

그러나 가속기는 표준화되지 않았으며 종종 속도를 달성하기 위해 이상한 컴퓨터 아키텍처 트릭을 포함합니다. 카드의 특정 제조업체 및 모델에 맞게 사용자 지정되지 않은 게임을 작성하려면 API가 있어야합니다. 이것이 바로 DirectX, GL 및 셰이더 언어가 사용하는 것입니다. 사실, 쉐이더를 작성하는 것입니다 직접 픽셀을 그리는 프로그램을 작성에 가장 가까운 것은 -이 카드를 병렬로 당신을 위해 픽셀 당 하나를이 프로그램의 천 개 사본을 실행 단지입니다.


내 노트북의 APU에는 686MHZ에서 256 개의 셰이더 코어가 있고 태블릿에는 192 개의
카드

Titan X에는 5760 개의 코어가 있습니다.
Daniel

@Daniel Titan X가 초고속에서 30fps 미만으로 진행되는 게임이 있습니까? Titan X는 매우 강력합니다
Suici Doga

Ummm, 다음 중 하나 일 것입니다 : maximumpc.com/10-most-graphically-demanding-pc-games
Daniel

@Daniel 그 게임의 개발자는 약 2-4 Titan X 카드가 필요합니다 :)
Suici Doga

14

그냥에 추가 joojaa의 대답 , 상황이 되어 여전히 픽셀로 픽셀을 그리는. 버텍스 쉐이더 / 어셈블러 / 래스터 라이저를 사용하여 픽셀을 생성 한 다음 프래그먼트 쉐이더를 사용하여 텍스처링하고 조명합니다. 이것은 비디오 카드가 블 리터와 프레임 버퍼 이상이 아니었던 90 년대의 소프트웨어에서 모두 이루어졌지만 지옥만큼 느 렸습니다. 따라서 현대 GPU의 발명.

발생하는 드로잉 수학은 기본적으로 Doom 시절과 같지만 이제는 소수의 CPU 코어가 아니라 수백 / 수천 개의 쉐이더 ALU에서 실행됩니다. API는 기본적으로 장면 뒤에서 동일한 GPU 명령 세트에 매핑됩니다. 여러 공급 업체 플랫폼에서 엄청나게 많은 GPU 어셈블리를 작성하지 않아도됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.