Autor Wątek: Obiektowosc - co bedzie obiektem itp...  (Przeczytany 10175 razy)

Offline Steel_Eagle

  • Użytkownik

# Styczeń 14, 2007, 23:55:18
Kolejny z Newbie-Spree :) Nie bede z Toba polemizowal do poki sie nie ochloniesz ;) Pozdr

Offline Mr. Spam

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

zerlo

  • Gość
# Styczeń 15, 2007, 10:34:05
Zainteresowanym proponuję obejrzeć podobny mechanizm messagy w biliotece CEL http://sourceforge.net/project/showfiles.php?group_id=31572, dobry przykład. Polskie fora są dość specyficzne, ponieważ każde wyposażone jest w osoby "zrobiłem dwa programy na kompo i grę na komórkę o piesku filusiu więc wiem wszystko". Ludzie mogą co najwyżej stać w miejscu lub cofać w taki sposób. Mechanizm messagy jest wdrożony i używany od wielu lat w wielu różnych projektach więc o czym wogóle jest ta dyskusja ? Narazie o tym ze go nie ma mimo iż jest ...

Offline Steel_Eagle

  • Użytkownik

# Styczeń 15, 2007, 11:13:28
3 Rzeczy  :)
1) Mechanizm messagy jest wdrożony i używany od wielu lat w wielu różnych projektach więc o czym wogóle jest ta dyskusja ? Narazie o tym ze go nie ma mimo iż jest ...[Tak mechanizm messagow jest wdrozony w grach i ma swoje atuty, wiekszosc na tym forum napisala n-generacji takiego  :) Dobry art o takim systemie jest perelkach. Ale nie jest to jedeny swiety sluszny sposob na ktory bedziemy nawracac ogniem i mieczem. Ja jednak jestem za czestszym uzyciem polimorfizmu. Jezeli ktos ma dostep do serii Unreal Tournament, niech sam zobaczy jak szybko i elegancko tam to rozwiazali  :)

2) Co do toru dyskusji to dostales za mylne pojecie obiektowosci. I jakby co powinienes troche wiecej dowiedziec sie na ten temat i bardziej uwazac co piszesz  :)

3) Polskie fora są dość specyficzne, ponieważ każde wyposażone jest w osoby "zrobiłem dwa programy na kompo i grę na komórkę o piesku filusiu więc wiem wszystko". Ludzie mogą co najwyżej stać w miejscu lub cofać w taki sposób.Hmm nawet nie nie znasz a mowisz takie rzeczy  :) To jest objaw dwoch rzeczy: hipokryzji i braku argumentow do dalszej sensownej dyskusji. Pamietaj ze to bardzo nieladnie z Twojej strony i mam nadzieje ze sie poprawisz  ;)

Widzisz ja tez mam swoja teorie... Na Polskich forach zawsze istnieje grupa nowoprzybylych, ktorzy za wszelka cene chca udowodnic innym swoja wielkosc... I dla mnie moze tak byc, dopoki nie zaczna mylic sie w tym co pisza  :) Stary mniej nerwow, wiecej kultury i wyrozumialosci na forum. Jestesmy juz dorosli i nie zachowujmy sie jak dzieci ok? Nikt tutaj nie chce Cie pogrzebac, tylko pokazuje bledy w Twoim mysleniu ;) Gdybys mial wiecej samokrytyki powiedzialbys ze sie przejezyczyles, a tak za dwa posty bedziesz jechal mi po siostrze i matce  ;D A ja Zidane lubie  :)

zerlo

  • Gość
# Styczeń 15, 2007, 11:35:19
ad.1 Wreszcie odrobiłeś zadanie domowe. Daleko mi od nawracania do jednego słusznego musiałbym być szczery gdzie to mam co kto używa, a nie chcę ;) Chodziło mi o to, że po co stać pod wieżą eiffla i dyskutować czy taka konstrukcja mogła by stać czy by się zawaliła ?
ad.2 Twoje prawo do pozostania w takim przekonaniu. Uwzględnij też to że post do którego się odnosisz był ogólnym głosem w dyskusji skierowanym do wszystkich, o messagach nie koniecznie polemizuję akurat z tobą.
ad.3 Ciebie nie znam ale znam życie ;) nie pierwszy i nie ostatni raz.... nie powtarzaj argumentu "nowoprzybyły" wiem że jedyne co masz w rękach ale i tu się mylisz :) Tylko że co to za różnica...

Offline Charibo

  • Redaktor

# Styczeń 15, 2007, 13:00:40
Truman: wracajac do twojego przykladu z wieza Eiffla. Zalozmy ze jestes architektem i zastanawiasz sie jak zbudowac biurowiec. Uzyjesz konstrukcji z rurek i metalu z zrobisz taki biurowiec ze nie daloby sie tam pracowac? Co chce powiedziec: system komunikatow nadaje sie do waskiego przedzialu zastosowan - pomysl troche: jesli wszystkie obieky komunikowalyby sie w ten sposob, gra bylaby strasznie wolna i tetris cialby sie na hi-endowym kompie :)

