WinForms 차트 GPU 성능:

네이티브 Direct3D hDC 결합 vs GDI+ 렌더링

WinForms chart GPU rendering
Direct3D hDC charting
WinForms chart performance
compute shader vertex construction
GPU accelerated WinForms chart
WinForms chart data fidelity
native WinForms charting
WinForms chart benchmark

WinForms 차트 GPU 성능:
네이티브 Direct3D hDC 결합 vs GDI+ 렌더링

대부분의 WinForms 차트 비교는 잘못된 전제에서 출발합니다. WinForms가 WPF의 낡고 느린 형제이며, 진지한 대용량 데이터 차트는 WPF의 몫이라는 전제입니다. ProEssentials에서는 정반대가 사실입니다. WinForms 인터페이스는 Direct3D를 창의 디바이스 컨텍스트(hDC)에 직접 결합하여, WPF가 구조적으로 요구하는 render-to-texture 및 D3DImage 컴포지터 단계를 우회합니다. 그리고 당사 테스트에서 이는 네이티브 WinForms 경로를 동일한 엔진이 구동하는 WPF 컨트롤보다 end-to-end로 약 5% 더 빠르게 만듭니다.

이 페이지는 그 이유를 설명하고, 개발자가 실제로 평가하는 8가지 차트 옵션의 WinForms 렌더링 아키텍처를 비교하며, 여기의 모든 주장을 신뢰가 아닌 검증으로 확인할 수 있도록 4개의 재현 가능한 clone-and-run 데모를 제시합니다. 핵심은 간단합니다. WinForms에서 ProEssentials는 1억 개의 무손실 포인트를 데이터 복제 없이 약 15 ms에 렌더링하며, 그것도 아키텍처상 가장 빠른 인터페이스에서 수행합니다.

이 페이지의 모든 수치를 직접 재현해 보세요. 4개의 WinForms 데모, 클론 후 F5:


Native WinForms chart performance — real-time spectrogram heatmap rendered by Direct3D compute shaders
ProEssentials WinForms — real-time spectrogram heatmap: 93K-point surface replaced every 25 ms, UseDataAtLocation zero-copy, Direct3D ComputeShader
hDC의 이점: 동일 엔진에서 네이티브 WinForms가 WPF를 능가하는 이유

WPF에서 GPU로 렌더링하는 모든 차트 라이브러리는 피할 수 없는 아키텍처적 부담을 집니다. WPF는 자체 컴포지션 엔진(Media Integration Layer)을 통해 화면을 소유합니다. 컨트롤은 네이티브 창처럼 Direct3D를 화면에 직접 그릴 수 없습니다 — WPF 컴포지터가 그 픽셀을 소유하기 때문입니다. GPU 콘텐츠를 주입하려면 라이브러리는 Direct3D 장면을 오프스크린 텍스처로 렌더링하고, 그 텍스처를 D3DImage(또는 최신 컴포지션 interop)를 통해 WPF에 넘긴 다음, 다음 컴포지터 틱에서 WPF 컴포지터가 비주얼 트리에 합성하도록 해야 합니다.

이 왕복은 공짜가 아닙니다. 완성된 GPU 프레임은 공유 surface로 복사되고, Direct3D와 WPF 렌더링 스레드 간에 동기화되며, 화면에 도달하기 전에 WPF가 두 번째로 합성합니다. 모든 프레임은 차트 자체가 얼마나 빨리 그려졌는지와는 무관한 텍스처 복사 및 컴포지터 동기화 비용을 지불합니다.

ProEssentials WinForms 컨트롤에는 그러한 부담이 없습니다. 표준 System.Windows.Forms.Control로서 실제 Win32 창 핸들과 실제 디바이스 컨텍스트를 소유합니다. Direct3D가 그 hDC에 직접 결합되어, Compute Shader로 구성된 프레임이 창에 곧바로 표시됩니다 — render-to-texture도, D3DImage 전달도, 두 번째 합성도 없습니다. C++/MFC 및 Delphi/VCL 인터페이스도 마찬가지이며, 매니지드 레이어가 전혀 없어 hDC에 한층 더 직접 결합됩니다.

