.[ ČeskéHry.cz ].
RTS :: Blocking x Non-blocking sockety
Jdi na stránku Předchozí  1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Sítě
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 30. říjen 2011, 21:18:03    Předmět: Odpovědět s citátem

perry napsal:
Já neřikám, že ne Smile.. jen že si přiděláváš práci Smile když by jsi se místo toho mohl věnovat Solertii

Té se věnuji, sice teď jí z prvního místa sesadil PRJ5, ale třeba o víkendu jsem navrhoval nějaké části osady a přemýšlel jsem o nějakých puzzlech (dokonce jsem vymyslel jeden, který se mě samotnému nepodařilo vyřešit, přestože řešitelný byl - takže ho určitě použiji, protože natáhne trochu herní dobu)...

Ale multiplayer mě vždy zajímal, takže proč neudělat jako bokovku nějakou jednoduchou rts hru, kterou rovněž odevzdám jako semestrálku z UPS?
Alespoň budu mít nějaký konečný termín dokončení (odevzdání) a bude mě to nutit dodělat.
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 31. říjen 2011, 20:37:15    Předmět: Odpovědět s citátem

A co takhle udělat tu semestrálku na enginu Sollertie? Jen by si oddálil kameru a přidal ten síťový blivajz, který by se ti pak mohl hodit kdyby jsi se třeba rozhodl přidat do Sollertie nějaký coop multiplayer.

A můžeš to udělat ve stylu Shogun: Total War, tj. hordy Zojí, vyrenderovaných instancingem. (Just kidding... Laughing)
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 31. říjen 2011, 21:20:26    Předmět: Odpovědět s citátem

Nouma napsal:
A co takhle udělat tu semestrálku na enginu Sollertie? Jen by si oddálil kameru a přidal ten síťový blivajz, který by se ti pak mohl hodit kdyby jsi se třeba rozhodl přidat do Sollertie nějaký coop multiplayer.

Jo to je v plánu. Jen si vymyslím nějaký způsob reprezentace mapy, možná použiji to ze Sollertie a jinak chci jen přidat síťovou komunikace a finito... Wink
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Al



Založen: 23. 10. 2007
Příspěvky: 196

PříspěvekZaslal: 7. listopad 2011, 23:34:44    Předmět: Odpovědět s citátem

satik napsal:
U nas mame tohle reseny tak, ze kazdej klient ma svoje vlakno jen na komunikaci a kdyz od klienta prijde message, tak se ulozi do jedny velky fronty zprav od klientu (samozrejme v musi bejt lockla) a ta se pak zpracovava v mainloopu (v kazdem serverovem framu).

Tohle je podle mě klasický přístup. Snad i v knihách to tak doporučují. Cituji, co psal satik, aby to tu nezapadlo v jiné diskuzi.

VODA napsal:
Pořád mi nejdou dohromady ty dva pojmy Realtime Strategy a Blocking sockets...

Jde to, stačí používat hlavu. Nesmíš nutit soket, aby ti dal nějaká data, která zatím nemá. Pokud budeš ze soketu číst jen, když bude něco pro tebe mít, nebude ti program blokovat. U odesílání dat je to trošku jiná věc, ale pokud nebudeš posílat moc velká kvanta dat, tak blokování soketem při odesílání dat nebude prakticky nijak vadit. Nejjednodušší řešení je právě to, co psal satik. Neříkám, že je to lepší než neblokující sokety, ale je to fakt jednoduché a běžně používané v aplikacích, kde není připojeno současně moc klientů (třeba v DirectConnect serveru je klientů mraky, tam by to pomocí vláken moc chytré řešení nebylo).
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 7. listopad 2011, 23:59:31    Předmět: Odpovědět s citátem

Oki.

A jak bych tedy měl řešit server?
Abych pravdu řekl, tak nevím jak se to běžně dělá, ale co mě napadlo, tak na straně serveru mi poběží "server", ten se bude starat o připojování klientů a vytváření her...hra v tomto případě bude vlákno, které bude spravovat komunikaci mezi klienty, kteří spolu chtějí hrát (+ synchronizace, atp.). No a ve hře (objektu hry) bude akorát fronta událostí/příkazů (třeba posun jednotky kam a jakým směrem - interpolace) a ta se bude zpracovávat a na jejím základě se budou přeposílat zprávy klientům... samozřejmě bude server (hra) kontrolovat logiku hry (kdo vítězí, atp.).
Je to tak možné nebo se to obvykle dělá úplně jinak?
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 21. listopad 2011, 15:06:18    Předmět: Odpovědět s citátem

Vzhledem k tomu, že mi nikdo nepotvrdil ani nevyvrátil, to co jsem tu psal posledně, tak jsem musel začít kódit po svém...

Akorát jsem narazil...
Pracuji teď na připojování klienta k serveru, získání her ze serveru, založení nové hry připojení do hry, atp.
Když jsem použil neblokovací mód socketů, a chtěl jsem zachovat animaci a odezvu klientského GUI (zatím menu), tak byl kód strašně rozlezlej a byla tam tuna věcí, které jsem musel hlídat (různé timeouty, apod.)...
Pak jsem si řekl, že bych síťovou komunikaci mohl dát do vlastního vlákna, použít blokovací režim socketů a z gui (synchronizovaně) volat požadavky jako třeba Login, Quit a podobně. To sice funguje, kód je kompaktní, ale podvědomě mi to nesedí...a hlavně nevím, jakým způsobem pak budu dělat server. Nabízí se možnost použít stejný princip pro každého připojeného klienta, jenže momentálně nedokáži vymyslet, jak dvě vlákna s klienty spojit do hry (logicky vzato vím, ale spíš aby to nebyla prasečina)...
Už se s tím trápím 4. den a nějak dostávám depresi. Ale chci to vyřešit, protože tím se mi otevřou další možnosti vývoje (multiplayer atp.).

