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: 12. červen 2015, 14:21:08 Předmět: |
|
|
Stal sa Vam niekedy takyto problem? Pri prichode ale hlavne pri odchode hracov vyskocili cisla messages na zavratne tisice. Stal sa niekomu takito problem?
_________________
|
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 12. červen 2015, 17:55:33 Předmět: |
|
|
Takhle to vypadá u nás v Grenade Madness:
Kolik máš photon views? Není možný, že se ti duplikují nějakou náhodou?
Každej v defaultu udělá 20msg/s co vím. _________________ Jeden z vývojářů hry Grenade Madness. |
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 12. červen 2015, 18:18:02 Předmět: |
|
|
Inak co som pozeral tvoj graf tak vy sa dostanete aj cez 320 ak budete hrat 8. Ja to mam komplikovanejsie aj v tom ze prenasam nielen poziciu ale aj rotaciu tanku a hlavne zvlast. Cize je to horsie ako len prenasat poziciu a rotaciu jedneho objektu _________________
|
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 13. červen 2015, 08:42:19 Předmět: |
|
|
A je k tomu důvod? Já všechny data co přenáším tak přenáším ve struktuře a v případě, že potřebuju šetřit data tak kde vím, že jsou malý hodnoty tak to převedu na bajty, případně rotaci nepřenáším jako Quaternion ale jako obyčejný úhly.
Taky jsem to udělal, že PhotonView má jenom každej hráč a aréna, tj max 8+1. A co jsem to zkoušel s 8mi klientama tak jsem se do 500msg vlezl.
Edit: možná jim napiš na exitgames forum, mohli by vědět víc, mě by to taky zajímalo.
Pro inspiraci:
kód: |
// enumy dědí : byte/ushort, protože mají pár flagů
#region Network serialization / deserialization + interpolation
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct NetworkProperties
{
public Vector3 position;
public float angleY;
public State state;
public float speedMultiplier;
public float legsRotation;
public WeaponRecycler.WeaponType currWeaponType;
public int score;
public int boxes;
public int frags;
public int ping;
public int numBonusGrenades;
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = Config.Grenades.maxSerializedCount)]
public GrenadeBase.NetworkProperties[] activeGrenades;
}
public byte[] networkProperties
{
get
{
var np = new NetworkProperties();
np.position = position;
np.angleY = angleY;
np.state = state;
np.speedMultiplier = speedMultiplier;
np.legsRotation = legsRotation;
np.currWeaponType = currWeaponType;
np.numBonusGrenades = numBonusGrenades;
np.activeGrenades = new GrenadeBase.NetworkProperties[Config.Grenades.maxSerializedCount];
np.score = score;
np.boxes = boxes;
np.frags = frags;
np.ping = PhotonNetwork.GetPing();
int i = 0;
for(int j = activeGrenades.Count - 1; j >= 0; j--)
{
if(i++ > Config.Grenades.maxSerializedCount)
break;
var g = activeGrenades[j];
if(g != null)
{
np.activeGrenades[i] = g.networkProperties;
}
}
return StructSerializer.Serialize<NetworkProperties>(np);
}
}
#endregion
//Deserializace
NetworkProperties np = StructSerializer.Deserialize<NetworkProperties>((byte[])stream.ReceiveNext());
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
public class StructSerializer
{
public static byte[] Serialize<T>(T msg) where T : struct
{
int objsize = Marshal.SizeOf(typeof(T));
byte[] ret = new byte[objsize];
System.IntPtr buff = Marshal.AllocHGlobal(objsize);
Marshal.StructureToPtr(msg, buff, true);
Marshal.Copy(buff, ret, 0, objsize);
Marshal.FreeHGlobal(buff);
return ret;
}
public static T Deserialize<T>(byte[] data) where T : struct
{
int objsize = Marshal.SizeOf(typeof(T));
System.IntPtr buff = Marshal.AllocHGlobal(objsize);
Marshal.Copy(data, 0, buff, objsize);
T retStruct = (T)Marshal.PtrToStructure(buff, typeof(T));
Marshal.FreeHGlobal(buff);
return retStruct;
}
}
|
_________________ Jeden z vývojářů hry Grenade Madness. |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 15. červen 2015, 08:35:28 Předmět: |
|
|
RS napsal: |
Stal sa Vam niekedy takyto problem? |
Ne Neco delas hodne spatne. Ale moc me nenapada, jak se ti tohle mohlo povest. Co treba buffered RPCs? Kolik tam mas PhotonViews a vytvaris nejake za behu?
Jatro.m:
Nebylo by nahodou lepsi pouzivat custom properties pro veci jako skore, aktualni zbran nebo ping? A co tam posilas za info o tech granatech? Doufam, ze ne jejich polohu |
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 15. červen 2015, 09:36:09 Předmět: |
|
|
JJ urcite pouzivat player properties No stale to vysetrujem kde moze byt problem. Buffered nepouzivam, riesim miesto toho ze ked sa niekto pripoji tak posle update stavu hry novemu hracovi _________________
Naposledy upravil RS dne 15. červen 2015, 09:48:08, celkově upraveno 1 krát |
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 15. červen 2015, 09:38:13 Předmět: |
|
|
Netusite ako zistit ked padne hracovi pripojenie? Aby neostal v zastavenej hre ale aby ho aspon presunulo do menu. OnDisconnectedFromPhoton mi funguje len na rucne odpojenie. Dik _________________
|
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 15. červen 2015, 18:49:55 Předmět: |
|
|
citace: |
Jatro.m:
Nebylo by nahodou lepsi pouzivat custom properties pro veci jako skore, aktualni zbran nebo ping? |
Ano jsou super, ale osobně mi vadilo kolik to naalokuje paměti při jedné operaci. Doporučuju zkouknout profiler.
Z důvodu, že tyhle data se ve hře mění prakticky pořád, tak to posílám v jedné msg zároveň s pozicema a dalšíma herníma datama. Pořád je tam místo pro optimalizaci.
citace: |
A co tam posilas za info o tech granatech? Doufam, ze ne jejich polohu |
Jo, posílám si pozici a stav + další data. Imho u prototypu kterej nemá autoritativní server to jinak nejde.
citace: |
Jak zjistit jestli uživatelovi spadlo připojení, nebo cokoliv jinýho: |
kód: |
public override void OnLeftRoom()
{
ForceLeaveRoom();
}
public override void OnDisconnectedFromPhoton()
{
Debug.Log("OnDisconnectedFromPhoton");
ForceLeaveRoom();
}
public override void OnFailedToConnectToPhoton(DisconnectCause cause)
{
Debug.Log("OnFailedToConnectToPhoton " + cause);
ForceLeaveRoom();
}
|
[/code] _________________ Jeden z vývojářů hry Grenade Madness. |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 16. červen 2015, 07:24:05 Předmět: |
|
|
citace: |
Ano jsou super, ale osobně mi vadilo kolik to naalokuje paměti při jedné operaci. Doporučuju zkouknout profiler. |
Nemam s tim vubec zadny problem ani na mobilech. Jenom je dulezite nastavit PhotonNetwork.SendMonoMessageTargets, aby se zabranilo volani PhotonNetwork.FindGameObjectsWithComponent() po kazde udalosti "on property changed".
citace: |
Z důvodu, že tyhle data se ve hře mění prakticky pořád |
Skore, zbran a ping se snad nemeni kazdych 100 ms...
citace: |
Jo, posílám si pozici a stav + další data. Imho u prototypu kterej nemá autoritativní server to jinak nejde. |
Zacal bych proste jednoduchym RPC o hozeni granatu z urcite pozice nejakym smerem. |
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 16. červen 2015, 08:11:56 Předmět: |
|
|
citace: |
Nemam s tim vubec zadny problem ani na mobilech. Jenom je dulezite nastavit PhotonNetwork.SendMonoMessageTargets, aby se zabranilo volani PhotonNetwork.FindGameObjectsWithComponent() po kazde udalosti "on property changed". |
O tomhle jsem nevěděl, že to jde vypnout. Vím že tam byla jedna funkce co sežrala hodně CPU času, což bude asi co píšeš a potom ta alokace, ale ta je vcelku jedno když se to nevolá každejch 500ms.
citace: |
Skore, zbran a ping se snad nemeni kazdych 100 ms... :) |
Měl jsem to v těch Custom Props, ale přehodil jsem to, protože mi to dělalo zbytečný špičky ve výkonu.
citace: |
Zacal bych proste jednoduchym RPC o hozeni granatu z urcite pozice nejakym smerem. |
Toto jsem zavrhl z důvodu, že ta fyzika vychází všude jinak. Buďto by to musel simulovat server a nebo každej hráč a potom interpolovat.
Dokážu si představit, že by to dělalo problémy při výpočtu zásahů.[/quote] _________________ Jeden z vývojářů hry Grenade Madness. |
|
Návrat nahoru |
|
|
Radis
Založen: 29. 03. 2014 Příspěvky: 235
|
Zaslal: 16. červen 2015, 09:11:09 Předmět: |
|
|
citace: |
Toto jsem zavrhl z důvodu, že ta fyzika vychází všude jinak. |
To je fakt, ale kdyz nastavis rozumne fixedTimeStep a udelas ty granaty dost velke a nenechas je odrazet se od hracu, tak celkem nebude problem a skonci na vsech klientech na stejnem miste. Spousta mobilnich her to dela presne takto (RPC o hozeni granatu + lokalni simulace). |
|
Návrat nahoru |
|
|
Játro.m
Založen: 01. 02. 2010 Příspěvky: 230
|
Zaslal: 16. červen 2015, 09:44:27 Předmět: |
|
|
Radis:
právě toto by byl problém, je tam x typů granátů + jsou docela malý, některý se odráží uplně od všeho a tam jsem právě počítal, že to nevyjde stejně na všech klientech.
Ve finálním produktu chci aby byl autoritativní server, protože toto se nedá ošetřit proti podvádění. _________________ Jeden z vývojářů hry Grenade Madness. |
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 16. červen 2015, 12:03:46 Předmět: |
|
|
ja som napriklad pomaly letiace strely tiez robil tak ze som ich spawnol cez rpc a na vsetych klientoch to leti cca stejne. Mensie lagy budu vzdy _________________
|
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 1. červenec 2015, 09:17:57 Předmět: |
|
|
Mozno to niekomu pomoze: po update na novy photon networking ten pruser zmizol. Zjavne tam mali bug, pretoze teraz mi to vobec nerobi. Teraz som mal max 300 messages pri 8 hracoch ked sa odpojili naraz , predtym aj 15 tisic messages. _________________
|
|
Návrat nahoru |
|
|
RS
Založen: 21. 02. 2012 Příspěvky: 551
|
Zaslal: 30. červenec 2015, 13:30:45 Předmět: |
|
|
Vedel by mi niekto objasnit ako je to s tymi photon CCU? Pri predplatenom pocte napriklad 100 CCuto je na vsetky regiony dokopy alebo pre kazdy region je tych 100 ccu zvlast? _________________
|
|
Návrat nahoru |
|
|
|