실제 결과: 대표적인 데이터셋 전반에서 네이티브 WinForms 인터페이스는 동일한 ProEssentials 엔진이 구동하는 WPF 컨트롤보다 end-to-end로 약 5% 더 빠르게 측정됩니다. Compute Shader, zero-copy 데이터 경로, on-demand 프레임 모델은 바이트 단위로 동일합니다 — 유일한 차이는 WinForms가 WPF 컴포지터를 완전히 건너뛴다는 점입니다. WinForms는 ProEssentials의 타협 인터페이스가 아닙니다. 가장 빠른 인터페이스입니다.

이것이 반직관적이면서도 검증 가능한 이유

업계 전체는 WPF를 고성능 대상으로, WinForms를 레거시로 자리매김합니다. render-to-texture WPF 엔진에는 이 구도가 자기충족적입니다. Direct3D를 hDC에 결합하는 엔진에는 그 구도가 뒤집힙니다. WPF 컴포지터의 부재가 네이티브 경로를 더 빠르게 만듭니다. 동일한 100M 데모를 WinForms 컨트롤과 WPF 컨트롤에서 각각 실행하여 그 차이를 직접 확인할 수 있습니다.

빠른 참조: WinForms 렌더링 아키텍처 비교
WinForms factorProEssentialsSciChartLightningChartDevExpressSyncfusionComponentOneTelerikScottPlot
Native WinForms control✅ Yes❌ WPF-in-ElementHost✅ Yes✅ Yes✅ Yes✅ Yes✅ Yes✅ Yes (OSS)
GPU technologyDirect3D compute shaders, hDC-coupled(WPF) DirectX game loopDirectX immediate-modeGDI+ / optional DirectXNone — GDI+ onlyGDI+ / optional Direct2DGDI+ (Direct2D is WPF-only)CPU — System.Drawing / SkiaSharp
Fast large-data path on WinFormsCompute shader + zero-copyvia WPF onlyDirectX seriesSwiftPlot (WinForms-only)None (fast series WPF-only)Direct2D modeNone (aggregate manually)Decimation
Frame modelOn-demandContinuous (WPF loop)Continuous DirectX loopOn-demandOn-demandOn-demandOn-demandOn-demand
Data fidelity at scaleLossless — every pointResampledLossless (correct series)Lightened / object-per-pointLossless but unacceleratedLosslessRequires aggregationDecimated
Data loadingZero-copy pointer (UseDataAtLocation)Copies into DataSeriesCopies via AddSamplesSeriesPoint objectsIEnumerable iterationData binding / arraysDataPoint objectsArrays (managed↔native copy)
Stated / benchmarked ceiling100M lossless, ~15 msn/a nativelyBillions (marketing)20M+ "without preprocessing"Unbounded but slowBenchmarked to 30K"90K is too much"10M+ (100+ ms init)
vs WPF on same engine~5% faster (no compositor hop)

WinForms 차트 환경은 WPF 환경과 다릅니다

WPF에서 WinForms로 옮겨가면 경쟁 구도가 달라지며, 더 중요하게는 대부분 경쟁사의 고성능 기술이 함께 따라오지 않습니다. 여러 라이브러리가 공격적인 Fast Series 또는 GPU 렌더링을 내세우지만, 그 경로를 WPF, WinUI, UWP에서만 제공합니다. WinForms에서는 GDI+, 기능이 축소된 fast view, 또는 아무것도 없는 상태로 후퇴합니다. 무엇이 어디에 해당하는지 이해하는 것이 단일 벤치마크 수치보다 더 중요합니다.

ProEssentials: Direct3D Compute Shaders, hDC 결합

ProEssentials WinForms 컨트롤(PegoWin, PesgoWin, Pe3doWin, PepsoWin, PepcoWin)은 Direct3D Compute Shader를 사용하여 차트 이미지를 전적으로 GPU에서 구성하는 표준 System.Windows.Forms.Control 파생 클래스입니다. 수천 개의 GPU 코어가 모든 데이터 포인트를 병렬로 처리하며, CPU는 배열을 결코 순회하지 않습니다. 완성된 프레임은 컨트롤의 hDC에 직접 표시됩니다.

대용량 데이터 렌더링은 몇 가지 속성으로 활성화됩니다 — PeData.ComputeShader = true와 StagingBufferX/Y/Z 플래그 — 그리고 데이터는 UseDataAtLocation()을 통해 제공되며, 이는 배열을 복사하는 대신 기존 배열에 대한 포인터를 저장합니다. float-to-double 변환도, 포인트당 객체 할당도, 데이터에 대한 매니지드 루프도 없습니다.

