[Delphi] Timer a obciążenie procesora

0

Witam.

Mam mały problem. Jestem w trakcie robienia gry w których poruszanie odbywa się dzieki Timerowi.
Już wcześniej miałem dolegliwości że na innych komputerach Timer chodzi szybciej. Była to różnica znikoma. W trybie na jednym komputerze nie ma to znaczenia. Ale ostatnio <ort>wziełem </ort>się za tworzenie trybu Multi przez internet. I tutaj jest problem. Jeśli na dwóch komputerach Timer chodzi z inną prędkością gra traci sens. Czytałem że TTimer w pakiecie Delphi jest niedokładny. <ort>Sciągnełem </ort>więc ThreadTimer i zrobiłem test. Wcześniej miałem już zainstalowane kompomenty DelphiX i JVCL. Więc i stąd <ort>wziełem </ort>po Timerze. I teraz najgorsze. Wszystkie timery ustawiłem aby wyświetlały wynik co 1ms. (taki stoper) Wszystkie timery chodziły prawie równo. Tylko ThreadTimer troche szybciej. Ale postanowiłem obciażyc procka. I co się okazało ? Że Timer z JVCL przyśpieszył. Gdy na liczniku było 40000 to na innych było 2500.
Dlaczego gdy obciaże procesor JvTimer chodzi szybciej. Testowałem to również u brata na komputerze i to samo. ThreadTimer chodził normalnie jak chodził wcześniej. TTimer zwolił a DXTimer skakał. (Wynik gorszy od TTimera). Czy jest na to jakaś rada ?
Pytanie drugie. <ort>Nierobiłbym </ort>tego testu gdyby nie to że na niektórych komputerach timer chodzi szybciej. Gre testowałem na kilku kompach. (jeszcze z TTimer). U mnie gra chodzi jak powinna. U mojego brata i kolegi chodzi szybciej. Mimo że mają o wiele gorsze komputery. (poniżej 1Ghz ja 3,2Ghz) Na innym komputerze gdzieś 2,8 Ghz chodziło tak jak u mnie. I to jest dziwne. Nie wiem dlaczego tak się dzieje.

0

Sugerowałbym zrezygnować z Timerów i poszukać innych rozwiązań.

0
brodny napisał(a)

Sugerowałbym zrezygnować z Timerów i poszukać innych rozwiązań.

Jakie rozwiązania <ort>naprzykład </ort>?
Bo mam takie coś że Timer sprawdza zmienną w której znajduje się kierunek. I zależnie od niego ustala nowe <ort>współżędne </ort>x i y poczym wysyła informacje o nowym <ort>połorzeniu </ort>do procedury rysującej, która rysuje obiekt w nowym ort!. Macie jakiś pomysł jak można Timer zastąpić. ?

0
norbipal napisał(a)

Jakie rozwiązania <ort>naprzykład </ort>?
Bo mam takie coś że Timer sprawdza zmienną w której znajduje się kierunek. I zależnie od niego ustala nowe <ort>współżędne </ort>x i y poczym wysyła informacje o nowym <ort>połorzeniu </ort>do procedury rysującej, która rysuje obiekt w nowym ort!. Macie jakiś pomysł jak można Timer zastąpić. ?

a nie lepiej wykonywać przypisanie wartości do zmiennej (obliczanie nowych x i y) i rysowanie w momenice kliknięcia/puszczenia klawisza ?

0
PcSA napisał(a)

a nie lepiej wykonywać przypisanie wartości do zmiennej (obliczanie nowych x i y) i rysowanie w momenice kliknięcia/puszczenia klawisza ?