ps.
Cytuj
nie powtarzaj argumentu "nowoprzybyły"
ja tez go powtorze. Moze pochwalisz sie swoimi Quake'ami, Battlefieldami 8 czy innymi Unrealami 2006 i 1/2?

zerlo

  • Gość
# Styczeń 15, 2007, 13:20:01
Truman: wracajac do twojego przykladu z wieza Eiffla. Zalozmy ze jestes architektem i zastanawiasz sie jak zbudowac biurowiec. Uzyjesz konstrukcji z rurek i metalu z zrobisz taki biurowiec ze nie daloby sie tam pracowac? Co chce powiedziec: system komunikatow nadaje sie do waskiego przedzialu zastosowan - pomysl troche: jesli wszystkie obieky komunikowalyby sie w ten sposob, gra bylaby strasznie wolna i tetris cialby sie na hi-endowym kompie :)

ps.
Cytuj
nie powtarzaj argumentu "nowoprzybyły"
ja tez go powtorze. Moze pochwalisz sie swoimi Quake'ami, Battlefieldami 8 czy innymi Unrealami 2006 i 1/2?

Wspomniane polskie fora cierpią 2 choroby: 1) nieczytanie wszystkiego dokładnie 2) dyskutowanie nad swoją  wyższością zamiast na temat

Odnosząc sę do punktu 1:
Cytat: Charibo
pomysl troche: jesli wszystkie obieky komunikowalyby sie w ten sposob, gra bylaby strasznie wolna
pozwolę ułatwić Ci zadanie przypominając co napisałem:
>>> "końcowe obiekty gry (jak. np żołnierze) powinni się komunikować z resztą obiektów na podobnej do sieci zasadzie (...) Natomiast co do głębszego kodu wymagającego większej prędkości polecam mechanizm COM/Corba(...)"
A dla jeszcze głebszego kodu:
>>>"Z reguły lepiej jest zrobić dzidziczenie niż jakieś sztywne dowiazania do innych obiektów. "

Co do punktu 2. Autor tego postu pytał o to jak sobie poradziliśmy z pewnymi rzeczami w praktyce więc po prostu opisałem scieżkę ktora mi pomogła w zagadnieniu. Wiem że niektórzy muszą leczyć kompleksy ale nie muszą odrazu przekonywać o niskiej jakości moich rozwiązań zanim sami ich wczesniej nie sprawdzili, bo one działają w praktyce i nikomu jeszcze komputer od tego nie wybuchł. Punkt drugi tyczy się rónież post scriptum. Licytację na wyższość pozostawiam innym, którzy i tak nie mają nic ciekawszego do roboty.

Pozdro :)

zerlo

  • Gość
# Styczeń 15, 2007, 13:51:37
Nu dawaj. Zdefiniuj ten ,,głębszy kod'' do którego chcesz użyć CORBA.

Offline Charibo

  • Redaktor

# Styczeń 15, 2007, 13:54:10
System komunikatow nie jest wcale rozwiazaniem niskiej jakosci - co wiecej, jest bardzo przydatny - z tym sie zgadzam. Nawet mam taki system w swoim rdzeniu. Jednak, mysle ze "koncowe obiekty", wezmy twoich zolnierzy, nie powinny przesylac komunikatow do wszystkich obiektow w poblizu ze sie np. przemieszczaja -system oparty na komunikatach powinien byc zastosowany w waskim przedziale potrzeb, a i tak nalezy minimalizowac ilosc komunikatow - tutaj jest kwestia bardzo uwaznego planowania projektu.

zerlo

  • Gość
# Styczeń 15, 2007, 15:05:20
osobiście używam 4 rodzaje messagów ze względu na zasięg:
1. do konkretnego obiektu
2. do grupy obiektów wg nazwy
3. do grupy obiektow wg położenia w promieniu
4. rozgłoszeniowy dla wszystkich

Offline Steel_Eagle

  • Użytkownik

# Styczeń 15, 2007, 22:45:16
@Truman: ja nie dziwie sie ze akurat Tobie wydaje sie ze polskie fora sa trawione przez rozne choroby  ;) Nie mam o czym z Toba dyskutowac. Nie podejmujesz polemiki komunikaty-polimorfizm w grach, o obiektowosci tez nie pogadamy, wiec nie bede Ci odpowiadl w tym temacie  :) I pamietaj ze dobra komunikatywnosc to jedno z podstawowych wymagan dla programisty  :)
« Ostatnia zmiana: Styczeń 15, 2007, 23:00:49 wysłana przez Steel_Eagle »

