Autor Wątek: 2 lub wiecej watków wykonujacych prawie to samo: SDL  (Przeczytany 5906 razy)

Offline micran

  • Użytkownik
    • Micran - Warsztat

# Sierpień 08, 2008, 12:23:43
W swoim programie natrafiłem na problem.
Oto i on:
Tworze nowy watek:
//kod znajduje sie w funkcji
SDL_Thread *nowy_pocisk;
nowy_pocisk=SDL_CreateThread((int (*)(void *))_pocisk,(void *)numer);
Nastepnie chce 2 raz wywołać tą samą funkcje do tworzenia watku i watek nie zostaje utworzony.
Dlaczego? Jak to zrobić zeby działało??

Efekt mozna zaobserwować tutaj:
Q - strzał
Strzałki = poruszanie sie
Wersja 0.5% My little tanks
« Ostatnia zmiana: Sierpień 08, 2008, 12:33:17 wysłana przez micran »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kosai_

  • Użytkownik
    • devlog

# Sierpień 08, 2008, 12:37:31
po co ci wątki do pocisków? tylko będziesz miał problemy z synchronizacją...

Offline benethorpl

  • Użytkownik

# Sierpień 08, 2008, 12:55:15
jak na mnie to nie wina kodu startującego wątki, ale ten link jakoś nie chce działać u mnie;)

BTW robiąc wątek dla każdego pocisku przy większej strzelaninie wykończysz procka ;) Lepiej zrób jeden wątek, który obsłuży wszystkie pociski

Offline micran

  • Użytkownik
    • Micran - Warsztat

# Sierpień 08, 2008, 13:08:01
Pocisków bedzie max 2000 i tak nawet nie wiem czy polowa bedzie jednoczesnie na planszy.
Jak to zrobić.

@benethorpl: dziwne u mnie działa  ;) Musisz mieć Windowsa.

Offline SirMike

  • Użytkownik
    • SirMike's Techblog

# Sierpień 08, 2008, 13:13:41
Pocisków bedzie max 2000 i tak nawet nie wiem czy polowa bedzie jednoczesnie na planszy.

Dobrze sie czujesz? Daj jeden racjonalny powod na to, ze potrzebujesz wlasnie watkow.

Offline revo

  • Użytkownik

# Sierpień 08, 2008, 13:13:55
Pocisków bedzie max 2000 i tak nawet nie wiem czy polowa bedzie jednoczesnie na planszy.
Jak to zrobić.

Robisz sobie klasę Pocisk i trzymasz listę/tablicę pocisków. Teraz przechodzisz po tej liście/tablicy i je uaktualniasz. Robienie tylu wątków nie jest dobrym pomysłem.

Offline BrutalComputer

  • Użytkownik

# Sierpień 08, 2008, 14:08:08
Jak kiedyś robiłem eksperymenty z dwoma wątkami i pętlą while(1) (na x86), to wątki przełączały się co ok. 1 sekundę.
Tworzenie wątków opłaca się praktycznie tylko do obsługi sieci / wielu rdzeni.

Offline micran

  • Użytkownik
    • Micran - Warsztat

# Sierpień 08, 2008, 15:15:36
@SirMike :Dobrze sie czuje. Racjonalny powód. Nie mam zamiaru oczekiwać aż sie uaktualni pozycja i dopiero renderować gra ma mieć >50 fps a nie 5
@revo:Wszystko sie zgadza oprocz ostatniego zdania z tym co mam. Teraz probuje z jednym pobocznym wątkiem.
@BrutalComputer : Na moim kompie z przed 7 lat watki sie szybko przełaczaja. Nie musi być dodatkowe rdzenie. 2 rdzenie nie oznacza to ze moga być tylko 2 watki. A wogóle to nie dziwie sie ze tak zwalniało while(1) i nigdy jej nie konczysz spoko poprostu do konca swiata i jeden dzien dłużej.

Offline SirMike

  • Użytkownik
    • SirMike's Techblog

# Sierpień 08, 2008, 15:18:20
@SirMike :Dobrze sie czuje. Racjonalny powód. Nie mam zamiaru oczekiwać aż sie uaktualni pozycja i dopiero renderować gra ma mieć >50 fps a nie 5

No offence ale skoro bez watkow aplikacja renderuje Ci 5 fps to masz cos mocno kopniete :)
Sciagnij sobie Havoka (jest free dla zastosowan domowych) - tam masz piekne przyklady jak nalezy liczyc tor i zderzenia szybkich obiektow. Zadne watki do tego nie sa potrzebne.

Offline micran

  • Użytkownik
    • Micran - Warsztat

# Sierpień 08, 2008, 15:50:42
Czy obiekty sa szybkie napewno nie min to 1px na klatke. A to tylko przyklad podałem bo gra ma miec 50 fps a nie 5 fps. 5 fps jest tylko przykladem. Czy jest sens przed renderowaniem liczyc nowe pozycje skoro szybciej mozna to osiagnac w watku.
Juz sobie nieco poradziłem.

Offline Esidar

  • Użytkownik

# Sierpień 08, 2008, 16:03:59
@SirMike :Dobrze sie czuje. Racjonalny powód. Nie mam zamiaru oczekiwać aż sie uaktualni pozycja i dopiero renderować gra ma mieć >50 fps a nie 5

