2009-09-22 2 views
4

좋아, 그래서 나는 프로와 다양한 다양한 질감 압축 기술을 사용하여 죄수의 무게를하려고 노력하고있어. DirectX를 사용하는 Windows 컴퓨터에서 2D 스프라이트 게임을 코딩 할 때 내 시간의 99.999 %를 소비합니다.* .DDS 파일을로드하는 것이 빠른 것이라고 생각 했습니까?

지금까지 알파 트리밍으로 텍스처 패킹 (SpriteSheets)을 살펴 봤는데 성능이 조금 더 좋아졌습니다. 이제는 저장되어있는 텍스처 형식을 살펴보기 시작했습니다. 현재 모든 것은 * .PNG로 저장됩니다.

텍스처가 VRAM에서 압축 된 상태로 유지되므로 * .DDS 파일이 특히 DXT5 (작업에 따라/3/1) 압축과 함께 사용되면 좋다고 들었습니다. 또한 사람들은 이미 DirectDraw Surface이기 때문에로드가 훨씬 빠르고 훨씬 빠릅니다.

그래서 이것을 테스트 할 응용 프로그램을 만들었습니다. 20 번 아래 라인을 호출하여 각 호출 사이의 텍스처를 해제합니다.

for (int i = 0; i < 20; i++) 
{ 
    if(FAILED(D3DXCreateTextureFromFile(g_pd3dDevice, L"Test.dds", &g_pTexture))) 
    { 
    return E_FAIL; 
    } 

    g_pTexture->Release(); 
    g_pTexture = NULL; 
} 

DXT5 텍스처로이 작업을 시도하면 간단한 * .PNG 로딩하는 것보다 완료하는 데 5 배 더 오래 걸립니다. Mipmaps를 생성하지 않으면 속도가 느려질 수 있다는 것을 들었습니다. 그런 다음 NVIDIA 자체의 nvcompress.exe로 전환하여 * .DDS 파일을 생성하는 데 사용한 프로그램을 변경했지만 아무 것도 효과가 없었습니다.

편집 : 파일 (* .png 및 * .dds)은 모두 동일한 이미지이며 다른 형식으로 저장된다는 사실을 잊어 버렸습니다. (같은 크기, 알파, 모든 것!)

EDIT 2 : 다음 매개 변수를 사용하면 거의 2.5 배 빨라지고 적은 VRAM을 소비합니다!

D3DXCreateTextureFromFileEx(g_pd3dDevice, L"Test.dds", D3DX_DEFAULT_NONPOW2, D3DX_DEFAULT_NONPOW2, D3DX_FROM_FILE, 0, D3DFMT_FROM_FILE, D3DPOOL_MANAGED, D3DX_FILTER_NONE, D3DX_FILTER_NONE, 0, NULL, NULL, &g_pTexture) 

그러나, 지금 텍스처에 내 모든 투명성을 잃고, 나는 DXT5 텍스처을 검토 한 결과 그것은 Paint.NET 및 DirectX DDS 뷰어에서 잘 보인다. 그러나 모든 투명도에로드되면 검정색으로 바뀝니다. ColorKey 문제?

편집 3 : 내가 바보 당하고 내 "빠른 예"급히 나는 알파 블렌딩 D3DXSprite-에이> 시작 가능하게 잊었다, 마지막 비트를 무시(). 도!

+0

텍스처가 비디오 메모리에 복사되는 경우 (매우 느림) 텍스처 자체의 로딩 시간을 측정하는 것만이 아닙니다. – newgre

+0

EDIT2에 대한 질문 : 원래의 5 배보다 느린 속도 또는 2.5 배 빠른 속도 PNG보다? –

답변

14

파일이 디스크에 저장되는 형식과 텍스처가 궁극적으로 비디오 메모리에서 사용하는 형식을 구별해야합니다. DXT 압축 텍스처는 메모리 사용량과 비디오 메모리 품질 간의 균형을 잘 유지하지만 PNG 또는 Jpeg 압축과 같은 다른 압축 기술은 일반적으로 파일 크기를 줄이고 디스크 품질을 향상시킵니다.

