Daudz spēlētāji
Re: Daudz spēlētāji
nuu nez .. izmantojub gatavu Networka biblioteiku...jo neapmierinaja xna piedavatais speletaju skaits + izmantoju sample tikai parveidoju uz 3dimensionali...
http://pastebin.com/PCPQ30XD
Serveris
http://pastebin.com/sVaVHu4W
Klients
http://pastebin.com/PCPQ30XD
Serveris
http://pastebin.com/sVaVHu4W
Klients
//OpenGL
Re: Daudz spēlētāji
Šī rindiņa ir ļoti aizdomīga:
Kas būs, ja tas otherPlayer.RemoteUniqueIdentifier servera daļā, kas tiek atsūtīts uz klientu tajā kvp.Key mainīgajā sakritīs diviem klientiem pēc moduļa Character.Length?
Tipa:
Player1.RemoteUniqueIdentifier = 123;
Player2.RemoteUniqueIdentifier = 125;
Character.Length = 2 (jo divi pleijeri)
player1.Key % 2 = 123 % 2 = 1
player1.Key % 2 = 125 % 2 = 1
Man šķiet tev pašam tos id vajag menedžēt servera pusē, nevis paļauties uz kautkādu lidgrena UID'u.
Cik pastījos Lidgrena sourci, tad tur šis RemteUniqueIdentifier ir, var teikt, ka pilnīgs randoms, nevis pēc kārtas augošs skaitlis. Tas inicializējas klientam šādi:
kur epBytes ir porta numurs, un macBytes ir MAC adrese. T.i. m_uniqueIdentifier = (long)SHA1(Port || MAC).
Code: Select all
int num = Math.Abs((int)kvp.Key) % Character.Length;
Tipa:
Player1.RemoteUniqueIdentifier = 123;
Player2.RemoteUniqueIdentifier = 125;
Character.Length = 2 (jo divi pleijeri)
player1.Key % 2 = 123 % 2 = 1
player1.Key % 2 = 125 % 2 = 1
Man šķiet tev pašam tos id vajag menedžēt servera pusē, nevis paļauties uz kautkādu lidgrena UID'u.
Cik pastījos Lidgrena sourci, tad tur šis RemteUniqueIdentifier ir, var teikt, ka pilnīgs randoms, nevis pēc kārtas augošs skaitlis. Tas inicializējas klientam šādi:
Code: Select all
byte[] combined = new byte[epBytes.Length + macBytes.Length];
Array.Copy(epBytes, 0, combined, 0, epBytes.Length);
Array.Copy(macBytes, 0, combined, epBytes.Length, macBytes.Length);
m_uniqueIdentifier = BitConverter.ToInt64(SHA1.Create().ComputeHash(combined), 0);
Re: Daudz spēlētāji
No pieredzes varu teikt, nekādus ID nedrīkst ģenerēt klienta pusē. Pašam bija sāpīga pieredze - ģenerēju UUID (kam pēc būtības būtu jābūt unikāliem vienmēr un visur) klienta pusē. Rezultātā sanāca, ka vienlaicīgi onlainā ir pāris simti cilvēku un iespēja, ka kādam uzģenerēsies UUID vienā un tajā pasā milisekundē ir milzīga. Error logs praktiski sastāvēja no šāda veida kļūmēm.
PS. Runājot par UUID, neiesaku tos izmantot arī servera galā (ja tas ir web serveris), man ik pa laikam ģenerējās neunikāli UUID arī iekš PHP, jo tie tika ģenerēti pilnīgi vienlaicīgi. Nepaspēju notestēt kā ir ar MySQL, pieņemu, ka tas varētu randomizēt pēc iepriekšējā randoma (līdz ar to ģenerēt pilnīgi unikālus UUID), bet netaisos to vairs uz savas ādas pārbaudīt.
PS. Runājot par UUID, neiesaku tos izmantot arī servera galā (ja tas ir web serveris), man ik pa laikam ģenerējās neunikāli UUID arī iekš PHP, jo tie tika ģenerēti pilnīgi vienlaicīgi. Nepaspēju notestēt kā ir ar MySQL, pieņemu, ka tas varētu randomizēt pēc iepriekšējā randoma (līdz ar to ģenerēt pilnīgi unikālus UUID), bet netaisos to vairs uz savas ādas pārbaudīt.
Beidz runāt, sāc darīt!
Re: Daudz spēlētāji
Ja tev tie UUID ģenerējās vienādi, tas nozīmē, ka nepareizi UUID'us ģenerēji. UUID pēc definīcijas jābūt unikālam. Ja tie nav, tad tas nav UUID :) Paņemam tekošo laiku + mac adresi + hašu no kautkāda user vārda/paroles un dabūsi UUID'a baitus. Hešsumu no tā visa gan nedrīkst ņemt.
Re: Daudz spēlētāji
Nez veči, MP spēlēs, kuras es pats labrāt spēlēju (un arī VoH), ID nāk tikai no servera.
Nekāds UUID priekš klientiem nesanāks, jo objektu kopa servera un katra klienta pusē atškiras
Ja arī ir kaut kas, kas tiek saukts par "UUID", tas tiek izmantots kā "UUID" tikai starp-serveru komunikācijai un tml. Klients to nemāk uzģenerēt.
Nekāds UUID priekš klientiem nesanāks, jo objektu kopa servera un katra klienta pusē atškiras
Ja arī ir kaut kas, kas tiek saukts par "UUID", tas tiek izmantots kā "UUID" tikai starp-serveru komunikācijai un tml. Klients to nemāk uzģenerēt.
Re: Daudz spēlētāji
Un kā tu iekš Flasha dabūsi MAC adresi? v4 UUID tiek ģenerēts tikai no taimera, un tā kā tas ir vienīgais randoms, kas pieejams Flashā, tad nācās izmantot v4. Ja ir pieejama MAC adrese, tad es piekrītu, ka var izmantot v3 vai v5 UUID, bet pārsvarā klientu softiem tā nebūs pieejama (ne Flash, ne Shockwave, ne Silverlight, ne Unity).bubu wrote:Ja tev tie UUID ģenerējās vienādi, tas nozīmē, ka nepareizi UUID'us ģenerēji. UUID pēc definīcijas jābūt unikālam. Ja tie nav, tad tas nav UUID Paņemam tekošo laiku + mac adresi + hašu no kautkāda user vārda/paroles un dabūsi UUID'a baitus. Hešsumu no tā visa gan nedrīkst ņemt.
Beidz runāt, sāc darīt!
- vecais_dumais_laacis
- Guru
- Posts: 109
- Joined: 06 Dec 2010, 18:48
- Contact:
Re: Daudz spēlētāji
Nu no taimera nekāds gudrais UUID, protams, nesanāks. To nemaz par UUID'u nevar saukt, ja to ģenerē dažādi klienti.
Re: Daudz spēlētāji
Manā gadījumā spēle simulējās paralēli gan uz server gan uz klienta, neatkarīgi viens no otra (lai darbības notiktu momentāni, nevis tikai tad, kad serveris atsūta id). Serveris tikkai pārbauda, vai uz klienta visi dati ir kārtībā, līdz ar to klients neatkarīgi no servera ģenerēja UUID. Plāns, protams, izgāzās. Bet atrisināju to ar samērā nesāpīgu risinājumu - uz klienta tiek ģenerēti klienta-unikāli ID, kas vēlāk uz servera tiek tulkoti uz reāliem ID, līdz ar to klients tik un tā ģenerē ID un strādā ar tiem. Manā gadījumā, kad nedrīkst gaidīt uz servera, šis ir vienīgais risinājums.
Beidz runāt, sāc darīt!
Re: Daudz spēlētāji
m. Atvainojos ka ceļu augšā vecu tēmu.. Jo tikai šodien atsāku ņemties...
nju es bik paediteju..+ uzliku kustīgu 2D kameru... Pirmstam dzirdeju ka nevar palaist uz 1 pc 2 klientus (tapec ka viņi bus identiski)
Ieladeju video lai pierādītu pretējo...
http://87.110.72.117/gc2/mov2.html
nju es bik paediteju..+ uzliku kustīgu 2D kameru... Pirmstam dzirdeju ka nevar palaist uz 1 pc 2 klientus (tapec ka viņi bus identiski)
Ieladeju video lai pierādītu pretējo...
http://87.110.72.117/gc2/mov2.html
//OpenGL