» »

[Flash] Vpliva hitrost CPU-ja na flash igro!

[Flash] Vpliva hitrost CPU-ja na flash igro!

shorvat ::

Lep pozdrav,

zanima me, če je hitrost izvajanja igre, napisane v Flash-u, odvisna od hitrosti procesorja. Recimo, da flash igro poganjam na dveh zelo različnih računalnikih istočasno in preko tipkovnice povsem identično pritiskam na tipke. Bo rezultat na obeh računalnikih popolnoma enak?

rad bi naredil realtime multiplayer igro (za 2 igralca). se pravi, oba igralca istočasno igrata in vidita kaj drugi igralec dela (nimam v mislih npr. šaha, ampak ploščadno furanje z avteki). če prihaja do različnih rezultatov na različno močnih kištah, potem take igre v Flash-u ni mogoče narediti.

za odgovor se že vnaprej zahvaljujem.

lp, sašo

#000000 ::

Ja igra vlogo cpu, oz. sem 99% v to. LP

Pyr0Beast ::

Špil žre tolk koker zahteva, če izbranih ciklov ne dobi (se pravi da je proc 100% zaseden) se bo igra upočasnila.

shorvat ::

Se pravi, da ni pomembno katero tehnologijo uporabim. Java, Flash, C#?!

Ob slabem oz. zelo zasedenem procesorju bo prihajalo do težav neglede na izbrano tehnologijo?!

Potem je potrebno prenos podatkov med clienti in strežnikom zasnovati tako, da ne bo prihajalo do različnih razpletov, različnega stanja na ekranu v klientih v določenem času.

V mislih imam tri različne varijante!

1. Na dedicated server (ki bo napisan v Javi) pošljem komande (podatke prebrane iz tipkovnice iz vseh klientov) in server poskrbi za dogajanje in trenutno stanje pošlje vsem konektanim klientom (v mojem primeru dvema).

2. Vsak klient poskrbi za dogajanje svojega lika in podatke o trenutnem stanju pošlje na server, ki razpošlje stanje na vse kliente. (po mojem mišljenju najslabša varijanta, prihaja do največjih razhajanj)

3. Izberem klienta, ki ima najkrajši ping in ta klient (na podlagi sprejetih ukazov iz ostalih klientov) skrbi za stanje v igri. Potrebne podatke, trenutno stanje pošlje na server, ki spet razpošlje to stanje na ostale kliente.

Kateri od teh treh načinov bi bil najboljše?

Imate še kak drug predlog, koncept za real real-time multiplayer špile?

Mogoče predlog za kako literaturo?! Rabim koncept, ki je neodvisen od izbrane tehnologije. Koncept, pri katerem pride do najmanjših razhajanj med stanjem igre pri vseh sodelujočih klientih?!

Lp, Sašo

'FireSTORM' ::

Prav zaradi tega se pri MP igrah nabija ping.
Če si že kdaj igral Counter-Strike. Tam se je lepo videlo kdaj je komu za kratek čas zmrznila mreža ali je poraba CPUja poskočila za par trenutkov. Prav obstal je na lahko zelo neumnem mestu(npr. na dolgem odprtem polju z nožom v roki).

Torej omenil si igro z avteki. Pa vzameš ravnino recimo dolgo 100 enot.
In en računalnik je tako slab da igra teče počasneje. Narediš tako da oba računalnika sporočata strežniku npr. pozicijo na tej ravnini in čas.
Čas je seveda štet v igri sami in ne sistemski čas. Torej igra sporoči pozicija na 15. enoti ob 21s pretečenih. Nekomu na hitrem računalniku je res preteklo 21 sekund, nekomu na počasnem pa recimo 1 minuta, v igri pa vseeno 21 sekund ker tam čas teče počasneje ker sama igra dela počasneje. in bo prav tako sicer po eni minuti sporočil strežniku recimo pozicija na 14. enoti ob 21s pretečenih.
Kako se bo pa to videlo? kot da tisti na počasnejšem računalniku poskakuje. To sekundo je tu in obstoji, čez 2 sekundi pa poskoči za x enot naprej.
Those penguins.... They sure aint normal....

