2010년 1월 5일 화요일

[.NET Compact Framework-C#] 리소스 이미지 속도개선

프로젝트를 진행하다 보면 .NET Compact Framework 에서 기본적으로 제공되는 컨트롤들 만으로는 고객의 입맛을 맞출 수 없다. 그러다 보면 이미지를 처 바르는(-_-) 행태를 보이게 되는데 사용자에 따라 파일로 된 이미지를 동적으로 로딩하던지 아니면 리소스에 추가하여 사용하던지 할 것이다.

이번 프로젝트에서는 후자를 사용했는데(까놓고 얘기하자면 사용하기 편하다는 이유 밖에 없지만) 이미지가 조금만 많아져도 로딩이 너무 느려지는 현상이 있다. 게다가 리소스 디자이너에서 자동 생성하는 코드가 static 으로 되어 있어 한번 로딩하면 메모리상에서 사라지지도 않는다.

메모리에서 사라지지도 않는데 느리다니... 이는 정말 어처구니 없는 리소스 관리자인듯... 리소스 디자이너를 손 대봤자 Visual Studio가 원상복귀 할것이 뻔하고... 메모리에서 사라지지 못하게 하는건 어쩔 수 없다 치더라도 로딩 속도를 줄여야겠다고 생각했다.

방법은 간단하다. 리소스를 사용하는 클래스에서 이미지 이름으로 생성되는 함수를 static image 멤버에 미리 할당하고 사용하면 static 로딩시에는 같은 속도를 내겠지만 리소스의 데이터를 해석해서 Image 로 만드는 과정을 반복하지 않아 재 사용 시 속도를 줄일 수 있다. 아래는 기존의 느린 방법과 새로운 개선된 방법에 대한 예시이다.

1. 기존 방법

public class Test
{
private Image image;
public Test()
{
image = Test.Properties.Resources.test_image;
}
}


2. 개선된 방법

public class Test
{
private static Image text_image = Test.Properties.Resources.test_image;
private Image image;
public Test()
{
image = text_image;
}
}


리소스 이미지를 사용하고 반복 로딩을 많이 할 경우 위와 같은 방법을 사용하면 확실히 속도 개선을 볼 것이다.

덧붙여 말하자면 조금 어처구니 없는것은... 디자이너에서 바로 이미지를 삽입하면 리소스에서 바로 읽어오는 형태(1번과 같은 방법으로)로 코드가 자동완성되는데... MS는 이런걸 알고도 리소스 매니저를 만든것인지...

댓글 없음:

댓글 쓰기