zerlo

  • Gość
# Maj 01, 2007, 10:37:31
Nie chce zakladac nowego tematu bo pytanie dotyczy tego samego zagadnienia co pierwszy post, ale jest odrobinke bardziej konkretne ( czyt. nie "jak zrobic wszystko" tylko "jak to zrobic" ). Po napisania kilku linijek kodu pewne rzeczy sie wyjasnily, a jeszcze inne sciagnalem z wypowiedzi forumowiczow. Jednak z tym mam ciagle problem. Zastanawiam sie gdzie umiescic metode rysowania obiektu.
Mam SMain, SGfx i oHero.
SMain jest odpowiedzialny za wszystko oprocz spraw zwiazanych z grafika: tworzy, usuwa, szuka i przetrzymuje obiekty, w nim znajduje sie takze glowna petla gry i metoda sprawdzajaca kolizje.   
SGfx zajmuje sie wczytywaniem grafiki, jej przechowywaniem, usuwaniem, spelnia role menadzera zasobow, a takze "obsluga" SDL ( wlaczanie/wylaczanie, ustawianie itp.. ).
oHero to gracz. Przechwouje swoje wspolrzedne, uchwyt sprite'a, ma metode odpowiedzialna za jego ruch ( sprawdzanie jakie klawisze sa nacisniete  ).
Jako, ze obiekty sa przechowywane w wektorze to wszystkie operacje wygladaja tak ( na przykladzie ruchu ):
for ( int i = 0; i < vector_obj.size(); ++i )
{
 if ( vector_obj[ i ] != NULL )
 {
  vector_obj[ i ].input_handle();
 }
}
       

Gdy dam metode odpowiedzialna za rysowanie do oHero bedzie trzeba tylko odrobinke zmienic powyzszy kod:
...
vector_obj[ i ].input_handle();
vector_obj[ i ].draw();
...

Niestety takie rozwiazanie wymaga, aby oHero mial wskaznik na SGfx bo to tam przechowywane sa wszelkie grafiki i metody do ich obslugi. Gdzies czytalem, ze aby kod byl bardziej uniwersalny ("wielorazowy" ??) nalezy unikac duzej ilosci polaczen miedzy obiektami, a wiec to rozwiazanie ( mimo, ze wydaje mi sie naturalne ) odpada. 
Drugi pomysl to dac ta metode do SGfx i tutaj sa dwa warianty.

a)
SGfx::metoda rysujaca:
for ( int i = 0; i < pMain->vector_obj.size(); ++i )
{
 if ( pMain->vector_obj[ i ] != NULL )
 {
  draw( pMain->vector_obj[ i ] );
 }
}

SMain::petla glowna:
for ( int i = 0; i < vector_obj.size(); ++i )
{
 if ( vector_obj[ i ] != NULL )
 {
  vector_obj[ i ].input_handle();
 }
 pGfx->draw();
}
   

Rozwiazanie ma ta zalete, ze petla glowna jest krotsza i rysowanie jest wykonywane w SGfx co wydaje sie byc logiczne. Niestety wymaga, aby SGfx mial wskaznik na SMain.

b)
SGfx::metoda rysujaca:
{
 draw( argument_z_wskaznikiem_na_obiekt );
}

SMain::petla glowna:
for ( int i = 0; i < vector_obj.size(); ++i )
{
 if ( vector_obj[ i ] != NULL )
 {
  vector_obj[ i ].input_handle();
  pGfx->draw( vector.obj[ i ] );
 }
}
       
To rozwiazanie wydaje sie najbardziej poprawne, ale takze nie logiczne bo petla rysujaca znajduje sie w obiekcie SMain. Za to nie musze miec zadnych dodatkowych powiazan. Wystarcza wskaznik SGfx w SMain, ktory jest i tak oczywisty bo to SMain tworzy, niszczy i zarzadza podsystemami.

Mysle, ze najlepszym rozwiazaniem jest ostatni wariant. Moze jest "sztuczny" bo petla rysujaca nie znajduje sie w obiekcie odpowiedzialnym za obsluge grafiki, ale zapobiega tworzeniu sie "pajeczyny powiazan". Wole jednak zapytac Was o rade bo moje przekonania sa malo warte ( czyt. nie poparte doswiadczeniem, wiedza itp. ) POMOCY!

PS: Przepraszam za dlugosc posta, ale to pseudokod stucznie go wydluza. Tresci jest malo.

Z gory dzieki.
Pozdrawiam
 zerlo
« Ostatnia zmiana: Maj 01, 2007, 15:48:19 wysłana przez zerlo »

Offline Moriturius

  • Użytkownik

