2008-09-11 3 views
4

DirectX 9를 래핑하고 2D 픽셀 수준 그리기를 수행 할 수있는 단순화 된 인터페이스를 제공하는 C# 컨트롤을 작성했습니다. .NET에서는이 코드를 안전하지 않은 코드 블록으로 묶고 안전하지 않은 코드 허용 옵션으로 컴파일해야합니다.2D 렌더링을위한 안전하지 않은 C# 및 포인터, 좋음 또는 나쁨?

나는 전체 표면을 잠근 다음 메모리의 잠긴 영역에 대한 포인터를 반환합니다. 그런 다음 "간단한"포인터 연산을 사용하여 픽셀 데이터를 직접 쓸 수 있습니다. 나는 성능을 테스트 해 본 결과 내가 아는 다른 "안전한"방법에 비해 상당한 속도 향상을 발견했습니다.

이 방법이 C# .NET 응용 프로그램에서 개별 픽셀을 조작하는 가장 빠른 방법입니까? 더 낫고 안전한 방법이 있습니까? 포인터 조작을 필요로하지 않는 똑같은 빠른 접근 방법이 있다면 그것을 사용하는 것이 나의 선호 일 것입니다.

(그러나이 컨트롤이 2D 픽셀 렌더링을 위해 독점적으로 사용하기에 간단하게 3D 렌더링을 필요로하지 않습니다, 나는이 2008 알고 우리 모두 등 다이렉트 3D, OpenGL을 사용해야합니다.)

답변

4

안전하지 않은 포인터를 사용하는 것이 C#에서 직접 메모리 조작을 수행하는 가장 빠른 방법입니다 (마샬 래퍼 함수를 ​​사용하는 것보다 빠릅니다).

호기심에서 벗어나서 어떤 종류의 2D 드로잉 작업을 수행하려고합니까?

픽셀 레벨 조작을 수행하기 위해 DirectX 표면을 잠그면 DirectX 사용으로 얻을 수있는 하드웨어 가속상의 이점 대부분을 무력화시킬 수 있습니다. 또한 터미널 서비스 (원격 데스크톱)를 통해 사용할 경우 DirectX 장치가 초기화되지 않으므로 해당 시나리오에서는 컨트롤을 사용할 수 없습니다 (사용자에게 중요하지 않음).

다이렉트 X는 큰 삼각형을 그리거나 이미지를 변형 할 때 (쿼드에 매핑되는 텍스처) 큰 효과가 있지만 단일 픽셀 조작으로는 그다지 훌륭하게 수행되지 않습니다.

.NET 토지에 머물러있는 방법 중 하나는 LockBits를 사용하고 반환 된 BitmapData 객체의 안전하지 않은 포인터를 통해 픽셀에 직접 액세스하여 Bitmap 객체를 표면으로 유지하는 것입니다.

1

I을 최근 씬 클라이언트 앱 (C#) 중 하나에 대한 간단한 히스토그램 컨트롤을 만드는 작업이있었습니다. 내가 분석 한 이미지는 약 1200x1200이었고 같은 길을 가야했습니다. 문제를 일으키지 않고 그 자체를 한 번 그려 낼 수는 있었지만 컨트롤을 다시 크기 조정해야했습니다. 나는 그것을 피하려고했지만 원시 메모리 자체에 가야했습니다.

표준 .NET 클래스를 사용하는 것이 불가능하다는 것은 아닙니다.하지만 결국은 제대로 작동하지 않습니다.

2

예, 아마도 가장 빠른 방법 일 것입니다.

몇 년 전에 저는 픽셀 수준에서 두 개의 1024x1024 이미지를 비교해야했습니다. get-pixel 방식은 2 분이 걸렸고 안전하지 않은 스캔은 0.01 초가 걸렸습니다.

3

저는 안전하지 않아서 자연을 빠르게합니다. 성능 향상은 극적이라고 할 수 있습니다. 여기에서 요점은 안전하지 않은 것은 당신이하고있는 일을 아는 한 당신이 필요로하지 않을 것들을 제거하는 것입니다.

또한 DirectDraw을 확인하십시오. DirectX의 2D 그래픽 구성 요소입니다. 정말 빠릅니다.

관련 문제