2010-06-25 3 views
2

간단한 비디오 렌더러를 만들어서 재미있게 만들기 위해 모바일 OS가 될만한 것을 만들어보고 싶습니다. 아버지는 첫 번째 컴퓨터에서 특정 메모리 주소를 편집하고 화면이 업데이트 될 것이라고 말했습니다. Windows에서이 창 내부에서이를 시뮬레이션하고 싶습니다. C#으로이 작업을 수행 할 수있는 방법이 있습니까?창에서 개별 픽셀을 편집하려면 어떻게해야합니까?

답변

2

이것은 범위를 벗어난 완전한 기능을 갖춘 주제입니다. (적합하지 않을 것입니다. 몇 시간 동안이 답변을 포기할 수는 없지만 ...-) C#에서 그리기 시작해야합니다.

http://www.geekpedia.com/tutorial50_Drawing-with-Csharp.html

상황이 manipulation..although 모든 것이 여전히 픽셀로 연결되어 직접 메모리의 옛부터 조금왔다.

편집 : 아, 그리고 깜박 거리는 문제가 생겨서 붙어 있다면, 줄을 버리고 DoubleBuffered 패널로 페인트를 보내 드리겠습니다.

+0

WinForms> v2.0에서 DoubleBuffered 속성 설정으로 이중 버퍼링을 설정할 수 있습니다. http://msdn.microsoft.com/en-us/library/system.windows.forms.control.doublebuffered. aspx. – codekaizen

+0

하지만 패널이나 관리되는 컨트롤에는 없습니다 .-D 계속 시도해보십시오. DoubleBuffered 속성이 보호 된 값이기 때문에 적극적으로 시도를 무시합니다. – Caladain

+0

오른쪽. 패널을 서브 클래스 화하고 생성자에서 해당 속성을 설정하는 것이 매우 쉽기 때문에 잊어 버린 것 같습니다. 여하튼 DoubleBuffered는 컨트롤 스타일을 ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, 그래서 당신은 단지 그 값으로 SetStyle()을 호출 할 수 있습니다. – codekaizen

4

비디오 버퍼에 직접 액세스 할 수 있기 때문에이 방법을 사용했습니다. 비디오 메모리는 비디오 드라이버 및 OS로 관리되기 때문에 일반적으로 현재 시스템에서는 사용할 수 없습니다. 또한 비디오 메모리 버퍼의 1 : 1 매핑과 더 이상 표시되는 것이 실제로 없습니다. 사용 가능한 메모리가 너무 많아서 여러 개의 버퍼가 있고 그 사이를 전환 할 수있었습니다. 현재 표시된 버퍼를 "프론트 버퍼"라고하고 표시되지 않은 다른 버퍼를 "백 버퍼"라고합니다 (자세한 내용은 http://en.wikipedia.org/wiki/Multiple_buffering 참조). 일반적으로 백 버퍼에 기록한 다음 비디오 시스템에서 프론트 버퍼를 업데이트하도록합니다. 이는 비디오 드라이버가 업데이트를 모니터의 스캔 속도와 동기화하므로 원활한 업데이트를 제공합니다.

C#을 사용하여 백 버퍼에 쓰기 위해 내가 가장 좋아하는 기술은 WPF WritableBitmap을 사용하는 것입니다. 또한 System.Drawing.Bitmap을 사용하여 LockBits을 통해 픽셀을 써서 화면을 업데이트했습니다.

+0

이것이 더 나은 해결책이라고 확신하지만, 코드를 완전히 이해하지 못하고 자신을 아는 것만으로도 커다란 시간을 망칠 것입니다 비 관리 코드 : D –

+0

@ 대니얼 - 이것은 관리되지 않는 코드가 아닙니다. 안전하지는 않지만 확실한 것은 다른 방법으로는 빠르지 않습니다. GetPixel/SetPixel을 사용할 수는 있지만 빠르게 할 수는 없습니다. ;) – codekaizen

관련 문제