나를 위한 메모.

오늘도 실버라이트로 굿뺑이 나이스뺑이를 치고 있어요.
여튼 평소와 같이 간단한 컨트롤을 하나 만들고 이것저것 하고 있는데, 이상하게도 겨우 50개의 컨트롤을 올리는데 로딩시간이 5초 이상 걸리는거에요. 물론 약간 복잡한 형태를 담고 있는 컨트롤이긴 하지만 아무리 생각해도 이건 아니었죠.

해결하기 위해 별 짓을 다 해봤어요. 컨트롤 안에 있는 무거운 구성요소(이미지, 스토리보드)들을 싸그리 주석처리 하고 다시 해보기도 하고 배경에 있는 다른 컨트롤들을 주석처리 하기도 하면서요. 그래도 거의 차이가 없더군요.

문제는 바로 RootVisual인 Page 클래스의 생성자 또는 Page의 Loaded 이벤트에서 50개의 컨트롤을 죄다 생성했기 때문이었더군요.

일반적으로 생각했을 때 Loaded 이벤트에서 다수의 컨트롤을 초기화 하는 것은 나쁜 생각이 아니지만 실버라이트 전체 페이지가 로드 될 때라면 얘기가 약간 달라지는 것 같아요.
전체 페이지의 초기화 사이클에서는 플러그인 초기화, 메모리 할당, 템플릿 및 스태틱 리소스 초기화 등 여러가지 일이 동시에 일어나기 때문에 일반적인 상황에 비해서 컨트롤이나 오브젝트의 생성/할당 작업이 훨씬 더 느려지는 걸로 보여요.

결국 이 문제를 해결하기 위해서 50개의 컨트롤을 생성하는 작업을 DispatcherTimer를 사용하여 0.5초 정도 지연 시켜서 했더니 5초 이상 걸렸던 초기화 작업이 거의 1초 이내에 완료가 되더군요.

여튼 실버라이트에서 성능적으로 가장 큰 저하가 일어날 때는 다수의 컨트롤을 한꺼번에 오브젝트 트리에 올릴 때인데요, 항상 대용량 데이터를 올릴 때에는 그 상황에 다른 로딩 작업이 있는지를 잘 생각해야 할거에요.

나중에 시간 여유가 생기면 이러한 차이를 체감할 수 있는 샘플을 만들어보도록 하죠.

신고
Posted by gongdo


티스토리 툴바