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ň
|
Zaslal: 30. říjen 2011, 21:18:03 Předmět: |
|
|
perry napsal: |
Já neřikám, že ne .. jen že si přiděláváš práci 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 |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 31. říjen 2011, 20:37:15 Předmět: |
|
|
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... ) _________________
|
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 31. říjen 2011, 21:20:26 Předmět: |
|
|
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... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Al
Založen: 23. 10. 2007 Příspěvky: 196
|
Zaslal: 7. listopad 2011, 23:34:44 Předmět: |
|
|
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 |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 7. listopad 2011, 23:59:31 Předmět: |
|
|
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 |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 21. listopad 2011, 15:06:18 Předmět: |
|
|
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 |
|
|
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 21. listopad 2011, 20:30:33 Předmět: |
|
|
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 |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 21. listopad 2011, 21:27:45 Předmět: |
|
|
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 |
|
|
Crypton
Založen: 14. 05. 2009 Příspěvky: 306 Bydliště: The Void
|
Zaslal: 21. listopad 2011, 22:38:22 Předmět: |
|
|
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 _________________
|
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 22. listopad 2011, 00:20:53 Předmět: |
|
|
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 |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 22. listopad 2011, 00:25:34 Předmět: |
|
|
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 |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 22. listopad 2011, 10:08:53 Předmět: |
|
|
Róbustně to jde vyřešit vždy.
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... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
Yossarian
Založen: 28. 07. 2007 Příspěvky: 274 Bydliště: Šalingrad
|
Zaslal: 22. listopad 2011, 17:10:42 Předmět: |
|
|
sockety jsou z pohledu programatora plne duplexni, tzn. muzes zaroven prijimat i vysilat. |
|
Návrat nahoru |
|
|
VODA
Založen: 29. 07. 2007 Příspěvky: 1721 Bydliště: Plzeň
|
Zaslal: 22. listopad 2011, 18:09:08 Předmět: |
|
|
Já si to myslel. Díky.
Snad to dám dohromady... _________________ Opravdovost se pojí s trýzní... |
|
Návrat nahoru |
|
|
TeaTime
Založen: 17. 06. 2011 Příspěvky: 264
|
Zaslal: 23. listopad 2011, 18:54:56 Předmět: |
|
|
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 |
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í . Mylsel jsem, že jsem to před nahrátím na github odmáznul . Tak já to myslel pro VODu spíš jako ukázku toho, jak ty sockety můžou fungovat... |
|
Návrat nahoru |
|
|
|