2010-08-12 5 views
4

부진하다고 느껴지는 WinForms 프로젝트를 작업하고 있습니다. 이것은 말 그대로 수백 개의 사용자 정의 컨트롤로 구성됩니다. UI 기능이있는 경우 (앱의 다른 곳에서 사용하지 않더라도) 사용자 정의 컨트롤에 캡슐화됩니다. ANTS 프로파일 러를 사용하여 여러 번 프로젝트를 진행했으며 많은 코드가 다양한 컨트롤 생성자 인 것으로 보입니다.사용자 정의 컨트롤에 오버 헤드가 많이 있습니까?

사용자 정의 컨트롤을 추출하기 전에 사용자 정의 컨트롤 (예 : 내장 컨트롤)없이 폼을 레이아웃하는 것보다 WinForms 응용 프로그램에 상당한 오버 헤드가 발생합니까?

+0

와우. 물론 약간의 오버 헤드 (클래스, 초기화, 인스턴스화 등)가 있습니다. 원래 컨트롤과 90 % 이상 유사한 컨트롤이 있습니까? (거의 또는 작은 수정 사항이 적용된 사용자 정의 버전과 같습니다.) 그리고 한 번에 모든 컨트롤을 표시하고 있습니까? 고마워요. –

+0

@lb 아니, 한번에 모두 보이지 않아. 사실 꽤 큰 프로젝트입니다. 아웃룩을 생각해보십시오 : 사이드 바에있는 버튼을 클릭하면 새로운 컨트롤 패널이 생깁니다.이 패널에는 작은 컨트롤이 포함되어 있으며 러시아어 중첩 인형과 같이 아직 작은 컨트롤도 포함되어 있습니다. – AngryHacker

답변

3

나는 사용자 컨트롤 (User Control) 지옥에 있었고 재미 있지 않습니다. 몇 가지 내가 나타났습니다 : 너무 많은 사용자 컨트롤이 주위 양식을 이동하거나 스크롤하면

  1. , 당신은 흰색 깜박임의 많은 바람 수 있습니다 중첩 윈도우의 도면 작업이 싸움을 핸들로 렌더링 시간. 이것은 처음 양식을 열 때 특히 두드러집니다.

  2. 디자이너의 중첩 된 사용자 컨트롤에주의하십시오. 디자이너에서 사용자 정의 컨트롤을 열면 생성자가 호출되지 않습니다. 실제로 컴파일러에서 생성 한 코드를 구문 분석하여 디자이너 화면을 생성합니다. 그러나 해당 사용자 정의 컨트롤에서 사용하는 사용자 정의 컨트롤에는 해당 생성자가 호출됩니다. 이것은 일반적으로 문제가되지 않지만, 이상한 일이 일어나는지 알면 가치가 있습니다.

  3. 사용자 컨트롤이 많은 대규모 솔루션을 사용하는 경우 VS2008은 처음으로 디자이너 창을 열 때 모든 가능한 컨트롤을 찾기 위해 모든 프로젝트를 열거하는 데 시간이 오래 걸립니다. 이것은 비교적 작은 성가심이지만 시간을 소비 할 수 있습니다.

즉, 사용자 정의 컨트롤은 적당하고 절제에 유용 할 것입니다. 내가 피하려고하는 주된 것은 지나치게 깊은 중첩입니다. WPF가이 점에서 훨씬 우수하다는 것을 알았습니다. 렌더링 파이프 라인을 완벽하게 제어 할 수 있으므로 컨트롤의 심층 구성과 관련된 다시 그리기 문제가 발생하지 않습니다.

+0

좋은 관찰. # 1 스타일링 설정으로 깜박임 해결 (http://www.angryhacker.com/blog/archive/2010/07/21/how-to-get-rid-of-flicker-on-windows-forms- applications.aspx). 각 컨트롤이 디자인 모드에 있는지 여부를 결정하는 기본 컨트롤에서 상속 받도록하여 # 2를 해결했습니다.# 3은 Tools/Options/WinForms Designer로 가서 AutoToolBoxPopulate를 끄면 해결되었습니다. – AngryHacker

+0

@AngryHacker, 깜박임을위한 흥미로운 해결 방법; 다음번에 GUI가 많이 드는 또 다른 WinForms 앱을 할 때를 기억해야합니다. –

3

사용자 정의 컨트롤은 다른 컨트롤을위한 컨테이너입니다. 수백 개의 파일을 보유하고있는 것은 아마도 프로젝트에 수백 개의 창을 가지고 있음을 의미합니다. 창은 매우 비싼 운영 체제 개체입니다. 그들은 50 대가 넘을 때 페인트 퍼프를 눈에 띄게 끌기 시작합니다.

Outlook과의 비교가 쉽습니다. 프로그램 크기가 적당합니다. 창문이 50 개 미만입니다. Spy ++로보기 쉽습니다.

차이점은 OnPaint입니다. Microsoft는 많은 코드를 작성 했으므로 양식에 많은 컨트롤을 포함시키지 않았습니다.

+0

+1, 실제 문제는 사용자 컨트롤이 아니라 창 핸들입니다. MS가 실제로 DirectX를 통해 단일 창에서 자신의 그림을 모두 처리하는 WPF와 같은 기술을 사용하여 실제로 창 핸들에서 벗어나고 있다는 것은 흥미 롭습니다. Windowing은 그 시대의 혁명적 인 개념 이었지만 더 많은 응용 프로그램이 실행되고 점점 더 복잡한 내용이 포함되어 특정 아키텍처가 확장되지 않았습니다. –

+0

항상 그렇게했습니다. VB6에서는 창없는 컨트롤을 지원합니다. ToolStripItem 클래스를 사용하여 WinForms로 돌아갑니다. 그리고 예, WPF. –

관련 문제