2012-04-29 2 views
-3

프로그래밍을 처음 사용합니다. C/C++과 Win32의 기초를 알고 있습니다. 나는 지금 그래픽을하려하지만 화면에 가장 빠른 연결을 원한다. 대부분 OpenGL이나 DirectX를 사용하고 있습니다. 하지만 오버 헤드가 필요하지 않습니다. 처음부터 시작하여 픽셀 데이터를 제어하려고합니다. GDI 비트 맵에 대해 알고 있지만 이것이 데이터에 가장 잘 액세스 할 수 있는지 확실하지 않습니다. 나는 창문을 통해 이야기해야한다는 것을 압니다. 그것은 문제입니다. OpenGL과 DirectX는 GDI 레벨까지 컴파일합니까, 아니면 특별한 방법으로 바이 패스하거나 비슷한 코드를 사용합니까? 제발, 왜 내가이 일을하고 싶은지 묻지 마세요. 어쩌면 이것이 어떻게 이루어 졌는지에 대한 설명이 도움이 될 것입니다. 창문이 모든 창을 결합하여 최종 이미지를 만드는 방법처럼.Windows 저급 그래픽

+10

좋습니다. "컴퓨터 나 OS가 어떻게 작동하는지 전혀 모르지만 문제를 해결하고 싶지 않은 모든 방법을 이미 결정 했으므로 왜 모든 효율적인 접근 방식을 배제했는지 묻지 마십시오. " 문제. 그게 최고입니다 – jalf

+0

당신은 nvidia GPU를 위해 nvapi를 사용할 수 있습니다 ... 문서를 참조하십시오. https://developer.nvidia.com/nvapi –

답변

6

픽셀 데이터에 대한 가장 직접적인 액세스는 OpenGL과 Direct3D에서 모두 지원되는 쉐이더입니다. 그들은 크로스 컴파일되어 비디오 카드에서 직접 실행됩니다. OpenGL을 사용하지 않으며 OpenGL 오버 헤드가 없습니다. OpenGL은 처음에는 그래픽 카드의 자체 프로세서에 연결하기 위해 사용됩니다.

CPU에서 수행하는 작업은 모두 버스 (일반적으로 PCI-express)를 통해 비디오 카드에 복사해야합니다. 실제로 GDI는 그래픽 메모리에서 많은 레벨을 제거합니다.

OpenGL, Direct3D, Direct2D, GDI 및 GDI +는 모두 추상화 계층입니다. GPU 공급 업체는 이러한 표준 명령 기능을 사용하는 드라이버를 작성하고 데이터를 카드 별 형식으로 다시 인코딩 한 다음 카드로 보냅니다. 일반적으로 OpenGL과 Direct3D가 가장 많이 최적화되어 있으며 최소한의 재 인코딩이 필요합니다.

Windows에서 다양한 화면 창을 결합하여 전체 화면 이미지를 만드는 방법은 Windows 버전에 따라 크게 달라집니다. DWM 변경된 모든. Vista에서 DWM이 도입 된 이후 프로그램이 GPU 메모리의 개인 영역으로 렌더링되면 윈도우 관리자는 비디오 카드의 텍스처 조회 단위를 사용하여 각 프로그램의 개별 영역을 화면 기본 버퍼에 효율적으로 겹쳐서 표시합니다. 프로그램 (일반적으로 게임)이 전체 화면 배타적 액세스를 요청하면이 단계는 건너 뛰고 드라이버는 해당 응용 프로그램의 렌더링 명령을 기본 화면 버퍼에 직접 적용합니다.

CPU가 표시해야하는 데이터를 생성한다고 가정하면 가장 빠르고 효율적인 접근 방법은 해당 데이터를 정점 버퍼 객체로 블록 복사하고 OpenGL 명령을 사용하여 선 또는 다각형으로 래스터 화하거나 뭐든 (또는 Direct3D에 상응하는). 이전에 GDI가 저수준 인터페이스라고 생각했다면이 작업을하기 위해 미리 읽기가 필요합니다. 그러나 순수 GDI보다 몇 배 빠른 속도로 작동합니다. GDI (및 WPF)가 Direct2D 및/또는 Direct3D를 기반으로 구축된다는 사실은 훨씬 빨라졌습니다.

+0

고맙습니다. 대단한 답변이었습니다. 나는 한 가지 더 질문이있다. 내 생각의 라인이 맞는지는 모르겠지만, GPU가 그러한 유형의 조작을 처리하기 위해 추가 된 것이라고 생각했습니다. 그리고 마더 보드의 다른 비디오 카드 부분이 화면에 연결되었습니다. 내 노트북처럼 엔비디아 카드가 있습니다. 그리고 CPU -> GPU -> 통합 비디오 카드 -> Screen으로 생각하고 GPU를 우회하여 추가 기능을 만들 수 있습니다. 내가 원하는 것은 아니다. 나는 또한 CUDA에 커밋 할 생각을하고 있습니다. 병렬 처리. 모든 것이 nvidia를 통과하고 화면을 직접 제어합니까? – user1364455

+0