Nevíte o nějaké jednoduché hře (tcp/ip klient-server), ze které bych mohl něco vykoukat? Nějak sem z pana Googla nic nedostal (něco málo jo, ale většinou nepoužitelné), statečně zapírá...
Byl bych vám moc zavázaný, vzhledem k tomu, že zbývá necelých 5 týdnu do konce a já toho mám nad hlavu...

Dík.
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 21. listopad 2011, 20:30:33    Předmět: Odpovědět s citátem

Ahoj, já to teda řeším tak, že mám normálně neblokující režim socketů a mám vytvořenou třídu Socket, která se stará o správu jednoho socketu. V té třídě socket mám statický seznam všech Socketů a v hlavní smyčce jednou za čas volám jejich metodu onIdle (lze tak měnit, jak často se ta metoda volá - tím můžeš přesouvat výkon mezi síťovou odezvu a ostatní části hry). Když Socket narazí na nějakou síťovou událost (navázané spojení, odpojení, příjem zprávy etc.) oznámí to pomocí interfacu třídě, která Socket "vlastní".

Jestli tě zajímají zdrojáky, jsou tady: https://github.com/KosarJ/Cpp-multiplatform-networking. Až to budu implementovat do svého dalšího projektu, budu to asi ještě hodně refaktorovat, ale s určitými specifickými rysy to funguje dobře.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 21. listopad 2011, 21:27:45    Předmět: Odpovědět s citátem

Dík, už jsem na to koukal dříve, když jsi tu uváděl link. Akorát si nějak nedokáži představit herní smyčku...ale asi to bude tím, že po 4 dnech programovaní sítí jsem úplně vymaštěnej...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crypton



Založen: 14. 05. 2009
Příspěvky: 306
Bydliště: The Void

PříspěvekZaslal: 21. listopad 2011, 22:38:22    Předmět: Odpovědět s citátem

TeaTime napsal:
...budu to asi ještě hodně refaktorovat...

https://github.com/KosarJ/Cpp-multiplatform-networking/blob/master/Socket.cpp napsal:
static int t = 0;
t++;
if(t==5*2*60) // každých 5 minut zavřeme a zase otevřeme server

No to budeš, a né že asi Laughing
_________________
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 22. listopad 2011, 00:20:53    Předmět: Odpovědět s citátem

Abych pravdu řekl, tak některé věci mi tam připadají dost divoké. Ale to je teď jedno...
Spíš bych rád rešil, jak robustně vyřešit to své...
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Ladis



Založen: 18. 09. 2007
Příspěvky: 1533
Bydliště: u Prahy

PříspěvekZaslal: 22. listopad 2011, 00:25:34    Předmět: Odpovědět s citátem

Pokud to nepůjde vyřešit robustně, tak to udělej nerobustně. Stačí, když to bude dostatečně oddělené od zbylého kódu hry, pak to můžeš v budoucnu libovolně předělávat. Na vlastní robustní řešení bys potřeboval dostatek zkušeností v dané oblasti, a to teď nemáš.
_________________
Award-winning game developer
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 22. listopad 2011, 10:08:53    Předmět: Odpovědět s citátem

Róbustně to jde vyřešit vždy. Wink

Tak jedna otázka ohledně socketů, kterou jsem nikde nedohledal. Mohu posílat najednou data jak na straně serveru, tak na straně klienta? Nebo se musí střídat? Typoval bych, že když na socket pošlu nějaká data z obou stran, tak po úspešném odeslání se data objeví na druhém konci ke čtení (něco jako stream - na linuxech mám takové tušení, že je socket jako jakýkoliv jiný descriptor)...
Ptám se kvůli tomu, že server se rozhodne updatovat klienty, ale zároveň klienti chtětí posílat data na server...protože jestli na sebe musí čekat, tak by to bylo u RTS pěkně na pytel...resp. už vidím ten automat... Shocked
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Yossarian



Založen: 28. 07. 2007
Příspěvky: 274
Bydliště: Šalingrad

PříspěvekZaslal: 22. listopad 2011, 17:10:42    Předmět: Odpovědět s citátem

sockety jsou z pohledu programatora plne duplexni, tzn. muzes zaroven prijimat i vysilat.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
VODA



Založen: 29. 07. 2007
Příspěvky: 1721
Bydliště: Plzeň

PříspěvekZaslal: 22. listopad 2011, 18:09:08    Předmět: Odpovědět s citátem

Já si to myslel. Díky.

Snad to dám dohromady... Sad
_________________
Opravdovost se pojí s trýzní...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 23. listopad 2011, 18:54:56    Předmět: Odpovědět s citátem

Crypton napsal:
TeaTime napsal:
...budu to asi ještě hodně refaktorovat...

https://github.com/KosarJ/Cpp-multiplatform-networking/blob/master/Socket.cpp napsal:
static int t = 0;
t++;
if(t==5*2*60) // každých 5 minut zavřeme a zase otevřeme server

No to budeš, a né že asi Laughing


No to jsem tyhle třídy používal v nějakým programu, kterej už byl stejně tak sprasenej, že jsem si nedělal žádný ambice tam řešit nějaký dělení zodpovědností Very Happy. Mylsel jsem, že jsem to před nahrátím na github odmáznul Very Happy. Tak já to myslel pro VODu spíš jako ukázku toho, jak ty sockety můžou fungovat...
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> Sítě Časy uváděny v GMT + 1 hodina
Jdi na stránku Předchozí  1, 2, 3  Další
Strana 2 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna