DFPSR
David Forsgren Piuva가 만든 SSE/NEON을 사용하여 C ++ 14 용 최신 소프트웨어 렌더링 라이브러리. 최신 주류 유행을 찾고 있다면 다른 곳을보십시오. 이것은 수십 년에 걸쳐 개발 될 수있는 고품질 소프트웨어를위한 도서관이며, 최소한의 유지 보수로 손자에게서 살아 남았습니다. 당신의 유산을 돌에 조각하는 것과 마찬가지로, 기술을 습득하려면 더 많은 노력이 필요하지만 멀리 떨어진 도서관에 의존하지 않음으로써 더 강력한 결과를 얻습니다. 최대 사용자 경험 및 최소 시스템 의존성.
제작자의 배경
모바일 산업의 디지털 비디오 안정화 DXOMARK 세계 기록. 민간 공항 교통 관제를위한 안전 중요한 로봇 비전과 함께 일했습니다. 모바일, 의료 및 게임 산업의 다른 회사에서 최적화 강의를 개최했습니다. GPU, CPU, DSP, ISP, FPGA 및 ASIC에서 최적화로 작업했습니다.
최적화에는 시간을 절약 할 수있는 좋은 도구가 필요합니다
코드를 최적화하는 데있어 가장 중요한 부분은 과학자가 알고리즘을 설계하고 프로그래머가 필기 어셈블러 (가장 일반적인 실수)를 변경할 여지없이 최적화 할 수 없기 때문에 높은 알고리즘과 하드웨어 제한을 모두 파악하는 것입니다. 알고리즘 설계는 모든 최적화와 함께 품질과 성능 사이에 적절한 트레이드 오프를 할 때까지 수행되지 않습니다. 한 곳에서 품질 비용의 시간 절약은 속도와 품질을 모두 높이기 위해 다른 곳에서 더 낮은 비용으로 품질을 높이면 보상 할 수 있습니다. 알고리즘의 거의 최적의 최적 벡터화를 생성할수록 설계 프로세스를 더 빨리 반복 할 수 있습니다. 당신이 진정으로 근사하고있는 것에 대해 생각하십시오. 가능한 한 완벽하게 직선 다각형을 그리는 목표입니까, 아니면 모든 기술을 사용하여 복잡한 실제 형태를 근사하는 목표입니까?
공식 웹 사이트 : dawoodoz.com
아이소 메트릭 CPU 렌더링을 사용하는 게임의 모습

CPU에서 실행되는 800x600 픽셀에서 깊이 기반 캐스팅 그림자와 정상 매핑이있는 실시간 동적 조명. 더 높은 해상도는 레트로 스타일을 깨고 실제로 더 나빠 보이지만 게임 논리와 추가 효과에 많은 시간이 남아 있습니다. 3D 모델, 정상 및 높이 이미지를 확산시키기 위해 사전 렌더링함으로써 데이터를 읽는 것은 무료 관점을 사용하는 것보다 최신 CPU에서 훨씬 더 많은 캐시 효율적입니다. 또한 화면에 픽셀보다 삼각형이 더 많고 정적 형상의 수동 업데이트를 수행 할 수 있습니다. 저 하류 3D 모델은 동적 그림자를 시전하는 데 사용됩니다.
다각형이있는 전통적인 3D 렌더링도 지원됩니다