shorvat ::

Zavedam se, da je delay problem. Iščem pa rešitev, pri kateri bi na najboljši način rešil problem delay-a.

Našel sem kar obsežno knjigo na to temo in sporočim najboljši način v kolikor ga najdem.

Verjetno je najboljši način/koncept odvisen tudi od vsebine igre. Če gre za vožnjo z avteki je primeren en način, za streljaške igre drugi način. Predvidevam da ne obstaja način, ki bi bil najboljši pri vseh vstah iger.

Poznam igro Counter-Strike. Problemi so se pojavljali tudi v lokalnem omrežju, kaj šele, če igro igraš preko neta.

Zanima me še, katera tehnologija je boljša za clienta v mojem primeru?! Flash ali Director? Vprašanje se nanaša samo na problem, ki se pojavi ob različno močnih procesorjih.

lp, sašo

'FireSTORM' ::

Katerega bolj obvladaš. Bi jaz rekel.
Saj pošiljanje sporočil in prejemanje sporočil od strežnika poteka pri vseh enako, ker se vsi držijo istega standarda in protokola(izbira je pa seveda tvoja).
Those penguins.... They sure aint normal....

[X] ::

Če se že moraš takšne zadeve lotiti v flashu, ti predlagam da bolj ali manj celotno zadevo spišeš v AS in si narediš en frame lock razred s par metodicami in z uporabo kakšnih timerjev.

Game loop si naredi tako kot treba, torej da se ti celotna zadeva izvaja prek kakšnega event handlerja ki teče na določenem intervalu. Tukaj se izogni tisti build in metodi interval, ki jo imaš na voljo v flashu.

Game loop lahko tudi zakompliciraš in določiš da se ti celotna logika izvaja ločeno od grafičnega dela. S tem bi lahko dosegel recimo, po domače povedano, da kljub "štekanju" igre logika v ozadju ostane sinhronizirana.
Toraj moraš zagotoviti da se ti bo logični del konstantno izvajal npr. pri 30fps, kar je že zlo veliko za flash.

Lahko si tudi prepričan, da ti bo zadeva kdaj pobegnila v "out of sync" in bo kolega v steni, na tvojem ekrana pa še vozil. Poskrbeti boš moral, da v kolikor do tega pri, zadevo korigiraš. Torej si boš umisliti nek način, kako preveriti če sta klienta sinhronizirana.

Kar se tiče toka podatkov, v kolikor želiš da je zadeva dokaj realtime, si pa kak serverček v cju spiši, ki ti bo zadevo posredoval klientom. Kok se spomnim lahko zadevo potem kličeš kar z xmlsocketom, tako da si še neke vrste protokolček zmišliš.
Tukaj predvsem pazi kako sestaviš to črevo, ki jo boš okrog pošiljaj, da ti bodo klienti realno gledano zmogli zadevo zapakirati, poslati, prejeti, razpakirati - ne pozabi na vse ostale stvari, ki jih bo še potrebno izvajati (pozicioniranje elementov glede na prejete podatke od drugih klientov in elementov lastnega klienta, glede na interakcijo igralca).

Seveda podatke tudi ne rabiš pošiljati konstantno, torej kot primer vsakih 100ms. Seveda ko si že sam ugotovil, je tole dokaj odvisno od koncepta igre same. Lahko pošiljaš podatke samo ob določeni interakciji uporabnika vmesne člene pa programsko zaključiš na klientu ko je podatke prejel. Torej npr.: xigralec pritisne tipko "levo", izračunaš npr. za koliko stopnij, radionaov, kakor koliže, se je avtomobilček zavrtel v levo, ta podatek pošlješ ostalim igralcem, na klientih teh ostalih igralcev prispe podatek da je xigralec zavil v levo in sicer za 10°. Delo zdaj prevzame klient in avtek zavrti, tukaj še seveda pošiljaš zraven pozicijo avtomobilčka, da korigiraš morebitne napake. Kje je razlika ? Namesto da v roku ene sekunde, med rotiranjem avtomobila s strani igralca, pošlješ podatke 10 krat (mislim da sva prej rekla 100ms), torej rotiraj levo 1°, rotiraj levo 1°, rotiraj levo 1°, itd. dokler seštevek ne znese 10, jih pošlješ samo enkrat, tudi sprocesiraš jih samo enkrat.

kar se tiče oh in ah grafike, načeloma lahko kar pozabiš. Kot primer: 4je avtomobili, cestišče, razne zadeve v ozadju, kaj vem, od dreves do hišič.. Tole se boš dokaj hitro z glavo zaletel v zid, tudi na kakšni dual core mašinci.

Ne vem kako se dan danes kaj kompleksne zanke v Flashu izvajajo, lahko pa ti povem, da je pred časom bilo skoraj da v takšnem sistemu, igro nemogoče izvajati, predvsem če si poskusil premikati sem ter tja kakšne, nevem, recimo pngje. V kolikor pa ti bo dovolj kakšni simple shape (beri vektorski kvadratek) pa mogoče poizkusi...

Če pa misliš še bolj zakomplicirati zadevo, pa se je tako ali tako boljše lotiti kakšnega močnejšega jezika, kot npr. directx ki je dokaj enostavna zadeva, kjer lahko zraven samega cpuja še gpu koristiš. Npr. v Flashu lahko ločiš logiko od grafike le programsko, sicer bi pa lahko zadevo manevriral že na nivoju opreme.

malenkost sem s teme zavil :)

Tole si mogoče snami http://www.codeproject.com/cs/media/mdx...
Oglej si še tole http://msdn2.microsoft.com/en-us/xna/de...
Tudi samih forumov glede teh zadev je ogromno.

lp
Nikol ga ni dovol, piva...

Matako ::

Mislim, da so že ostali zgoraj opisali rešitev. V osnovi se mi zdi, da gre v resnici za prastaro foro s timerjem in števcem. To mogoče ni tisto, kar iščeš, samo bom vseeno omenil, ker spominja, poleg tega pa nikoli ne veš, kdaj se porodi kaka ideja iz navidez nepovezanih stvari ;). Na kratko:

1. Imaš globalni števec, inicializiran na 0.

2. Timer ga v realnočasovnih intervalih (recimo 100/s) povečuje za 1. Samo to.

3. Glavna zanka vsebuje nekaj na temo:


izrisi_sceno();

while (counter > 0) {

izvedi_en_korak_logike_igre();

counter--;

}


To je vse.

Zdi se primitivno, samo deluje. Fora je v tem, da medtem, ko se bodo počasnejši stroji mučili z izrisovanjem scene, timer pridno povečuje števec. Ko pride čas za izračun novih pozicij se bo zaradi tega to na počasnih strojih zgodilo večkrat kot na hitrih, kar bo imelo za posledico sicer manj gladko gibanje (namesto po 1 korak se bodo recimo položaji povečevali za 3), samo razmerja čas-prostor bodo ista. To je točno to kar želiš.

- Jasno, korak logike mora biti nekaj, kar deluje striktno inkrementalno, da se lahko izvrši zaporedoma z dodanim učinkom.

- Timer je lahko karkoli kar se sproži približno v pravih časovnih intervalih, večina OS podpira ta koncept.
/\/\.K.

Zgodovina sprememb…

  • spremenil: Matako ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Šahovski problem - mat v dveh potezah (strani: 1 2 3 4 )

Oddelek: Znanost in tehnologija
19120198 (8641) msjr
»

Kako začeti - Flash + Visual Studio (C#) ?

Oddelek: Programiranje
91707 (1431) avister
»

Prek 60% aplikacij za Android brezplačnih (strani: 1 2 )

Oddelek: Novice / Android
8111655 (9781) Lonsarg
»

Najhitrejsi file-sharing!

Oddelek: Omrežja in internet
71020 (745) noraguta
»

[JAVA]pošiljanje sporočil vsem klientom pri non blocking serverju

Oddelek: Programiranje
6819 (819) Binji

Več podobnih tem