파이프라인은 on-demand로 실행됩니다. 데이터나 뷰포트가 실제로 변경될 때만 그립니다. 유휴 차트는 GPU를 전혀 소비하지 않습니다. 이는 WPF 컨트롤과 동일한 엔진, 동일한 셰이더, 동일한 zero-copy 경로입니다 — 다만 WPF의 render-to-texture 컴포지터 단계가 없기에 WinForms 경로가 더 빠르게 측정됩니다.

RTX 3090에서 보고된 처리량: 1억 개의 무손실 포인트를 ~15 ms에 구성하며, 프레임마다 전체 1억 포인트 데이터 전송을 포함해 약 15 FPS의 end-to-end 프레임 속도를 보입니다 — 리샘플링도, 다운샘플링도, 어떠한 데이터 축소도 없습니다.

WinForms, C++/MFC, Delphi/VCL 전반에 걸친 네이티브

동일한 네이티브 Win32 DLL이 WinForms(.NET 속성 인터페이스 경유)와 C++/MFC 및 Delphi/VCL(PEnset/PEvset DLL API 경유)을 구동합니다. 셋 모두 Direct3D를 hDC에 결합하므로, 셋 모두 render-to-texture WPF 대비 네이티브 경로 성능 우위를 얻습니다.

SciChart: 네이티브 WinForms 컨트롤 없음

SciChart는 흔히 가장 빠른 WPF 차트로 언급되지만, 네이티브 WinForms 컨트롤이 전혀 없습니다. SciChart 자체 문서는 WinForms가 WPF와의 통합을 통해서만 지원된다고 명시합니다 — 즉, WPF SciChartSurface를 Microsoft ElementHost 안에 호스팅하는 방식입니다.

이는 SciChart WinForms 배포가 render-to-texture 컴포지터 경로를 포함하여 WPF의 모든 특성을 물려받고, 더해서 마우스 이벤트, 포커스, Z-순서와 관련된 잘 알려진 ElementHost interop 제약까지 떠안는다는 의미입니다. 결국 WinForms 옷을 입은 WPF 컨트롤을 실행하는 셈입니다.

진정한 네이티브 WinForms 애플리케이션 — 특히 Win32/MFC 혈통의 데이터 수집 소프트웨어 — 에는 일급 SciChart 옵션이 없습니다. 이 분야의 대표적 성능 이름이 네이티브 WinForms 항목을 제공하지 않는 것입니다.

 ElementHost는 네이티브 컨트롤이 아닙니다

ElementHost를 통한 WPF-in-WinForms 호스팅은 문서화된 interop 브리지이지 WinForms 컨트롤이 아닙니다. 이는 WPF의 컴포지터 비용과 ElementHost의 airspace, 포커스, 입력 라우팅 제약을 이를 사용하는 모든 WinForms 창으로 가져옵니다.

LightningChart: 네이티브, GPU — 연속 루프

LightningChart는 가장 강력한 진정한 네이티브 WinForms 경쟁자입니다. GDI+ 대신 저수준 DirectX로 렌더링하며 매우 높은 용량을 내세웁니다(과거 자료는 최대 10억 포인트를 언급했고, 현재 마케팅은 수십억 단위 수치를 제시합니다).

그 절충점은 WPF 페이지와 동일합니다. 연속 DirectX 렌더 루프는 아무것도 변하지 않아도 GPU를 계속 활성 상태로 유지하므로 유휴 대시보드도 계속 프레임을 그립니다. 그리고 배포에는 역사적으로 재활성화 수수료가 따르는 온라인 활성화가 필요했습니다 — 에어갭 산업 및 방위 시스템에는 실질적인 장애물입니다.

대규모에서의 무손실 렌더링은 올바른 시리즈 유형 선택에 달려 있습니다. 잘못된 유형은 컴파일 타임 경고 없이 성능을 수십 배로 조용히 저하시킵니다.

DevExpress: SwiftPlot (WinForms 전용, 기능 축소)

DevExpress가 흥미로운 이유는 빠른 대용량 데이터 뷰인 SwiftPlotSeriesView가 WinForms 전용이기 때문입니다 — WPF ChartControl에는 존재하지 않습니다. DevExpress는 전처리 없이 2천만 개 이상의 포인트를 시각화하는 능력을 내세우며, 선택적 DirectX 모드는 UHD에서 GDI+보다 최대 9배 빠릅니다.

SwiftPlot은 다른 뷰 유형에서 제공되는 기능을 의도적으로 생략하는 경량화 생성 알고리즘으로 속도를 얻으며, 기저 데이터 모델은 여전히 포인트당 객체 방식입니다. 1억 포인트에서는 렌더링이 시작되기 전에 수십억 바이트의 DataPoint 객체를 할당해야 한다는 뜻입니다.

수만에서 수백만 범위에 적합한 실시간 뷰이지만, 선택적 DirectX를 갖춘 CPU/GDI+ 기반 경로입니다 — Compute Shader 엔진이 아니며 zero-copy도 아닙니다.

Syncfusion: WinForms Fast Series 없음

Syncfusion은 대용량 데이터를 위한 Fast Series(FastLineSeries, FastLineBitmapSeries)를 내세우지만, 이는 WPF, WinUI, UWP에서만 존재합니다. WinForms에는 fast-series 경로가 없습니다. Syncfusion 자체 지원팀은 WinForms 차트에 fast series를 추가하는 기능 요청을 등록했으나 즉각적인 구현 계획은 없다고 밝혔습니다.

WPF에서조차 빠른 경로는 CPU 기반입니다. FastLineBitmapSeries는 WriteableBitmap에 그리며 백만 포인트를 몇 초 만에 렌더링합니다. Syncfusion은 또한 DirectX 시리즈 지원을 중단했습니다. 따라서 WinForms는 GPU 가속 없는 표준 GDI+ 렌더링에 의존합니다.

Syncfusion은 ~10만 포인트 미만의 비즈니스 대시보드를 위한 강력한 광범위 UI 스위트로 남아 있지만, 대용량 과학용 WinForms 차트 엔진은 아닙니다.

ComponentOne FlexChart, Telerik, ScottPlot, MS Chart

ComponentOne FlexChart(Mescius/GrapeCity)는 GDI+ 기본값과 선택적 Direct2D 고성능 모드를 갖춘 유능한 네이티브 WinForms 컨트롤이지만, 자체 공개 성능 벤치마크는 100에서 30,000 포인트까지만 테스트하며 이는 1억 규모보다 서너 자릿수 낮습니다.

Telerik RadChartView는 WinForms에서 GDI+ 기반이며, 하드웨어 가속 Direct2D/Skia 옵션은 WPF 전용입니다. Telerik 자체 팀은 90,000 포인트가 RadChartView에는 너무 많다고 밝히며, 플로팅 전에 데이터를 집계/평균화할 것을 권장합니다 — 손실이 따르는 우회책입니다.

ScottPlot은 지배적인 무료/오픈소스 옵션입니다(CPU 기반, System.Drawing에서 SkiaSharp로). 대표 부분집합으로의 데이터 데시메이션에 의존하며, 매우 큰 플롯(1천만+ 포인트)의 초기화에는 100+ ms가 걸립니다. 메인테이너는 포인트 배열의 매니지드-네이티브 마샬링이 근본적인 한계라고 언급합니다. 지원 종료된 Microsoft Chart(System.Windows.Forms.DataVisualization.Charting)는 공식적으로 deprecated되었고 GDI+ 기반이며 기본형 Dundas Chart에서 비롯되었고 최신 .NET(5–8)에서 지원되지 않습니다.

On-Demand vs 연속 렌더링 — 같은 이야기, WinForms 에디션

WPF 페이지의 on-demand 대 연속 구분은 WinForms에서 동일하게 적용되며, 차트 선택에서 가장 과소평가되는 요소로 남아 있습니다. ProEssentials는 데이터가 변경될 때만 그리고, LightningChart의 연속 DirectX 루프는 그와 무관하게 그립니다. 네이티브 WinForms 컨트롤에서는 on-demand 프레임이 hDC에 직접 표시되므로, 프레임이 실제로 발생할 때 유휴 GPU 절감이 컴포지터 오버헤드 없이 이루어집니다.

