2010-02-12 3 views
14

디자이너가 Blend를 사용하여 WPF 응용 프로그램의 스타일을 지정합니다. 속성에 대한 로컬 리소스를 선택하면 Blend는 {StaticResource} 대신 {DynamicResource}으로 적용합니다. 내 생각 엔 블렌드가 앱을 다시 시작할 필요없이 런타임에 다시 테마화할 수 있기 때문입니다.StaticResource 대신 DynamicResource에 상당한 성능 비용이 있습니까?

내 질문은 :이 추가 조회에 상당한 성능 비용이 있습니까? 우리는 디자이너에게 돌아가 수동으로 그 역학을 통계학으로 바꿔야할까요? 여기

은 유형의 차이를 설명하는 좋은 SO 질문 : 성능 차이가있을 말한다 What's the difference between StaticResource and DynamicResource in WPF?

답변

25

불행히도 이것은 성능 저하가 나타날 곳이 WPF 엔진의 깊은 곳이기 때문에 상대적인 성능을 직접 비교하는 것이 매우 어려운 경우입니다. WPF 초창기에 StaticResource 사용은 권장 된 표준 성능 튜닝 변경 중 하나였으며 우리는 조직에서이를 엄격히 준수하고 다른 사람들에게 권장하는 경향이있었습니다. Blend가 동적 인 모든 작업을 수행 했음에도 불구하고 실제로 디자인 타임에 다른 파일의 리소스를 렌더링하는 데 도움이되었지만 정말 짜증났습니다.

시간이 지남에 따라 내 개인적인 경험으로 인해이 점에 대한 견해가 바뀌었지만 Microsoft의 Blend 팀의 의견도 반영되었습니다. 아마도 Blend는 WPF로 작성되었으며 응용 프로그램이 실행되는 동안 즉시 전환 할 수있는 완전한 대체 테마 (Light)를 가지고 있습니다. 이것은 DynamicResource를 거의 모든 스타일링에 사용했기 때문에 가능합니다. 그들에 따르면, 이것이 실제로 그들에게 실질적인 문제를 일으키지는 않았다. Blend가 아마도 가장 널리 사용되는 WPF 응용 프로그램이라는 점을 감안할 때, 나는 그들의 관점에 상당한 비중을 두는 경향이 있습니다.

다른 고려 사항은 DynamicResource의 실제 유용성입니다. 즉석에서 스타일을 변경할 수있는 기능은 리소스 계층 구조를 구성하는 데있어 유연성을 제공하므로 공유 스타일을 훨씬 쉽게 관리 할 수 ​​있습니다. StaticResource 레퍼런스가 런타임시에 폭발 한 상황에 직면했을 것으로 확신합니다. 왜냐하면 그것이 지적한 리소스가 다른 계층의 계층에로드되기 때문입니다.

분명히 StaticResource는 적시에 사용할 수있는 특정 키를 가리키는 데 매우 유용합니다. XAML을 손으로 쓸 때 나는 항상 그것을 사용하는 경향이 있습니다. 그러나 디자이너가 Blend에서 XAML을 생성하게함으로써 얻을 수있는 생산성을 감안할 때 작은 성능 향상은 손으로 모든 것을 정적으로 유지하는 데 드는 오버 헤드의 가치가 없을 것입니다.

+0

"StaticallyResource는 분명히 특정 키를 가리키는 데 매우 유용합니다. 당신은 적시에 이용할 수있을 것입니다. " DynamicResource가 컴파일 타임 형식 검사를 잃고 런타임으로 이동한다는 의미입니까? – scobi

+0

예. 대부분의 경우 해결되지 않은 DynamicResource 참조는 기본값 (예 : 검은 색 브러시)을 가져오고 표시 할 키를 기다립니다. 컴파일러가 그 상황을 스스로 검증하는 방법은 실제로 없습니다. –

+0

정말 고마워, 고마워 !! –

5

을하지만 여부 "중요한"얼마나 많은 동적 조회가 일어나고에 따라 달라집니다. 수천 개의 DynamicResource 참조가 없으면 어느 쪽이든 눈에 띄지 않을 것입니다. 동적 리소스가 정적 리소스보다 훨씬 나쁜 성능을 보이는 경우 Blend가이를 생성하는 데 더 보수적이라고 생각합니다. 내가 순진 테스트를 실행할 때

사실

, 나는 정적 리소스보다 (3000 리소스 참조와 함께, 내가 200ms의 주위에로드 시간을 보았다빠른 내가 주위를 400ms 일 대 모든 것을 DynamicResource를 사용할 때 DynamicResource가 실행하는 직관에 반하는 결과를 발견 StaticResource).

이것은 비현실적인 테스트였습니다. 모든 참조가 똑같은 것이었고, 디버거 등에서 실행되고있었습니다.하지만 Blend 출력을 변경하는 데는 너무 성급한 편이라고합니다. 만약 당신이 속도 저하에주의를 기울인다면 반드시 DynamicResource 참조의 잘못이 아닐 수도 있습니다 - 항상 측정하십시오!

+1

DynamicResouces가 backgrond 스레드에로드되어 사용하는 항목이 훼손 될 때만로드되므로 속도 테스트가 매우 어려워 짐 –

1

동적 리소스를 정적으로 다시 변경하면 Blend가 중단됩니다. 이 사실은 특히 동적 리소스를 참조하는 UserControls를 사용할 때 정적 인 것으로 변경하면 블렌드의 다른 컨트롤 안에 호스팅 될 때 컨트롤이 렌더링되지 않습니다.

관련 문제