@ user1364455 : GPU는 비디오 카드의 일부입니다. 하이브리드 시스템을 사용하면 필자가 작성한 것만 큼 좋은 것은 아닙니다. 그리기가 GPU에서 수행 된 다음 프레임 버퍼가 통합 그래픽으로 복사되어 화면으로 스트리밍됩니다. 그래픽이 매우 단순하지 않은 한 통합 그래픽을 사용하는 것보다 빠르며 CPU를 사용하여 이미지를 생성하는 것보다 훨씬 전력 효율적입니다. 어쨌든, 엔비디아 칩은 무시할 수 있습니다. 필자가 쓴 모든 것은 인텔 통합 그래픽에도 적용됩니다. 최신 인텔 칩 (샌디 브리지와 같은)도 통합 그래픽의 쉐이더를 지원합니다. –

+0

@ user1364455 : 요즘 컴퓨터에는 화면에 데이터를 제공하는 그래픽 메모리에 직접 연결된 프로세서에서 실행되는 코드가 있으며 프로세서는 CPU가 아닙니다. –

1

는하지만 난 당신이 불가능한 요구하고있는 픽셀 데이터

을 처음부터 다시 시작하고 제어 할 화면

가장 빠른 연결을합니다. GPU 가속 기능을 사용하면 최상의 성능을 얻을 수 있습니다. 그러나이 경우 픽셀 데이터에 직접 액세스 할 수 없으므로 시스템 메모리에서 비디오 메모리로 데이터를 전송해야하기 때문에 픽셀 데이터에 직접 액세스하지 않고 액세스하거나 다시 읽거나 쓰면 성능에 부정적인 영향을 미칩니다. 결과적으로 시스템 메모리에서 비디오 메모리로 스트리밍되는 모든 내용은주의해서 처리해야합니다. 게다가 API를 공부해야합니다.

"처음부터 시작"하고 CPU에서 렌더링을 수행하면 픽셀 데이터에 쉽게 액세스하고 렌더링을 완벽하게 제어 할 수 있지만 성능은 GPU보다 떨어집니다 (CPU는 병렬 처리에 적합하지 않으며 시스템 메모리는 비디오 메모리보다 크기가 더 느려질 수 있습니다), 휠을 다시 만드는 데 많은 시간을 할애해야합니다.

OpenGL과 DirectX는 GDI 수준까지 컴파일합니까, 아니면 특별한 방법으로 컴파일합니까? 아니면 우회하거나 비슷한 코드를 사용합니까?

아니요. 하드웨어 제조업체가 제공하는 드라이버를 거의 직접 사용하여 그래픽 하드웨어와 거의 직접 통신합니다. DirectX/OpenGL에서 사용되는 "직접 하드웨어 액세스"인터페이스는 하드웨어별로 다르고 제조업체마다 다르며 내부적이거나 특허로 보호 될 수도 있습니다.

VESA 또는 VGA 13h 모드와 같이 사용할 수있는 레거시 하드웨어 인터페이스는 거의 없지만 일반적으로 운영 체제에서는이를 직접 사용할 수 없습니다 (Windows에서 VESA에 쉽게 액세스 할 수 없음) 따라서 MS-DOS를 부팅하거나, 사용자 지정 운영 체제를 사용하거나, 루트 권한으로 만 작동 할 수있는 도우미 클래스 (예 : Linux의 경우 SVGAlib)를 액세스해야합니다. 물론 실제로 VESA/VGA를 사용하여 직접 하드웨어를 렌더링하더라도 RivaTNT 2 Pro보다 새로운 하드웨어에서는 OpenGL/DirectX로 하드웨어 가속 렌더링에 비해 성능이 크게 떨어집니다. 적절한 GPU 드라이버가 없을 때 Windows XP가 얼마나 빨리 작동하는지 보았습니까 (창을 다시 그리려면 초 걸립니다)? 바로 VESA/VGA 직접 액세스로 작동하는 속도입니다.

제발, 왜 내가 이것을하고 싶은지 묻지 마십시오.

왜 그렇게하고 싶은지 물어 보는 것이 좋습니다. 귀하의 "직접적인 저수준 접근을 원합니다"접근 방식은 어쩌면 15..20 년 전이나 도스 시대에 적합했습니다. 지금 당장 합리적인 해결책은 기존 API (사용자가 아닌 사람이 유지 관리하는 API)를 사용하여 완전히 활용하는 방법을 찾는 것입니다. 물론, 당신이 드라이버를 개발하고 싶다면 그것은 또 다른 이야기 일 것입니다.

0

가 할 OpenGL을 DirectX는 GDI의 수준까지 컴파일하거나 그것을 할 특별한 방법

나는 대부분의 OpenGL을 또는 다이렉트로가는 실현이있다. 그러나 나는 오버 헤드를 원하지 않습니다.

그래서 ** OpenGL이나 DirectX가 실제로하는 일에 대해서는 단서가 없습니다. 그러나 당신은 그들이 당신을 위해 충분히 효율적이지 않다고 결정했습니다. 필요합니다.

죄송하지만 이것은 말도 안됩니다. 그런 질문에 대답하는 것은 불가능합니다.

현실 세계에서 그래픽을 할 수있는 작은 슈퍼 컴퓨터가 있습니다. OpenGL 및 DirectX를 통해 액세스 할 수 있습니다.

빠른 이유는 이 아니며은 "처음부터 시작하여 픽셀 데이터를 제어합니다"라는 것입니다.

심각한 답변을 원한다면 지식이있는 사람들이 귀하의 질문에 대답하도록하여 가장 적합한 질문을 선택하십시오.

정답은 DirectX 또는 OpenGL을 사용하는 것입니다.

관련 문제