2000 pocisków to już się robiło w latach 90 :) i to na jednym wątku. Wątki tutaj nic Ci nie dadzą. Koszt przełączenia jednego wątku jest kilkakrotnie wyższy niż obsługa pocisku.
[qoute]
@BrutalComputer : Na moim kompie z przed 7 lat watki sie szybko przełaczaja.
[/quote]
Szybko nie oznacza "natychmiast" :) W kodzie brutala pewnie było "while(1){}" co zupełnie blokuje system. Generalnie system przełącza wątki wtedy gdy może ... w najlepszym przypadku 100x na sekundę. Ale koszt przełączenia wątku i tak jest bardzo wysoki.

Wogóle nie ma też sensu robić więcej wątków niż procesor ma rdzeni (teraz to 1-2 wątki... rzadziej 3-4). Procesor nie z gumy, nie rozciągnie się. W sekundę może zrobić tyle ile może :) Dołożenie kolejnych wątków, zamiast pomóc tylko spowolni wszystko. Przy 2000 wątkach to ci zaczną wychodzić takie kwiatki jak np. pocisk który się aktualizuje raz na 10 sek.

Cytuj
szybciej mozna to osiagnac w watku.
Nie będzie szybciej :) Jak już napisałem procesor nie z gumy, nowy wątek nie zwiększy mu zegara tylko dołoży pracy. Będzie "nie szybciej" tylko "później".


Offline Mormegil

  • Użytkownik
    • Moj dev blog

# Sierpień 08, 2008, 16:17:11
Czy jest sens przed renderowaniem liczyc nowe pozycje skoro szybciej mozna to osiagnac w watku.
Albo Cie zle zrozumialem, albo nie masz pojecia o czym piszesz.
Musisz liczyc nowe pozycje przed renderowaniem. Jezeli tego nie zrobisz, to dostaniesz statyczna klatke.

Jezeli chcesz wykorzystac wielowatkowosc do liczenia nowej pozycji to zrob sobie tablice obiektow i odpal ile tam chcesz watkow, liczacych nowe pozycje, kazdemu przekazujac jego wlasny fragment tablicy.

Imo jest to bezcelowe. Ja puscilem 16*16*16 obiektow, na jednym watku na Pentium D 3Ghz. Spokojnie wyrabial 30 fps w debugu, razem z renderowaniem tego w przestrzeni.

Ale koszt przełączenia wątku i tak jest bardzo wysoki.
Koszt przelaczania watku jest znikomy. Jedyne co trzeba zrobic to zaladowac rejestry procesora. Scheduller powinien miec kolejny watek zaraz pod reka, wiec czas jego wyszukania jest rowniez znikomy.
Co innego procesy. Przelaczanie procesow, kosztuje DUZO.
Niemniej masz racje, ze robienie wiecej watkow obliczeniowych niz jest rdzeni, napewno nie przyniesie zadnego zysku. A przy duzej ilosci aktywnych watkow, koszt ich przelaczania moze stac sie istotny. Z tym, ze nadal duzo gorsza bedzie ich synchronizacja (mutexy itp.).

A watek while(1); rzadko sie przelacza, bo jest caly czas aktywny, w przeciwienstwie do wiekszosci watkow w systemie.

Offline skovron

  • Użytkownik
    • Healthbar Games

# Sierpień 08, 2008, 16:26:19
Oj widać micran, że masz blade pojęcie o funkcjonowaniu wątków. Jeśli korzystasz z dwóch/trzech wątków w taki sposób, że na jednym "chodzi" główna aplikacja/gra, natomiast kolejny wykorzystujesz do np. ładowania danych ("w tle") to możesz na tym zyskać. Chociaż i tutaj są sytuacje, kiedy doładowywanie w małych porcjach na głównym wątku okażą się lepszym rozwiązaniem. W tej sytuacji czas potrzebny na "przełączenia" procesora pomiędzy wątkami jest mały w stosunku do całego czasu potrzebnego powiedzmy na wyrenderowanie kolejnej klatki.
Natomiast jeśli odpalisz na raz 2000 wątków to tak jak już wspominali poprzednicy - w każdej klatce procesor będzie potrzebował czas_przelaczania_watku * 2000 jednostek czasu na samą "zabawę" z wątkami. To już nie jest takie tanie i naprawdę może się okazać, że (jeśli obliczanie pozycji pocisków nie będzie zbyt skomplikowane) podczas przeliczania tych pocisków procesor przez 80% czasu będzie obliczał pociski a przez 20% przełączał wątki.

Jak już koniecznie potrzebujesz wątków (może chcesz/wolisz/lubisz) to zrób sobie jeden wątek, który ciągle w pętli będzie przeliczał dostępne aktualnie pociski a główny je renderował ale moim zdaniem w tym wypadku szkoda zachodu (synchronizacja, przekazywanie danych eh..)

Offline benethorpl

  • Użytkownik

# Sierpień 08, 2008, 17:07:16
@benethorpl: dziwne u mnie działa  ;) Musisz mieć Windowsa.

Tak, mam Windowsa:P Rano nie działało, teraz działa:P

Offline Wiadomo

  • Użytkownik

# Sierpień 08, 2008, 17:08:05
2000 pociskow czy czego tam i kazdy na osobnym watku? LOL? No spoko, moze jak Intel albo AMD wprowadzi procki 2000rdzeniowe to bedziesz mial wzrost wydajnosci ;-] Ale tak to tylko odnotujesz spadek. Lepiej bedzie gdy zrobisz sobie np. liste tych pociskow i jeden watek bedzie sie nimi bawil. Mozesz zrobic sobie testy =]

Ale to Twoje podejscie jest dla mnie tak jakbym chcial przyspieszyc dodawanie i zrobic kazde dodawanie w osobnym watku, co bedzie WOLNE.