2017-03-23 3 views
1

현재 게임 프로젝트의 성능 최적화를 찾고 있습니다. 내 초기화 프로세스의 병목 현상으로 인해 내 모델의 질감이로드됩니다. 큰 텍스처로드 및 할당에는 최대 100ms가 소요됩니다. 제가 많은 것을 가지고 있기 때문에 이것은 문제입니다. 나는 내 코드를 분석하여 대부분의 시간 (약 96 %)이 CopyPixels (아래 참조) 호출에 소비되었다는 것을 알아 냈습니다.텍스처로드 성능을 향상시키는 방법은 무엇입니까?

아래의 모든 텍스처를 가져 오기 위해 사용하는 기능을 첨부했습니다. 이 함수는 매력처럼 작동하며 공식 SharpDX-samples-master 예제 코드를 기반으로합니다. 먼저 커스텀 파일 포맷에서 이미지 바이트를로드합니다 (큰 텍스처의 경우 약 2ms 소요). 그런 다음 형식 변환기를 만들고이를 사용하여 픽셀을 데이터 스트림에 복사합니다. 그러나 픽셀 복사는 매우 느립니다.

동일한 목표를 달성하는 더 빠른 방법이 있습니까? 당신은 비트 맵을 사용하는 것처럼

public static Resources.Texture ImportTexture(Resources.AResourceManager resourceManager, string resourcePackFileName, int bytePosition, out string resourceItemName) 
{ 
    // Load image bytes from file. 
    FileReader fileReader = new FileReader(); 
    DataTypes.Content.ResourceItem resourceItem = fileReader.ImportTextureFromCollection(resourcePackFileName, bytePosition); 
    resourceItemName = resourceItem.Name; 

    // Create texture. 
    Resources.Texture tex = null; 
    using (SharpDX.WIC.BitmapDecoder bitmapDecoder = new SharpDX.WIC.BitmapDecoder(resourceManager.ImagingFactory, new MemoryStream(resourceItem.Data, false), SharpDX.WIC.DecodeOptions.CacheOnDemand)) 
    { 
     using (SharpDX.WIC.FormatConverter formatConverter = new SharpDX.WIC.FormatConverter(resourceManager.ImagingFactory)) 
     { 
      formatConverter.Initialize(bitmapDecoder.GetFrame(0), SharpDX.WIC.PixelFormat.Format32bppPRGBA, SharpDX.WIC.BitmapDitherType.None, null, 0.0, SharpDX.WIC.BitmapPaletteType.Custom); 

      SharpDX.DataStream dataStream = new SharpDX.DataStream(formatConverter.Size.Height * formatConverter.Size.Width * 4, true, true); 

      // This takes most of the time! 
      formatConverter.CopyPixels(formatConverter.Size.Width * 4, dataStream); 

      // Creating texture data structure. 
      tex = new Resources.Texture(formatConverter.Size.Width, formatConverter.Size.Height, formatConverter.Size.Width * 4) 
      { 
       DataStream = dataStream 
      }; 
     } 
    } 

    return tex; 
} 
+0

비트 맵을 사용하는 것처럼 보입니다. 대신 DDS 파일 사용을 고려 했습니까? 압축 형식과 압축되지 않은 형식을 모두 지원합니다. – Asesh

+0

내 텍스처는 모두 PNG 파일입니다. 콘텐츠 파이프 라인에서는 모든 데이터 (모델 지오메트리, 텍스처, 애니메이션 등)를 리소스 팩에 저장하고 필요할 때 런타임에로드합니다. 그래서 PNG 파일의 바이트를 저장하고 위의 함수로 처리합니다. 다른 소스 파일 형식이 더 좋을 것이라고 생각하십니까? – Endgegner85

+0

글쎄, 나는 그것을 시도 줄 것이다. 텍스쳐링을 위해 압축 된 (DXT5) DDS 파일을 사용합니다. 게다가, DDS 파일도 밉맵을 지원합니다 – Asesh

답변

1

보인다. 대신 DDS 파일 사용을 고려 했습니까? 압축 형식과 압축되지 않은 형식을 모두 지원합니다 - Asesh

Asesh가 옳았습니다. 처음에는 회의적 이었지만 몇 가지 조사를 해보았으며 평균 PNG 텍스처가 비슷한 DDS 텍스처보다 하드 드라이브에서 더 적은 메모리를 차지한다는 오래된 기사를 발견했습니다. 그러나 PNG 텍스처는 DDS 텍스처를 사용하는 것보다 느린 런타임에서 변환해야합니다.

저는 지난 밤에 적절한 변환 도구를 찾고, 김프 용 플러그인과 같은 것들을 테스트 한 후에 AMD의 Compressonator를 사용하여 모든 PNG 텍스처를 DDS 텍스처로 변환했습니다. 새 파일은 하드 드라이브에서 PNG 파일 (2.1 GB 대신 1.7 GB)보다 적은 메모리를 사용합니다.

초기 글에 제시된 텍스처로드 방법이 여전히 효과적이었으며 약간 빨랐습니다. 그러나 온라인에서 찾은 여러 코드 샘플을 기반으로 DDS 가져 오기 프로그램을 작성하기로 결정했습니다.

결과 : 큰 텍스처는 가져 오기 위해 103 밀리 초가 아닌 1 밀리 초만 걸립니다. 나는 당신이 그렇게 할 수 있다고 생각합니다. :-D

대단히 감사합니다. Asesh!

+0

다행 당신에게 제안을 해줄 수 있습니다 :) – Asesh

+0

DDS 수입업자 코드를 공유 할 수 있습니까? 내가 찾을 수 있었던 유일한 참조 코드는 SharpDx.Toolkit.Graphics에서 지금 포기 된 코드입니다. – NathanAldenSr

관련 문제