Multitasking w programowaniu - jak to działa?

0

Witam,
moze to będzie najgłupsze pytanie świata, ale jak to jest z multitaskingiem w programowaniu? Nie wazne w jakim języku, niech to będzie php perl czy cpp. Jezeli kod jest czytany z góry do dołu to jakim cudem może za jednym zamachem chmurka iśc w lewo a postać w prawo a do tego zachodzi słońce? Rozumiem że to nie dzieje się do końca w tym samym momencie, (procesor tak szybko pracuje ze wydaje nam się to w "jednym czasie"), ale jak to wygląda pod względem programistycznym?

0

Jeśli chodzi o grafikę, to w dużym uproszczeniu, wszystkie elementy można rysować jeden po drugim do bufora, a gdy już wszystko jest gotowe, wyświetla się go na ekranie.

2

Jezeli kod jest czytany z góry do dołu to jakim cudem może za jednym zamachem chmurka iśc w lewo a postać w prawo a do tego zachodzi słońce?

Zależy od kodu.
Jeśli wygląda tak:

chmurka.x--;
postać.x++;
słońce.y--;
rysuj();

to nie widzę problemu.

A taki prawdziwszy multitasking to operowanie na wątkach. Wątek to jakby osobne, niezależne miejsce wykonywania się tego samego programu.

Pod względem technicznym poszczególne wątki i procesy (inne programy) wykonywane są na zmianę (przy czym to przełączenie odbywa się tak 10 do 100 razy na sekundę, wcale nie tak kosmicznie często jakby się wydawało), albo naprawdę jednocześnie na osobnych rdzeniach procesora, jeśli procesor jest wielordzeniowy (albo jest kilka procesorów).
W rzeczywistości oba sposoby działają na raz, np. są 4 rdzenie i na nich rozłożone jest sto wątków różnych procesów.

0

Zastanawialem sie nad takim algorytemem:

Gra typu mario:

Słoneczko przesuwa sie o 1 px w prawo, a w tym samym momencie:

  1. Grzybek prusza sie 1px w prawo
  2. Gracz naciska klawisz "->".
  3. (tutaj będzie smiesznie) if (pozycja.gracza == poz();) { wyskakuje roslinka z ziemi};
  4. Quicksave

Gracz widział wszystko jakby się stało w jednym czasie, ale szczególnei chodzi mi o "nasłuchawianie". Oprócz tego że to wszystko się dzieje to jeszcze reaguje na zachowanie gracza. Tzn w tle jest odpalony cały czas jakiś proces? Bo gdybyśmy to zrobili w pętli if to program czekałby na jej zakończenie. A jeżeli gracz by nigdy nie nacisnał strzałki w prawo to program nie mogłby nigdy przejśc do nastepnego etapu.

To dla mnie skomplikowane.

0

if nie jest pętlą.
tak, takie rzeczy robi się w pętli.
nie trzeba czekać na klawisz, są funkcje sprawdzające czy naciśnięto klawisz, bez czekania.

samo naciśnięcie klawisza wywołuje tzw. przerwanie, czyli właśnie przerwanie pracy programu, cokolwiek by nie robił, system operacyjny zapisuje sobie gdzieś-tam że naciśnięto klawisz taki a taki, po czym wykonanie wraca do przerwanego programu.
program otrzyma informację o naciśnięciu klawisza w tzw. kolejce komunikatów.

0
Azarien napisał(a):

if nie jest pętlą.
tak, takie rzeczy robi się w pętli.
nie trzeba czekać na klawisz, są funkcje sprawdzające czy naciśnięto klawisz, bez czekania.

Moglbys przyblizyc?
Bo jak kiedys pisalem snakea to oczekiwanie na klawisz zrobilem w oddzielnym watku xd

0

Czyli:

if(global $a == 5){ echo "costam";}

to jezeli w którym kolwiek miejscu mojego programu (nawet 2000 linijek dalej) $a = 5 to sie wykona ten kod? jezeli tak to jak dlugo informacja o tym if'ie jest przechowywana w pamięci? Jeżeli mówimy o wątkach, czy w php'ie one występuje? Jak wygląda ich użycie?

1

Jezeli kod jest czytany z góry do dołu to jakim cudem może za jednym zamachem chmurka iśc w lewo a postać w prawo a do tego zachodzi słońce?

Tobie się wydaje, że tak jest, bo bazujesz na tym co widzisz. Rzeczywiście, wszystko jest rysowane tak jakby w jednym momencie (przeważnie nie da się zaobserwować tych małych różnic), ale logika jest wykonywana pomiędzy rysowaniami. Rysowanie i logika gry są całkowicie rozdzielone. (W uproszczeniu) Najpierw wykonuje się po kolei to co ma się poruszyć i wszystko co zalicza się do logiki, a potem na ekran jest to wyświetlane. Ogólnie to odpowiedź dla Ciebie najlepsza będzie: Nie ma tak, że rysowanie następuje po każdej operacji, przez co nie można ich zaobserwować z osobna.

2

Mario to akurat prymityw (jeśli chodzi o tego z Pegasusa); Ta gra nie jest wielowątkowa, bo o wątkach pewnie jeszcze nikt wtedy nie myślał, a co dopiero żeby je zastosować;

Pewnie większość gier z Pegasusa (nie powiem że wszystkie, bo tego nie wiem) działają na tej samej zasadzie co jednowątkowe programy, coś jak pętla komunikatów w WinAPI; Nic nie dzieje się naraz, każda funkcja wykonywana jest po kolei; w pętli sprawdzany jest stan klawiszy i wykonywane są odpowiednie dla nich operacje, a dodatkowo pozostałe, które działają niezależnie od ruchów gracza;

Dzięki jednowątkowości tych gier i słabych, powolnych (na dzisiejsze czasy) procesorów w większości gier można było zaobserwować lagi, przy dużej liczbie ruchomych elementów na ekranie; Każdy z nich obsługiwany był po kolei, stąd procesor nie wyrabiał, aby wszystko zdążyć poruszyć i przemalować; To nie były typowe lagi, tylko całkowite spowolnienie gry, bo dany element nagle nie przeskakiwał na ekranie (po prostu wszystko ruszało się wolniej);

To dla mnie skomplikowane.

Nikt nie powiedział, że pisanie gier jest rzeczą trywialną; A stworzenie takiej gry jak Mario, Contra czy Micro Machines na maszynę taką jak Pegasus, w obecnych na tamte czasy warunkach było mistrzostwem świata.

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