DDS 파일은 DXT 형식을 직접 지원하고 DirectX에서 데이터를 메모리에 배치 할 때와 동일한 방법으로 디스크에 배치되므로 메모리를 변환하기 위해로드 한 후 CPU 시간을 최소화해야한다는 장점이 있습니다 하드웨어가 사용할 수있는 형식으로 변환합니다. 또한 PNG가 지원하지 않는 형식의 미리 생성 된 밉맵 체인을 지원합니다. 이미지를 DXT 형식으로 압축하는 것은 시간이 많이 소요되는 프로세스이므로 일반적으로 가능한 경우로드하지 않는 것이 좋습니다.

미리 생성 된 밉맵이있는 DDS 파일은 표준 크기의 CPU 시간이 가장 적은 비디오 메모리 텍스처와 동일한 크기와 동일한 형식을 사용합니다. 그러나 D3DX가 스케일링, 필터링, 포맷 변환 또는 밉맵 생성을 수행하지 않도록 지시해야합니다. D3DXCreateTextureFromFileEx을 사용하면 내부 변환이 발생하지 않도록 플래그를 지정할 수 있습니다 (하드웨어가 두 텍스처 중 하나를 지원하지 않는 경우 이미지 너비 및 높이에 대해서는 D3DX_DEFAULT_NONPOW2, 밉맵 생성 또는 형식 변환을 방지하려면 D3DFMT_FROM_FILE, 필터링 또는 스케일링을 방지하려면 D3DX_FILTER_NONE).

CPU 시간은 이야기의 절반에 불과합니다. 요즘 CPU는 꽤 빠르며 하드 드라이브는 상대적으로 느리기 때문에 PNG 나 JPG와 같이 압축 된 작은 파일 형식을로드하고 큰 파일을로드하는 것보다 많은 CPU 작업을 변환하면 총로드 시간이 짧아지는 경우가 있습니다 DDS처럼 비디오 메모리에 memcpy를 수행하십시오. 좋은 결과를 가져 오는 일반적인 방법은 DDS 파일을 압축하여 디스크에서 빠르게로드하고 형식 변환을위한 최소 CPU 비용을 위해 압축을 푸는 것입니다.

PNG 및 JPG와 같은 압축 형식은 일부 이미지를 다른 이미지보다 효과적으로 압축합니다. DDS는 고정 압축 비율입니다. 주어진 이미지 해상도와 형식은 항상 같은 크기로 압축됩니다 (이것이 하드웨어에서 압축 해제에 더 적합한 이유입니다). 테스트를 위해 간단한 비표준 이미지 (예 : 균일 한 색상 또는 단순한 패턴)를 사용하는 경우 PNG 파일은 매우 작아 지므로 일반적인 게임 이미지보다 디스크에서 더 빨리로드됩니다.

+0

감사합니다 매트, 화려한 대답이 거기에. 관련 문제로 원래 게시물을 수정했습니다. – Siyfion

1

표준 PNG를로드 한 다음 DDS 파일을로드하는 데 걸리는 시간으로 압축하는 것을 비교하십시오.

아직도 PNG가 압축 된 동일한 텍스처 DXT5보다 빠르게로드되는 이유를 알 수 없습니다. 하나는 공정한 조금 작아서 폼 디스크를 더 빨리로드해야합니다! 이 DXt5 텍스처가 PNG 텍스처와 같은가요? 즉 그들은 같은 크기입니까?

D3DXCreateTextureFromFileEx로 게임 해 보셨습니까? 당신은 무슨 일이 벌어지고 있는지 훨씬 더 잘 제어 할 수 있습니다. 그것은 당신을 도울지도 모른다.

+0

죄송합니다. 어떤 파일이로드되었는지 언급 했어야합니다.이를 반영하기 위해 지금 편집했습니다. – Siyfion

+0

이러한 질감을 볼 기회가 있습니까? – Goz

+0

움직일 수 있으면 할 수 있지만 애니메이션 이미지가 포함 된 4 개의 텍스처 스프라이트 시트의 표준 배수입니다. – Siyfion

관련 문제