Nie, ponieważ u mnie jest tak, że ruch jest wykonywany bez przerwy. Nawet jak nic nie klikasz ruch wykonuje się w kierunku, w którym został naciśnięty ostatni klawisz. Dlatego musi sprawdzać czy gracz nie nacisnął nowego klawisza ruchu. A nawet gdyby zrobić zmiane kierunku Od razu w procedurze rysującej to i tak procedura rysowania musiałaby być w Timerze, który rysuje obiekt w nowym położeniu co pewien okres czasu. (domyślnie na Timerze co 1 milisekunde).
Wszystko było by dobrze gdyby nie to, że na słabszych komputerach Timer chodzi szybciej. :(

0

Systemowe timery maja dosc niski priorytet, wiec nic dziwnego ze nie maja nic z dokladnosci i za kazdym razem "chodza" inaczej - ta wartosc, ktora sie podaje co ile ma "tyknac" jest tylko orientacyjna - ale za to nie zarzynaja procesora.

Nie wiem jak dziala taki ThreadTimer, pewnie polega to na utworzeniu watku z wysokim priorytetem i recznej implementacji "tykniec", ale to powoduje zwiekszenie zuzycia procesora, poza tym i tu nie ma sposobu, zeby to zsynchronizowac z innym kompem, slowem - radze poszukac innego rozwiazania.

Moze poczytaj o watkach i synchronizacji watkow, zamiast isc na latwizne i uzywac gotowych timerow - wtedy bedziesz miec wplyw na wszystko.

0
othello napisał(a)

Systemowe timery maja dosc niski priorytet, wiec nic dziwnego ze nie maja nic z dokladnosci

MMTimer, który zaproponowałem, ma bardzo wysoki priorytet.

0
norbipal napisał(a)

Jestem w trakcie robienia gry w których poruszanie odbywa się dzieki Timerowi.
Już wcześniej miałem dolegliwości że na innych komputerach Timer chodzi szybciej.

Nigdy nie słyszałem aby ktoś robił gry, w których szybkość animacji ustala jakimś timerem.
Obliczasz czas absolutny - wystarczy nawet GetTickCount, lepsze to QueryPerformanceCounter...
Na podstawie tego czasu przesuwasz obiekty.

Mając czas poprzedni t0, teraz t1 = GetTickCount, dt = t1-t2
prędkość obiektu v, wtedy przesunięcie = dt*v (kierunek jest w v - to taki wektor, czyli ogólnie nie skalar,
ale szczególnie może być :-D ).

Timer może sobie być - tak pomocniczo, ale liczba tiknięć nic nie znaczy:

procedure TimerFunc;
begin
obliczamy t1, t2 i dt

if dt < minimum then exit; // zbyt często też nie trzeba

przesuwamy zależnie od tego dt, a nie o jakąś stałą typu dt = 1ms, bo tak timer ustawiłeś

rysujemy, itd.

t0 = t1; // potrzebne do następnego kroku
end;

Timer można ustawić na 10ms, albo minimum 5 -> 200FPS wystarczy,
zwykły Timer tworzony przez SetTimer nawet tyle nie wyrobi...

dla 1ms jest 1000FPS - kto to zauważy, zwłaszcza gdy monitor działa z freq = 100Hz? :-D

0

Pomysł z timerami to otwieranie piwa za pomocą młotka - może i da się ale ma parę poważnych wad...
O ile w przypadku wersji jednostanowiskowej może i przejdzie to zastanów się nad koncepcją upływu czasu w wersji sieciowej. Podpowiem poczytaj trochę o systemach czasu rzeczywistego - choć to trochę na wyrost. Zacznij od tego że w sieci powinno jak najmniej krążyć komunikatów, a jak najwięcej robić się na komputerach lokalnych. Inaczej następnym pytaniem będzie: Dlaczego jak łącze sie z kolegą i próbujemy grac to program działa powoli, reaguje z opóźnieniem lub nie działa.

0

U mnie nie ma animacji. Jest tylko rysowanie na zwykłym Canvas.
Może abyście zobaczyli, o co mi chodzi dam wam link do strony gdzie można ściągnąć tą grę.
<url>www.lines.webpark.pl</url>
A co do sieci... To komunikat wysyłany jest tylko podczas klikania klawisza ruchu. Posiada on wartość nowej zmiennej odpowiedzialnej za kierunek poruszania. A klawiszy się tak często nie używa, aby były lagi, chyba. :-/

Ta gra jest jeszcze nie dopracowana... MA wiele błędów itp. Mam dopiero 17 lat i tak się bawię, gdy mi się nudzi.

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