3D 렌더링은 CPU에서 2D 또는 아이소 메트릭 렌더링만큼 빠르지 않지만, 저하 그래픽의 경우 1920x1080 픽셀에서 종종 60Hz에 도달합니다. 더 세부적인 수준과 더 많은 기능을 위해, 렌더링 파이프 라인을 복사하고 수정하여 원하는 기능에 대해서만 하드 코딩 한 다음 특정 렌더링 엔진의 수학을 단순화하는 것이 좋습니다. 샌드 박스 예제에 대해서는 원근법없이 작은 삼각형에 대해 vertex 색상 만 필요합니다.
GPU가 너무 빠른 경우 오픈 소스 소프트웨어 렌더러를 사용하는 이유는 무엇입니까?
- 소프트웨어 렌더러를 사용하는 견고성은 블루 스크린이 발생하기 쉬운 GPU의 그래픽 API와 달리 실수를 할 때 시스템을 망치지 않을 것입니다.
- 결정론 한 컴퓨터에서 작동하면 운영 체제간에 약간의 차이가있는 다른 컴퓨터에서 동일하게 작동 할 것입니다. 그러나 OpenGL에는 드라이버 구현에 버그가있는 모든 것을 제거하면 남은 기능이 없습니다.
- 오버 헤드가 낮은 시각적 스타일이나 로봇 비전에 대한 저해상도를 원할 때는 GPU가 느리면 정적으로 연결된 소프트웨어 렌더러로 최소화 할 수도 있습니다.
- 쉬운 디버깅 모든 데이터가 소프트웨어 렌더러에서 처리되면 디버깅 중에 무엇이 잘못되었는지 확인하는 것이 훨씬 쉽습니다.
- 쉽게 수정하기 쉽습니다. CPU주기 및 메모리 외에는 하드웨어 제한이 없으므로 코드를 복사하고 붙여 넣어 전체 렌더링 파이프 라인을 수정할 수 있습니다.
- Pixel Exact 2D 다각형을 통해 이상한 해결 방법을 만드는 대신 소프트웨어 렌더러를 사용하면 전체 픽셀로 작업 할 수 있습니다.
이 소프트웨어 렌더러를 사용하는 이유는 무엇입니까?
- 최소 시스템 종속성 특정 시스템 API와 관련된 모든 것은 미래의 운영 체제에 쉽게 통합 해야하는 최소한의 필수 기능을 통합하는 별도의 래퍼 모듈에 배치됩니다. 다른 소프트웨어 렌더러와 달리, 이것은 대부분의 코어가 유휴 상태 일 때 배경 스레드에서 캔버스를 업로드하여 멀티 스레딩을 사용하여 동일한 성능을 얻을 수 있기 때문에 그래픽 드라이버가 필요하지 않습니다.
- 바이너리 없음 전체 라이브러리가 소스 코드에서 자동으로 컴파일되지 않습니다. 빌드 시스템조차 프로젝트를 구축하기 전에 자체적으로 컴파일하고 있습니다. 이것은 미래의 어느 누구도 프로그램을 구축하려고 할 때 세기의 오래된 바이너리를 역 엔지니어링하지 않아야하며, 모든 것이 읽을 수있는 코드로 검사 할 수있을 때 맬웨어에 대해 훨씬 더 안전하게 만듭니다.
- 정적 링크 전체 라이브러리는 코드를 직접 작성한 것처럼 프로그램과 정적으로 연결됩니다. 수십 년 동안 살아남은 핵심 시스템 API만이 의존성, GPU 드라이버, 외부 미디어 레이어로 의존적으로 의존합니다. 유니 코드 문자를 인코딩하고 글꼴을 렌더링하는 방법부터 다각형 버퍼에 대해 다각형 버퍼에 대한 레이스팅 방식에 이르기까지 모든 C ++ 프로그램 내에 최대의 신뢰성과 결정론을 위해 존재합니다. 빌드 시스템을 통해 가능한 경우 C ++ 표준 라이브러리를 정적으로 연결할 수 있습니다.
- 유산을 만들면 미래 세대가 독점 그래픽 드라이버의 에뮬레이터 나 리버스 엔지니어링없이 미래 세대가 포트, 컴파일 및 실행할 수있는 소프트웨어를 만들 수 있습니다.
이 라이브러리의 기능
- 완전 자동 C ++ 빌드 시스템 프로젝트에서 더 이상 소스 파일 목록이 없습니다. 포함 된 빌드 시스템은 포함 된 헤더와 해당 소스 파일을 자동으로 포함합니다. 메인에서 기어 다니라고 말하고 나머지를 자동으로 파악하게하십시오. 라이브러리의 프로젝트 헤더를 포함하여 라이브러리의 다른 백엔드는 각 플랫폼에 사용할 백엔드를 알려줍니다. 체크섬은 변경된 항목 만 빌드하는 데 사용되므로 코드의 일부에 대한 정적 라이브러리를 만들 필요가 없습니다.
- 2D 드로잉 픽셀 정확한 표준 드로우는 라인, 사각형, 단단한 이미지 사본, 알파 필터링 이미지 드로잉, 깊이 버퍼 드로잉 및 스텐실 드로잉을 호출합니다.
- 3D 렌더링은 박스에서 사용될 때 이중 선형 텍스처 샘플링, 미트 맵핑, 라이트 맵 및 알파 필터링을 사용하여 Direct3d 7과 거의 동등하지만 텍스처에 음영을 적용하는 경우 Direct 3D 9와 비슷하도록 수정할 수 있습니다 (멀티 스레딩과 함께 SIMD를 사용하고 거리를 기준으로 예약 할 수 있습니다).
- 폐색 시스템 멀티 스레딩을위한 렌더링 작업의 수집에는 엔진이 컬링 및 폐색 테스트를 위해 넓은 상을 구현하는 경우 삼각형, 물체 또는 전체 그룹의 그림을 건너 뛰기 위해 폐색 모양을 그릴 수있는 폐색 그리드도 포함되어 있습니다. 이 완전 동적 폐색은 각 카메라 위치에서 어떤 영역을 볼 수 있는지에 대한 정보를 사용하여 특정 게임에 대한 정적 최적화와 결합 할 수 있습니다.
- 옵션 원거리 클리핑 이 그래픽 API는 원근법을 위해 부동 소수점 깊이 버퍼 만 사용하기 때문에 정수 기반 표현의 깊이 값을 정상화 할 필요가 없습니다. 이렇게하면 전체 장면을 한 번에 렌더링 할 수 있다면 카메라를 만들 때 무한한 클립 거리를 선택할 수 있습니다.
- 미디어 계층 크로스 플랫폼 미디어 계층은 견고성을 위해 설계되었습니다. ALSA 및 WINMM 사운드는 사운드 믹싱을 완전히 제어 할 수 있도록 사운드 백 렌트를 제공합니다. Window Management는 캔버스를 업로드하기 위해 멀티 스레딩을 사용하므로 결과를 업로드하기 위해 GPU 그래픽 드라이버 및 무거운 종속성이 필요하지 않습니다. 전체 화면에는 테두리가없는 창을 사용하므로 백그라운드에서 중요한 이메일 또는 인스턴트 메시지를 받으면 다른 프로그램에 쉽게 액세스 할 수 있습니다. CPU에서 업 스케일링은 픽셀에 잘못된 보간을 제공하거나 존재하지 않을 수있는 그래픽 드라이버에 의존하지 않고 화면 해상도로 작동하도록 수행됩니다. CTR 디스플레이 용으로 설계된 구형 미디어 레이어는 그래픽 드라이버가 설치되지 않았고 디스플레이는 임의의 해상도 선택을 허용하지 않을 때 범위 오류가 발생하지 않을 수 있습니다. 보이지 않는 커서 아이콘을 사용하여 마우스를 숨기므로 충돌 프로그램이 프로세스를 죽일 때 커서를 제거하지 않도록합니다.
- 그래픽 사용자 인터페이스 프레임 워크 레이아웃 파일 또는 문자열을 읽는 한 줄의 코드 라인을 사용하여 창에 시각적 인터페이스를로드합니다. 이름이나 이름과 색인의 조합을 사용하여 구성 요소에 일반 핸들을 가져옵니다. Lambda 기능을 구성 요소 및 창 콜백에 연결하여 이벤트를 추가하십시오.
- 타이머는 첫 번째 호출 타이머 호출 이후 이중 정밀 초가 통과되므로 시간이 재설정 될 때 자정 버그에 대해 걱정할 필요가 없습니다.
- SIMD 추상화 계층 SIMD.H를 사용하여 완전히 읽을 수있는 수학 구문으로부터 고효율 SSE, AVX 및 NEON Intrinsics를 자동으로 생성합니다. 벡터화 된 코드는 알려지지 않은 대상 아키텍처를위한 참조 구현 및 컴파일처럼 보일 것입니다. CPU 하드웨어에서 가장 자주 지원되는 기본 작업으로 알고리즘을 작성하여 캐시 라인과 함께 메모리에 액세스하고, 작업과 함께 사용하는 메모리에 액세스하고 미래의 다른 이름과 매우 쉽게 만들 수있는 메모리에 액세스 할 수 있습니다.
- Safe Pointers는 SafePointer.h를 사용하여 POININT의 어떤 할당의 일부가 작동 할 수 있는지 알려줍니다. 릴리스 버전에 오버 헤드를 남기지 않으므로 항상 원시 포인터를 SafePointer로 바꾸고 포인터 이름과 나쁜 일이 발생할 때 유익한 오류 메시지를받을 수 있다는 것을 알 수 있습니다.
- 문자열은 UTF-32를 사용하여 메모리에 문자를 저장하여 모든 알고리즘이 라틴어가 아닌 문자 (U와 호환)와 함께 작동하는지 확인하십시오. BOM (어떤 형식이 사용되는지 명시 적으로 말하면)와 CR LF 라인 엔딩 (어디에서나 인코딩 된 텍스트 파일을 어디서나 읽을 수 있음)를 사용하여 UTF-8 (Compact Storage)에 기본적으로 파일을 저장합니다. 공유 메모리 버퍼를 자동으로 사용하여 작은 할당으로 힙에 범람하지 않고 문자열 목록으로 분할 할 수 있습니다.
- 버퍼 버퍼 모든 파일은 버퍼 객체를 통해 저장 및로드됩니다. 이를 통해 디자인이 디자인하는 모든 파일 형식은 바이트를 인코딩하는 방법에 대해서만 걱정해야하며 파일 시스템의 외부 부작용을 포함하지 않으면 회귀 테스트가 쉬우 며 모든 파일은 저장 기능과 동등한 버퍼를 사용하여 자체적으로 번들로 번들로 연결할 수 있습니다.
- 파일 관리는 C ++ 17의 STD :: 파일 시스템과 거의 동일하지만 C ++ 14에서 작동하며 모든 플랫폼에서 동일한 문자열 및 읽기 방송 유형을 사용하며 / (POSIX)와 (MS-WINDOWS) 간의 폴더 분리기를 자동으로 수정할 수 있습니다.
- 프로세스 관리는 다른 응용 프로그램을 시작하고 해당 상태를 추적하여 결과를 파일에 작성하는 기능과 같은 응용 프로그램을 호출 할 수 있습니다.
라이센스 요약
이 라이브러리는 주로 Zlib 오픈 소스 라이센스를 사용하지만 허용 듀얼 라이센스 (MIT / 미록)가있는 이미지를 저장 및로드하기위한 STB 이미지 라이브러리도 포함합니다. STB 이미지 라이브러리는 공개 도메인으로 사용할 수 있으므로 Zlib 오픈 소스 라이센스에 따라 라이브러리 전체를 사용하는 데 법적 영향을 미치지 않습니다. 모든 라이센스가 포함 된 모든 소스 코드는 소스 코드의 공개되지 않은 수정을 포함하여 상업 및 비상업적 사용을 모두 허용합니다. 소스 코드를 재분배하지 않으면 성실한 보증은 가치가 없기 때문에이 라이브러리를 사용한다고 말할 필요가 없습니다.
여전히 공개 베타입니다
테마, GUI, FONT 및 SOUND API는 여전히 활발한 개발 중이며 안정적인 버전 1.0이 준비되기 전에 상당한 변화가있을 수 있습니다. 일부 코드는 고급 구현이 대체 될 때까지 원시 자리 표시 자일 뿐이므로 실제로 유용성 문제가 분명해지기 전에 라이브러리를 사용해야합니다. 버퍼, 파일, 이미지, 드로우, 필터, 문자열 및 시간 API는 이미 버전이 안정적입니다. 각 새 프로젝트에 대한 특정 버전을 사용하거나 최신 변경 사항으로 업데이트하거나 안정적인 버전 1.0을 기다리십시오.
당신이 도울 수있는 방법
- 최소 의존성의 동일한 원리를 사용하여 Macintosh 또는 Wayland로 포트.
- 이 베타 버전을 테스트하고 버전 1.0이 출시되기 전에 디자인에 대한 피드백을 제공하십시오.
- 오픈 소스 도구로 다양한 유형의 게임 엔진을 만듭니다.
지원되는 CPU 하드웨어 :
- SSE2 내입 및 선택적 확장을 사용하는 Intel/AMD .
- Neon Intrinsics를 사용하는 팔 .
- 폴백 솔루션으로서 SIMD 벡터화가없는 알려지지 않은 CPU 아키텍처.
플랫폼 :
- Linux , Mint, Mate, Manjaro, Ubuntu, Raspberrypi OS, Raspbian (버스터 또는 이후)에서 테스트. Linux Mint는 컴파일하기 전에 컴파일러 및 X11 헤더가 필요하므로 컴파일하기 전에 "Sudo apt install g ++"및 "sudo apt install libx11-dev"를 실행하십시오. 현재 X11을 지원하고 Wayland는 향후 버전을 위해 계획되어 있습니다.
- Windows에는 많은 백그라운드 프로세스가 있고 스레딩 및 메모리 관리가 느리기 때문에 Microsoft Windows이지만 Linux보다 느립니다.
또한 작동 할 수도 있습니다.
- BSD와 Solaris에는 응용 프로그램 폴더를 얻기 위해 FileApi.cpp의 플랫폼을 타겟팅하는 코드가 있지만 빌드 스크립트를 실행하기위한 일부 응용 프로그램이있을 수 있습니다. 향후 POSIX 호환 시스템에는 X11 서버가있는 경우 정렬 할 수있는 몇 가지만 있어야합니다.
- Big-Endian은 DSR_BIG_ENDIAN MACRO를 전 세계적으로 활성화하는 경우 이론적으로 지원되지만, 현대적인 컴파일러를 사용하여 이전 시스템을 타겟팅하는 데 어려움이 있기 때문에 실제로 테스트되지 않았습니다.
아직 포팅되지 않았습니다.
- Macintosh는 더 이상 X11을 사용하지 않으므로 약간의 포팅 노력이 필요합니다. Macintosh는 러닝 프로세스의 바이너리에 대한 상징적 링크가 없으므로 응용 프로그램 폴더를 요청할 때 현재 디렉토리로 돌아갑니다.
타겟팅하지 않습니다 :
- 휴대 전화. 모바일 플랫폼에서 뒤로 호환되는 끊임없는 변화는 장기간 프레임 워크를 사용하는 목적을 물리 칠 수 있기 때문입니다. 모바일 플랫폼에는 맞춤형 C ++ 컴파일러, 신호 프로세서에 대한 액세스, 화면 회전, 배터리 저장, 가상 키보드, 보안 권한, 강제 풀 스크린을 표시 할시기를 알고 있어야합니다. 동시에 두 가지 작업을 동시에 시도하면 Microsoft Windows 8 또는 Ubuntu의 Unity Lock Screen과 같은 양쪽 끝에서 디자인 타협으로 끝날 수 있으므로 다른 디자인에 구축 된 새로운 라이브러리와 작품을 사용하는 것이 좋습니다.
- 웹 프론트 엔드. 이 라이브러리의 이러한 래퍼는 자신의 이미지 필터를 정의하기 위해 Simd Intrinsics의 힘을 얻을 수 없으므로 동적 스크립팅에 더 적합한 브라우저에서 GPU 음영 언어를 타겟팅하는 것이 좋습니다.