Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 5. duben 2015, 11:16:12 Předmět: Photon networking |
|
|
Zdravim vsetkych,
chcel by som sa opytat ci ma niekto skusenosti s optimalizovanim PUN pre online hru v unity. Mam nasledujuci problem:
Kazdy hrac ma na svojej jednotke jeden photon view cez ktory synchronizujem poziciu a rotaciu hraca. Je nejaka moznost ako znizit messages na server? Lebo pozeram statistiku a pri 8 hracoch je to len na pohyb skoro 400 messages a na room je limit 500 podla exit games stranky. Pride mi to brutalne vela, kedze mi potom skoro nic neostane na RPC. Nejaky napad?
Dik _________________
|
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 5. duben 2015, 13:17:41 Předmět: |
|
|
Jak máš nastavený ten photonView na postavě?
Já když spustím 1000 photonView tak jsem na 85ms/s - ale těch 1000 je na masterClientovi (který je ovládá) - tak jako tak se ale musí replikovat dalším online hráčům. A těch 1000 replikuje pohyb + RPC všem co jsou online.
Ale také se snažím najít řešení jak to ještě snížit. _________________
http://www.mcmagic-productions.com/ |
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 5. duben 2015, 14:05:02 Předmět: |
|
|
reliable delta compressed. A cez script riesim vyhladenie pohybu lerpom. _________________
|
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 5. duben 2015, 15:06:00 Předmět: |
|
|
A nastaveno máš pouze position and rotation?
To je divné - já teď zkusil spustit 4 hráče + 1 master server + 8 dalsich jako creatury na masteru.
TJ - 5 hracu + 8 view na masteru a vse posila RPC.
A ukazuje me to 12-15 msg/s _________________
http://www.mcmagic-productions.com/ |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 5. duben 2015, 15:18:22 Předmět: |
|
|
Tak predevsim pouzivej mod "Unreliable On Change" a pohraj si s nastavenim sendRate a sendRateOnSerialize. Nastav je co nejniz. Pak taky optimalizuj velikost dat, co posilas. Pokud treba vis, ze tvuj level ma rozmery napriklad 100x100 metru, tak je uplne zbytecne posilat pro kazdou souradnici 32bitovy float... To same s rotaci. Hodnoty kvantuj na nejaky rozumny pocet bitu. |
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 6. duben 2015, 08:20:38 Předmět: |
|
|
Diky je tam nejaka realna uspora ked budem posielat miesto float len int? _________________
|
|
Návrat nahoru |
|
|
McMagic
Založen: 06. 08. 2012 Příspěvky: 615
|
Zaslal: 6. duben 2015, 09:41:45 Předmět: |
|
|
"Unreliable On Change" se nehodí na vše - záleží jak s tím dál pracuješ atd.
Pro MMO je to nepoužitelné a je nutné "Reliable delta compressed".
Ale to je potřeba vyzkoušet a namyslet projekt od projektu.
Ale tady se bavíme o tom, že ti to dává 400msg/s jen pro pohyb/rotace při 8 lidech online ne? (nebo se pletu).
Když vzpomínám na max lidí co jsem měl kdy online v testech což bylo 15-20, tak jsem se nikdy nedostal na takové čísla a to posílám spoustu RPC - ale posílám taky jen enum jako string převážně a ty pak zpracuji.
cca 10 hráčů co posílá pozice a RPC = 10-15msg/s
1000 creatur(co pracovali naráz v jednu dobu) řešených jako photonObject a vlastním PhotonView (ale přes mastera) mě dělalo 85msg/s - také pozice a RPC.
Nebo pouze zavolám pomocí RPC funkci bez dat - která všem řekne že si mají šáhnout na DB server pro nové údaje (a ty údaje tedy neposílám pomocí RPC). Já se snažil celou dobu photon využít pouze na pohyb a ostatní věci řešit jinak, vůbec je přes photon neposílat (max jen echo že došlo někde ke změně) - takže veškerou zátěž předávám pak na DB server.
Ale při pohybu je to hodně divné - nemáš tam něco zacyklované? Opravdu se ti to děje pouze při pohybu?
Ve scriptu co řeší online replikaci příjem a odeslání pohybu - pracuješ skutečně jen s position a rotation ?
Poslat int namísto float - záleží jak moc velký rozdíl je pro tebe mezi hodnotou 1 a 2. Pro mne je v pozici třeba hodně velký. _________________
http://www.mcmagic-productions.com/ |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 6. duben 2015, 13:54:57 Předmět: |
|
|
RS: No pokud by tvoje optimalizace spocivala v tom, ze posles misto jednoho floatu jeden int, tak tam realna uspora skutecne nebude...
Myslel jsem to takto. Kdyz mas treba level 100x100 metru a staci ti vedet pozice hracu s presnosti na 10 cm, tak na kazdou souradnici potrebujes jen 10 bitu. Kdyz pouzijes short (16b), tak ti to staci na reprezentaci 6.5 km po 10 cm. Jestli ve sve hre nepotrebujes y-ovou souradnici, tak usetris dalsich 32 bitu... Na rotaci taky urcite nepotrebujes cely rozsah floatu.
Jinak messages per room se pocitaji jako pocet zprav co tvoje aplikace posle + pocet zprav, ktere se poslou klientum. Napr. pro 8 hracu pri 8 zpravach za sekundu by to bylo 512 msg/s... |
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 6. duben 2015, 19:29:04 Předmět: |
|
|
jj presne no ja som to teraz spravil ze pozicia ide cez 3x int a rotacia ide iba Y pre tank aj pre hlaven tiez ako int cize nejaka uspora tam je ked nejde 1x vector3 + 2x quaternion _________________
|
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 6. duben 2015, 20:12:21 Předmět: |
|
|
Aha. Mozna by te jeste mohlo zajimat, kolik dat touhle optimalizaci usetris: Debug.Log(3 * sizeof(int) - 3 * sizeof(float)). |
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 7. duben 2015, 06:29:53 Předmět: |
|
|
Ak som to pochopil spravne tak int aj float maju rovnaku velkost? Preco som si myslel ze int musi mat mensiu velkost? Tak v com to potom posielat co by bolo este uspornejsie? _________________
|
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 7. duben 2015, 06:45:14 Předmět: |
|
|
V kazdom pripade tam uspora je aspon to ze neposielam uz 1x pos vector3 a 2 quaterniony (11 hodnot ale len 5 ako som spominal hore) _________________
|
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 7. duben 2015, 06:48:22 Předmět: |
|
|
V kazdom pripade som sa dostal uz na celkom prijemne cisla vratane strelby a pohybu vsetkych 8 hracov + pohybu hlavne to dava okolo 300 messages co je uz fajn. Ono ked mate zapnutych 8 klientov ale nevykonavate so vsetkymi naraz cinnost tak tie cisla moc vypoved nemaju a su nizke. Preto som mal na toto napisany test, kde sa vsetky tanky hybali, otacali a pouzivali hlaven a strielali. Az vtedy som videl ako to vyzera pod fakt velkou zatazou a dalo mi to realny obraz o tom ako to bude vyzerat v realnom provoze. Dokonca si myslim ze v reali ani nebude takato velka zataz ako v teste _________________
|
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 7. duben 2015, 08:12:04 Předmět: |
|
|
Este ma napadlo a co tak short? To by mohlo stacit nie a ma miesto 4 len 2 bajty? _________________
|
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 7. duben 2015, 08:42:25 Předmět: |
|
|
Jo. Pro "prevod" floatu na short a zpatky pouzij neco takoveho:
kód: |
static ushort Quantize(float value, float min, float max)
{
return (ushort)(ushort.MaxValue * (value - min) / (max - min));
}
static float Dequantize(ushort quantizedValue, float min, float max)
{
return (quantizedValue / (float)ushort.MaxValue) * (max - min) + min;
}
|
Min a max je ti urcuje rozsah hodnot.
Treba kdyz mas rozsah souradnic -100 az 100 metru, tak bys to pouzil takto:
var qx = Quantize(x, -100, 100);
a na druhe strane pak:
var x = Dequantize(qx, -100, 100);
(Ty metody jsem psal z hlavy, ale snad to bude fungovat ) |
|
Návrat nahoru |
|
|
|