Piszę program wyświetlający obraz na oscyloskopie, jeśli chodzi o działanie, to wszystko jest w najlepszym porządku ale program ma tę wadę, że poniższa procedura trwa dość długo, bo aż 160-170ms, a pożądane jest skrócenie tego czasu do max 30-40ms.
public void DrawScreen()
{
// Ustalanie pozycji myszki
Int64 MouseZ;
GetCursorPos(out MouseZ);
Int64 MouseX0 = MouseZ % 4294967296;
Int64 MouseY0 = MouseZ / 4294967296;
int MouseX = (int)MouseX0;
int MouseY = (int)MouseY0;
// Wspolrzedne lewego gornego naroznika
ScreenX = MouseX - (ScreenW / 2);
ScreenY = MouseY - (ScreenH / 2);
// Czyszczenie obrazka zrodlowego
ScreenPicInputG.FillRectangle(Brushes.Black, new Rectangle(0, 0, ScreenW, ScreenH));
// !!! 27ms - wykonanie zrzutu ekranu
ScreenPicInputG.CopyFromScreen(ScreenX, ScreenY, 0, 0, Screen.AllScreens[ScreenNr].Bounds.Size, CopyPixelOperation.SourceCopy);
// Dorysowania kursora myszki
ScreenPicInputG.DrawImage(MouseCursor, MouseX - ScreenX - MouseHotX, MouseY - ScreenY - MouseHotY);
// Naniesienie zrzutu obrazu na drugi obraz, ten drugi obraz jest juz obrazem o identycznych wymiarach, co obraz docelowy
ScreenPicG.DrawImage(ScreenPicInput, new Rectangle(0, 0, Wscr, 256));
// Czyszczenie obrazu docelowego
ScreenOutG.FillRectangle(Brushes.Black, new Rectangle(0, 0, Wscr, H));
Color C;
Color C0;
Color C1;
// !!! 140ms - obliczanie i nanoszenie pikseli na obraz docelowy
// Obraz zawsze ma 256 linii
for (int Y = 0; Y < 256; Y++)
{
// Definiowanie kolorow
if (IsNegative)
{
C0 = Color.FromArgb(Y, Y, Y);
C1 = Color.FromArgb(Pattern[Y + PatternPageCounter], Pattern[Y + PatternPageCounter], Pattern[Y + PatternPageCounter]);
}
else
{
C0 = Color.FromArgb(Pattern[Y + PatternPageCounter], Pattern[Y + PatternPageCounter], Pattern[Y + PatternPageCounter]);
C1 = Color.FromArgb(Y, Y, Y);
}
// Rsowanie jednej linii
for (int X = 0; X < Wscr; X++)
{
// !!! 60ms
// Pobieranie koloru piksela z obrazka pośredniego (zawierającego zrzut ekranu po dopasowaniu wymiarow)
C = ScreenPic.GetPixel(X, Y);
// 5ms - obliczanie odcienia szarosci i sprawdzaniie, czy dany piksel jest zakwalifikowany jako bialy, czy jako czarny
if ((((C.R * 211) + (C.G * 715) + (C.B * 74)) + R.Next(0 - RandomRange, RandomRange)) < BWThreshold)
{
// !!! 70ms - czas, o jaki wydluza sie przebieg petli przy isnieniu OBU polecen "ScreenOut.SetPixel"
// rysowanie piksela, gdy kolor jest ciemny
ScreenOut.SetPixel(X, Y, C0);
}
else
{
// rysowanie piksela, gdy kolor jest jasny
ScreenOut.SetPixel(X, Y, C1);
}
}
}
PatternPageCounter = PatternPageCounter + 256;
if (PatternPageCounter == PatternPages)
{
PatternPageCounter = 0;
}
}
Za pomocą wykrzykników zaznaczyłem te instrukcje, które są wąskim gardłem. Są programy graficzne i do video, które wykonują bardziej skomplikowane operacje graficzne w krótszym czasie (nawet bez wykorzystywania karty graficznej), więc na pewno da się skrócić czas rysowania i pobierania piksela z obrazka bitmapowego. Czym zastapić polecenia ScreenOut.SetPixel() i ScreenPic.GetPixel()? Obiekty ScreenOut i ScreenPic są klasy "Bitmap".
Ja umiałbym napisać identyczny program w Delphi 5.0 oraz w Javie przy użyciu NetBeans. Który język byłby najlepszy do tego celu? Interesuje mnie tylko działanie w systemie Windows XP.