Daudz spēlētāji

Vēlies radīt spēli, bet nezini ar ko sākt? Sperot pirmos soļus, vari meklēt padomu šeit
Message
Author
CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: Daudz spēlētāji

#11 Post by CodeWolf » 26 Dec 2010, 22:57

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
//OpenGL

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: Daudz spēlētāji

#12 Post by bubu » 27 Dec 2010, 15:48

Šī rindiņa ir ļoti aizdomīga:

Code: Select all

int num = Math.Abs((int)kvp.Key) % Character.Length;
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:

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);
kur epBytes ir porta numurs, un macBytes ir MAC adrese. T.i. m_uniqueIdentifier = (long)SHA1(Port || MAC).

elvman
Posts: 434
Joined: 06 Dec 2010, 18:43
Location: Rīga
Contact:

Re: Daudz spēlētāji

#13 Post by elvman » 28 Dec 2010, 05:08

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.
Beidz runāt, sāc darīt!

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: Daudz spēlētāji

#14 Post by bubu » 28 Dec 2010, 12:23

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.

DeRatizator

Re: Daudz spēlētāji

#15 Post by DeRatizator » 28 Dec 2010, 20:00

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.

elvman
Posts: 434
Joined: 06 Dec 2010, 18:43
Location: Rīga
Contact:

Re: Daudz spēlētāji

#16 Post by elvman » 28 Dec 2010, 22:49

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.
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).
Beidz runāt, sāc darīt!

User avatar
vecais_dumais_laacis
Guru
Guru
Posts: 109
Joined: 06 Dec 2010, 18:48
Contact:

Re: Daudz spēlētāji

#17 Post by vecais_dumais_laacis » 29 Dec 2010, 00:02

kaapeec UUID jaagjeneree klientam vispaar?
...un ja bites buutu laachi...

bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: Daudz spēlētāji

#18 Post by bubu » 29 Dec 2010, 00:10

Nu no taimera nekāds gudrais UUID, protams, nesanāks. To nemaz par UUID'u nevar saukt, ja to ģenerē dažādi klienti.

elvman
Posts: 434
Joined: 06 Dec 2010, 18:43
Location: Rīga
Contact:

Re: Daudz spēlētāji

#19 Post by elvman » 29 Dec 2010, 02:52

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!

CodeWolf
Posts: 119
Joined: 10 Dec 2010, 19:10
Location: LV-Riga-Marupe

Re: Daudz spēlētāji

#20 Post by CodeWolf » 02 Jan 2011, 21:11

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
//OpenGL

Post Reply

Return to “Iesācējiem / For beginners”