나는 바둑판 식으로 배열 할 수있는 타일 그래픽을 표시하는 WPF 컨트롤 (FrameworkElement에서 상속)을 만들었습니다. 각 타일은 24bpp에서 256x256 픽셀입니다. OnRender를 재정의했습니다. 여기서 모든 새 타일을 (BitmapFrame으로)로드 한 다음 drawingContext.DrawImage를 사용하여 보이는 모든 타일을 그립니다.BitmapSource를 사용한 WPF 렌더링 성능
이제는 렌더링주기 당 새로운 타일이 여러 개있을 때마다 프레임 속도가 약 1 초 동안 60fps에서 0으로 떨어집니다. 이는 이미지로드 (밀리 초 단위로 소요) 또는 DrawImage (일부 중간 렌더링 데이터 구조 만 채우기 때문에 시간이 전혀 필요 없음)로 인해 발생하지는 않습니다.
내 생각에 렌더 스레드 자체가 새로운 BitmapSource 인스턴스 (즉, 이미 캐싱되지 않은 인스턴스)가 20 개 이상 (~ 20 개)이 될 때마다 렌더링 스레드 자체가 울립니다. 그것은 내부 DirectX 호환 형식으로 변환하는 데 많은 시간을 소비하거나 캐싱 문제 일 수 있습니다. 비디오 RAM이 부족할 수는 없습니다. Perforator는 60MB 이하의 최고점을 보여 주며, 256MB가 있습니다. 또한, Perforator는 모든 렌더 타겟이 하드웨어 가속화되어 있으므로 그렇게 할 수 없다고 말합니다.
통찰력을 얻으실 수 있습니다! 사전
다니엘
에서감사
@RandomEngy :
BitmapScalingMode.LowQuality 문제가 조금 감소하지만, 그것을 제거하지 않았다. 이미 의도 한 해상도로 타일을로드하고 있습니다. 또한 최신 드라이버 인 그래픽 드라이버가 될 수 없습니다 (Nvidia).
스케일링에 많은 시간이 걸린다는 사실에 조금 놀랐습니다. 내가 이해할 수있는 방식으로 비트 맵 (크기에 관계없이)은 Direct3D 텍스처로로드 된 다음 하드웨어 스케일링됩니다. 사실 비트 맵이 처음 렌더링 된 후에는 더 이상 고정하지 않고도 회전 및 크기를 변경할 수 있습니다.