2011-08-12 1 views
5

나는 이미지 조작을 구현하는 성능이 중요한 응용 프로그램을 만들고 있습니다. 일부 처리를 할 Pixel라는 구조체를 사용하여 일부 픽셀 포인터를 사용하고 있습니다. 전체 비트 맵 데이터를 반복하는 코드 부분이 많이 있습니다. 코드 재사용과 모듈성을 위해 작업을 수행하여 이미지의 모든 픽셀에 적용하는 메서드를 디자인했습니다 (예 :지도 기능). 그러나 Action<Pixel*>을 쓸 때 Visual Studio는 코드 형식에 대해 Pixel* 형식 인수로 사용할 수 없다고 말하는 것에 대해 불평합니다. 전체 클래스는 unsafe 컨텍스트에 있고 어디서나 Pixel 포인터를 사용하고 있지만 픽셀 포인터를 액션의 템플릿 클래스로 사용할 수는 없습니다.액션 <PointerClass *>을 인수로 사용하기

나는 Action<IntPtr>을 사용할 수 있지만 모든 반복에서 메서드 본문의 적절한 포인터로 변환해야합니다. 그러면 성능에 치명적인 결과를 초래할 수 있습니다.

+0

정확한 오류 메시지? –

+0

' 'Tools.Imaging.Pixel *'형식을 형식 인수로 사용할 수 없습니다. ' –

+0

'동작이 '이 아닌 이유 –

답변

8

Action<T>을 사용하도록 강요하는 것은 아니므로 고유 한 대리인 유형을 만들 수 있습니다. 나는 일반적인 방법으로이 작업을 수행 할 수있는 방법을 파악하지 못했지만,이 작품 :

unsafe delegate void PixelAction(Pixel* ptr); 

이 정말 성능이 중요하다면, 대리자를 호출하는 것은 단지 직접 메소드를 호출하는 것보다 속도가 느린 있음을 유의하십시오. 어쩌면 Reflection.Emit 또는 CodeDOM을 사용하여 컴파일 타임이나 런타임에 코드 복제 (귀하의 경우 작동하는 경우) 또는 코드 생성과 같은 다른 방법이 더 나을 수도 있습니다.

+0

예. 이 대답은 나를 똑같이 생각하게 만들었습니다.'Action's로 작업하면 정규 대표자를 완전히 잊어 버렸습니다. 저는 이것을 구현하려고합니다. –

1

포인터 유형은 클래스가 아니므로 제네릭 형식 인수로 사용할 수 없습니다.

유일한 접근 방법은 동작 <IntPtr>을 정의하고 필요에 따라 양면에 캐스트하는 것입니다. 최적화로 컴파일 할 때 성능이 저하 될 것이라고 생각하지 않습니다.

편집이 : (CS0208)

중 하나를 작동하지 않습니다 아래에 밝혀, 또는 대신 정의 T > 액션 <를 사용하여 그 자신의 대리자 형식이 작동 될 수 있습니다

delegate void PointerAction<T>(T* ptr); 

+1

작동하지 않는 것 같습니다 : "포인터 및 고정 크기 버퍼는 안전하지 않은 컨텍스트에서만 사용할 수 있습니다". 'unsafe'를 추가하면 : "주소를 가져 오거나, 크기를 얻거나, 포인터를 관리 형 ('T')으로 선언 할 수 없습니다." – svick