On-demand 렌더링은 활성 렌더링 중에 더 느리지 않습니다 — Compute Shader 경로는 똑같이 빠릅니다. 차이는 프레임 사이에 일어나는 일입니다. ProEssentials는 아무것도 하지 않는 반면, 연속 루프 라이브러리는 동일한 픽셀을 다시 그리느라 GPU와 팬을 계속 바쁘게 둡니다.

WinForms에서의 데이터 충실도: 모든 포인트인가, 근사치인가?

충실도 문제는 WinForms에서 WPF보다 더 첨예합니다. 그만큼 많은 WinForms 경로가 GDI+ 또는 데시메이션 기반이기 때문입니다. 진짜 질문은 라이브러리가 모든 포인트를 렌더링하는지, 아니면 조용히 다운샘플링된 근사치를 보여주는지입니다.

ProEssentials는 모든 포인트를 렌더링합니다. Compute Shader가 전체 1억 값을 처리하고 픽셀 열당 올바른 min/max/close를 계산하므로 스파이크와 이상치가 보존됩니다 — hDC에서 무손실로.

Telerik과 ScottPlot은 반응성을 유지하기 위해 데이터를 명시적으로 축소합니다(집계, 데시메이션). DevExpress SwiftPlot은 알고리즘을 경량화합니다. WinForms의 Syncfusion에는 빠른 경로가 없습니다. 각각은 추세 표현에는 적합하지만, 각각은 단일 샘플 이벤트를 숨길 수 있습니다.

ECG 부정맥, 진동 공진 피크, 마이크로초 단위 반도체 이상에서 무손실과 데시메이션의 차이는 이벤트를 보느냐 놓치느냐의 차이입니다.

WinForms libraryLarge-data behaviorData rendered
ProEssentialsCompute shader, all points100 % lossless
LightningChartDirectX, correct series100 %
DevExpressSwiftPlot lightenedFeature-reduced
SyncfusionGDI+, no fast pathLossless but slow
TelerikAggregate / average downReduced
ScottPlotDecimation to subsetDecimated

수백만 포인트를 평균화하여 처리한다는 WinForms 차트는 당신의 데이터를 렌더링하는 것이 아닙니다 — 데이터의 요약을 렌더링하는 것입니다. 항상 빠른 경로가 무손실인지 데시메이션인지 물어보세요.

재현성 테스트: 실제 WinForms LiDAR 포인트 클라우드

벤치마크는 논쟁의 여지가 있지만, 재현 가능한 저장소는 그렇지 않습니다. WinForms 엔진의 가장 명확한 시연은 3D LiDAR 포인트 클라우드 데모로, 실제 항공 LiDAR 반환값 — 깔끔한 격자 래스터가 아니라 비정형 XYZ 데이터 — 을 GPU Compute Shader 정점 구성으로 hDC에 표시하여 렌더링합니다.

당사는 모든 주요 차트 공급업체의 공개 GitHub에서 clone-and-run 방식의 WinForms LiDAR 또는 대규모 포인트 클라우드 데모를 조사했습니다. 아래 결과는 속도 주장이 아니라 가용성 주장이며, 가용성은 정의상 검증 가능합니다. 저장소를 직접 손에 쥘 수 있기 때문입니다.

VendorPublic WinForms / native LiDAR demoStandalone clone-and-run repoPoints rendered
ProEssentials (this repo)✅ Yes✅ Yes — clone & F52,500,000 raw airborne returns
SciChart✅ Yes (WPF)❌ Sub-folder of examples mega-repo~250,000 (gridded raster)
LightningChart📝 Blog tutorial only❌ Trial install requiredMarketing claims up to 55M; no public repo to verify
DevExpress❌ None found
Syncfusion❌ None found
Telerik❌ None found

Compute Shader 경로는 수백만 포인트 클라우드의 click-to-first-paint를 수 초의 CPU 정점 구성에서 사실상 즉각적인 GPU 구성으로 바꿉니다 — 동일한 코드, 동일한 데이터, 동일한 하드웨어이며 네 줄의 속성으로 전환됩니다. 메시지는 ProEssentials가 가장 빠르다가 아닙니다. ProEssentials는 이 규모에서 집중적이고 재현 가능한 LiDAR 저장소를 제공하는 유일한 WinForms 차트 공급업체라는 것입니다.

GPU Compute Shader 경로의 작동 방식