# Maj 01, 2007, 13:53:44
Najpierw od rzeczy:
Z tego co widzę stosujesz std::vector do przechowywania obiektów. Nie należy on do demonów wydajności więc na przyszłość radziłbym go unikać ;)

Teraz do rzeczy.
Możesz zrobić sobie jakiś manager obiektów które mają być wyświetlane. Może zrobić jakąś klasę Renderable albo coś w tym guście i potem do innych dodawać ją jako klasę bazową, albo jako jedną z klas bazowych [ w zależności od potrzeb ].

SGfx może być wyposażona w metodę rysującą obiekty Renderable, a `DisplayManager` może mieć wskaźnik na SGfx.
Takie rozwiązanie wydaje mi się niezłe ponieważ dodatkowo można zarządzać np. kolejnością wyświetlania obiektów, co jest szczególnie przydatne w grach 2D.

Offline nameczanin

  • Użytkownik
    • devlog

# Maj 01, 2007, 14:24:53
Najpierw od rzeczy:
Z tego co widzę stosujesz std::vector do przechowywania obiektów. Nie należy on do demonów wydajności więc na przyszłość radziłbym go unikać ;)

Hmm, jakis cos innego poza boostem?

Cytat: Moriturius
SGfx może być wyposażona w metodę rysującą obiekty Renderable, a `DisplayManager` może mieć wskaźnik na SGfx.
Takie rozwiązanie wydaje mi się niezłe ponieważ dodatkowo można zarządzać np. kolejnością wyświetlania obiektów, co jest szczególnie przydatne w grach 2D.
Nie tylko 2D, w 3D tez, np. kiedy mamy przezroczyste obiekty.

Teraz ode mnie:
1. Main to zbyt ogolna nazwa
2. metode render mozesz rownie dobrze umiescic w SGfx, jak i w oHero
3. na Twoim miejscu zrobilbym to tak, ze SMain wywoluje wszystkie "podsystemy", w tym przypadku np. SGfx (czemu nie CGfx?), a ten niech sobie znowu radzi sam. I to wlasnie SGfx niech rysuje wszystko co ma. Bylaby tam lista obiektow, ktore mialyby swoje metody render (wywolywane przez SGfx). Fajnie sie oprzec o dziedziczenie, ale domyslam sie, ze tu juz wiesz o co chodzi. Ja bym to tak rozwiazal :) Co wiecej - tak robilem i kodzilo sie dosc fajnie, szczegolnie, ze niektore obiekty rysuja sie inaczej.
4. z jakimis tam wskaznikami do pojedynczych obiektow klas sie nie baw, zastosuj singleton

Offline Porke

  • Użytkownik

# Maj 01, 2007, 14:38:21
[ot]

Mortirius: Co do tego vectora to masz na myśli ogólnie calą klasę czy tylko poszczególne operacje?? O ile mi wiadomo na pewno BARDZO nie opłaca się robić push_back i push_front tylko od razu resize albo inną metodę alokującą, ale nie wiem na ile operator[] jest wolniejszy od standardowego indeksowania... Pytam, bo vectora używam w większości projektów, często we fragmentach często wykonywanych (jak chociażby widzialność obiektów na mapie uaktualniana z każdym ruchem gracza) i nie wiem czy w przyszłości w vectorze miałbym szukać wąskiego gardła programu... Niemniej jednak ręczna alokacja jest dość podatna na wszelkie wycieki pamięci czego zresztą miałem "przyjemność" podczas pisania jednogo projektu doświadczyć (bo wtedy nie wiedziałem nic o STL'u  :P)

[/ot]

Offline Moriturius

  • Użytkownik

# Maj 01, 2007, 15:56:46
Najpierw od rzeczy:
Z tego co widzę stosujesz std::vector do przechowywania obiektów. Nie należy on do demonów wydajności więc na przyszłość radziłbym go unikać ;)

Hmm, jakis cos innego poza boostem?

Nie zajmowałem się boostem więc nie wiem, ale wszyscy go polecają ;)
Ja napisałem sobie własny szablon listy i nie narzekam
Cytat: Moriturius
SGfx może być wyposażona w metodę rysującą obiekty Renderable, a `DisplayManager` może mieć wskaźnik na SGfx.
Takie rozwiązanie wydaje mi się niezłe ponieważ dodatkowo można zarządzać np. kolejnością wyświetlania obiektów, co jest szczególnie przydatne w grach 2D.
Nie tylko 2D, w 3D tez, np. kiedy mamy przezroczyste obiekty.
Fakt, jescze pamiętam jak bawiłem się particlami i ogień zza ściany był rysowany przed nią... :D

@Porke: Nie wiem co tam go spowalnia. std::vector używam, ale tylko przy programowaniu aplikacji użytkowych. Tam gdzie trzeba wydajności lepiej napisać własną listę, albo [ o czym wspomniał nameczanin ] użyć np. boost'a