wolny witeln

0

Witam

Mam problem. Wyświetlenie całego ekranu 80x25 tekstu z ansistring w fpc w trybie konsolowym zajmuje mi 0,15-0,2 sekundy. Czy jest jakiś sposób aby to robić szybciej, znacznie szybciej, poniżej 0,04 sekundy.

Z góry dziękuje za odpowiedź,
Kaszti

0

Możesz zapisywać bezpośrednio do pamięci ekranu.
Program napisany w Turbo Pascalu, ale powinien działać w FPC (może po małych przeróbkach)

program PamiecEkranu;

type Monitor = array[1..25, 1..80] of record
                                        znak: Byte;
                                        atr:  Byte;
                                      end;
var EkranKolor: Monitor absolute $B800:0;
    Ekran: ^Monitor;
    Bufor:  Monitor;
    i, j, Kolor: Byte;

begin
  Ekran:= @EkranKolor;
  Randomize;
  Kolor:= Random(10);
  for j:= 1 to 25 do
   for i:= 1 to 80 do begin
     Bufor[j, i].znak:= Random(10)+48;     {Cyfry 0..9}
     Bufor[j, i].atr:= Kolor;
   end;
  Readln;
  Move(Bufor, Ekran^, SizeOf(Bufor));
  Readln;
end.

Tekst z AnsiString przepisz najpierw do bufora, a następnie przy pomocy procedury Move do pamięci ekranu
Mała uwaga: musisz wypełnić cały bufor łącznie z ze wszystkimi miejscami, które będą puste na ekranie (atrybuty też), bo inaczej na ekranie pojawią krzaczki.

Nie znam innej szybszej metody

0
kaszti napisał(a)

Witam

Mam problem. Wyświetlenie całego ekranu 80x25 tekstu z ansistring w fpc w trybie konsolowym zajmuje mi 0,15-0,2 sekundy. Czy jest jakiś sposób aby to robić szybciej, znacznie szybciej, poniżej 0,04 sekundy.

Z góry dziękuje za odpowiedź,
Kaszti

Chyba strata czasu jest przez przewijanie ekranu. Może da się wypisywać na pustym ekranie od góry i zatrzymać wypisywanie przed przewijaniem, czyli przed dojściem wypisywanego tekstu do dołu, potem skasować ekran i znowu wypisywać od góry.

0

Tak też robię. Daje gotoxy(1,1); write(ansistring); a w tym ansistring jest cały ekran 80x25 znaków, i wygenerowanie tego ansistring zajmuje mi poniżej 0,01s a wyświetlenie koło 0,17s. Spróbowałem dać:
pchar := pchar(ansistring);
gotoxy(1,1);
write(pchar);
ale to mi przyspieszyło o jakieś 0,02s, to za mało.

0

Pisanie do pamięci ekranu co prawda zadziała we Free Pascalu, ale pod DOS-em. W programie kompilowanym dla Windows nie ma co na to liczyć.
A writeln jest pod FPC/Win32 niestety powolny.
Rozwiązaniem jest unit video, ale jest drętwo udokumentowany i brakuje przykładów..

0

dzięki, unit video to jest to. nie zaglądałem do niego bo myślałem że to do trybów graficznych a tu proszę. może jest słabo udokumentowany ale mi wystarcza, jest działający!!! przykład. no i zszedłem poniżej 1ms.

0

Azarien napisał

Pisanie do pamięci ekranu co prawda zadziała we Free Pascalu, ale pod DOS-em. W programie kompilowanym dla Windows nie ma co na to liczyć.
...

Tylko co to jest program kompilowany dla Windows?

Jeśli masz na myśli program okienkowy, to oczywiście nie zadziała w nim pisanie bezpośrednio do pamięci ekranu 80x25 znaków (takiego jak w DOSie), bo ... tam nie ma takiego ekranu, więc jak do niego coś zapisać? I nie pomoże tu żaden moduł.

Natomiast w systemie Windows XP (nie wiem jak w następnych):
Turbo Pascal 5.5, Turbo Pascal 7.1 - działa
Free Pascal (aplikacja konsolowa) - działa
Delphi 2.0 ({$APPTYPE CONSOLE}) - też działa

Tak więc tam gdzie mamy do czynienia z konsolą zapisywanie bezpośrednio do pamięci ekranu da się zastosować jak najbardziej i myślę, że jest to dosyć szybka metoda.

Co do modułu Video we Free Pascalu, nigdy go nie używałem, ale nie przeczę, że jest szybszy

0

Tylko co to jest program kompilowany dla Windows?

Myślę, że jest to dość jasne i jednoznaczne określenie.

Tak więc tam gdzie mamy do czynienia z konsolą zapisywanie bezpośrednio do pamięci ekranu da się zastosować

Nie, nie da się zastosować. Co innego program DOS-owy, a co innego konsolowy program pod Windows. Program z "{$APPTYPE CONSOLE}" skompilowany pod Delphi lub edycją Win32 Free Pascala nie jest programem DOS-owym, tylko pełnoprawną aplikacją Windows.
Okno konsoli zresztą można poprzez WinAPI sobie otworzyć też w okienkowym programie. Podobnie konsolowy program win32 może też utworzyć normalne okno aplikacji.
Natomiast program skopilowany pod Turbo Pascalem, lub DOS-ową edycją Free Pascala jest programem DOS-owym (odpowiednio: 16- lub 32-bitowym). Taki program można uruchamiać w czystym DOS-ie. I w takim programie sztuczka z bezpośrednim zapisem do pamięci ekranu ma szansę działać.

0

Azarien napisał

Program z "{$APPTYPE CONSOLE}" skompilowany pod Delphi lub edycją Win32 Free Pascala nie jest programem DOS-owym, tylko pełnoprawną aplikacją Windows.

Tak, tylko że ten program, który wcześniej napisałem, kompiluje się w Delphi, uruchamia i działa (znaki pojawiają się na ekranie). Nie pisałbym, ale sam sprawdziłem

0

Ciekawe. Jednak pod Delphi 2006 program się już nie kompiluje (variable expected, czyli absolute wymaga innej zmiennej, a nie adresu). Ale można by to obejść wskaźnikiem o zadanej wartości stałej.

0

Azarien napisał

Program z "{$APPTYPE CONSOLE}" skompilowany pod Delphi lub edycją Win32 Free Pascala nie jest programem DOS-owym, tylko pełnoprawną aplikacją Windows.

Z przykrością muszę stwierdzić, że ... masz absolutną rację.
Spróbowałem jeszcze raz (a dokładnie to pierwszy) skompilować ten program w Delphi i pojawia się błąd tam gdzie piszesz. Okazuje się, że pisałem wtedy program w Delphi z dyrektywą "{$APPTYPE CONSOLE}", tyle że był to jakiś inny program. Ten natomiast kompilowałem w Turbo Pascalu i tam oczywiście działał.

Tak więc przepraszam za zamieszanie jakie sprawiłem swoim postem i dziękuję za dyskusję. Dla mnie była ona owocna, bo czegoś się nauczyłem

Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1