ComputeShader가 없으면 CPU는 단일 코어에서 각 포인트를 순차적으로 순회하여 정점 데이터를 구성합니다. PeData.ComputeShader = true를 사용하면 GPU가 잠재적으로 2,000개 이상의 코어에 걸쳐 이 작업을 병렬로 수행합니다. 250만 포인트 LiDAR 클라우드에서 측정된 영향: click-to-first-paint가 약 3초의 CPU 정점 구성에서 사실상 즉시로 떨어집니다.

StagingBuffer 플래그는 전송 중 렌더 파이프라인을 멈추지 않고 효율적인 CPU-to-GPU 업로드를 가능하게 하는 GPU 접근 가능 중간 메모리 영역을 할당합니다. 네 줄을 주석 처리하면 의도적으로 느린 CPU 경로를 사용할 수 있습니다 — 전후 비교에 유용합니다:

// 3D 스캐터, GPU 정점 구성, WinForms hDC에 표시
Pe3do1.PeData.ComputeShader  = true;
Pe3do1.PeData.StagingBufferX = true;
Pe3do1.PeData.StagingBufferY = true;
Pe3do1.PeData.StagingBufferZ = true;

WinForms 성능에 대한 결론

ProEssentials에서 WinForms는 WPF에 대한 다운그레이드가 아닙니다 — 더 빠른 인터페이스입니다. Direct3D가 창의 hDC에 결합되어 WPF의 render-to-texture 컴포지터 단계를 건너뛰며, 동일 엔진에서 약 5%의 end-to-end 우위를 제공하기 때문입니다. GPU Compute Shader, on-demand 렌더링, 무손실 충실도, zero-copy 로딩을 1억 무손실 포인트 ~15 ms와 함께 얻습니다.

대안들 중에서 SciChart는 네이티브 WinForms 컨트롤이 없고(WPF-in-ElementHost 전용), Syncfusion은 WinForms fast series가 없으며, Telerik은 집계를 권장하기 전 수만 포인트에서 한계에 이르고, ComponentOne은 30K까지만 벤치마크하며, ScottPlot은 데시메이션하고, Microsoft Chart는 지원 종료되었습니다. LightningChart와 DevExpress가 진정한 네이티브 경쟁자입니다 — 둘 다 유능하지만 둘 다 절충점을 안고 있습니다(연속 루프 전력 소비와 활성화, 기능 축소된 포인트당 객체 fast view). 데이터 충실도와 대규모 성능이 중요한 네이티브 WinForms, C++/MFC, Delphi/VCL 차트에서 ProEssentials의 hDC 결합 Compute Shader 엔진은 이용 가능한 가장 강력한 기술적 토대입니다.

1억 포인트: 전체 코드

각 라이브러리가 1억 데이터 포인트를 어떻게 처리하는지 정확히 보여주는 나란히 비교한 C# 코드.

더 읽기
가격 및 지원

5년 TCO 비교, 지원 티켓 제한, 그리고 도움이 필요할 때 실제로 누가 응답하는지.

더 읽기
AI 코드 지원

pe_query.py가 AI 생성 차트 코드를 컴파일된 DLL에 대해 검증하는 방법.

더 읽기
WinForms, C++ 또는 Delphi 성능에 대한 질문이 있으신가요?

ProEssentials 지원은 무료이고 무제한이며 렌더링 엔진을 구축한 엔지니어가 직접 제공합니다. hDC 결합, Compute Shader, zero-copy 로딩 또는 네이티브 실시간 성능에 대해 무엇이든 문의하세요.

ProEssentials 팀에 문의하기 →

기술 참조 및 Ground-Truth 출처

이 페이지의 모든 경쟁사 주장은 해당 공급업체의 자체 문서, 벤치마크 또는 지원 진술에서 출처를 둡니다. 직접 확인하세요:

우리의 미션

귀사의 조직과 최종 사용자들에게 가장 쉽고 가장 전문적인 혜택을 제공함으로써 귀사께서 성공하시는 것이 당사의 최우선 목표입니다.

저희는 엔지니어입니다

프로에센셜은 자체 차트 컴포넌트가 필요한 전기 공학 전문가들로부터 태어났습니다. 프로에센셜을 사용하는 탑 엔지니어링 기업들 명단에 참여히세요.

정말 감사합니다

프로에센셜 고객이 되어주셔서 감사드리며, 프로에센셜 차트 제작 엔진을 연구해주셔서 감사드립니다.