요즘 세미나 발표를 하나 맡아서 의욕에 불타오르고 있네요.
덕분에 QuickStarts는 약간 보류. 아마 이번달 셋째주 이후로 한꺼번에 포스팅하지 않을까 싶습니다.

오늘은 이미지 로딩에 대해서 이런저런 테스트를 하다가 분노의 허리띠춤을 출 정도로 화났었죠.

어떤 개체를 이미지로 칠할 수 있는 ImageBrush라는 아주 막강한 툴을 제공하면서 이미지를 반복적 패턴으로 깔 수 있는 TileMode를 지원하지 않는 허무한 점.
이건 뭐;; 만약 10x10 사이즈의 패턴이 있고 이걸 100x100 영역에 바둑판 형식으로 깔고 싶다면 10x10=100개의 동일한 패턴 이미지를 생성해서 배열해야한단 얘기죠.

여기서 약간의 머리를 굴려서 패턴 이미지를 한번만 다운받아놓고 이걸 100개의 Image 개체에서 소스를 공유하면 비교적 간단하면서도 리소스 효율적으로 되지 않겠는가...란 생각으로 테스트 코드를 쓱쓱 작성했죠.

그런데 Image개체의 SetSource로 설정하는 Downloader는 한번 SetSource의 대상이 되면 다른 이미지의 SetSource에 대응하지 못하는 것 같습니다. ImageBrush도 마찬가지고요.

아니 그럼 똑같은 이미지를 100개 다운받아서 쓰란 얘긴가!?

이쯤되면 열받죠. 위의 테스트를 진행하는 것도 한나절 걸렸는데 방법이 없으니 너무나도.

그런데.
그냥 막코딩해도 성능이 충분히 나오는거에요.
Image[] img = new Image[100];
for (int i=0; i<100; ++i)
{
    img[i] = new Image();
    img.Source = new Uri(”Large.jpg”);
}

이런식으로 100개의 이미지 개체를 생성하고 100개의 new URI로 소스를 설정해도 실버라잇이 알아서 캐슁하는 것 같습니다.

각 단계에서 걸리는 시간을 측정해보면 첫번째 이미지를 초기화 하는데 약간 시간이 더 걸리고 나머지 99개는 거~의 상수시간 이내에 처리가 되는군요.

상당한 크기의 이미지(2304x1728 픽셀, 1.61메가) 100개를  리사이징 없이 올려놨는데도 정말 좋은 효율로 동작하네요. 메모리도 1.61메가 x 100 만큼 먹는게 아니라 원래 실버라잇 런타임이 먹는 용량 + 알파 정도... 총 합계 약 20메가 정도 먹습니다. 다시 말해 동일한 이미지를 메모리에 또 올리는 바보짓은 안한다는 거죠.

테스트는 여기에서 해보실 수 있어요.
http://gongdo.oranc.co.kr/Silverlight/Samples/DownloadTest/TestPage.html

역시나 뭘 해도 저보다야 100만배쯤 똑똑한 사람들이 만든거라... 후우... 오늘 난 뭘 위해 삽질을 했나. 그냥 막코딩을 해도 성능 충분히 나오는데...-_-
Posted by gongdo

Submit comment.

  1. 슈퍼낙훈 2007.06.09 04:47  comment URL  Edit/Remove  Submit comment.

    현재시간 4시 47분 에러가 나고 있습니다...