Networking Question

Vēlies radīt spēli, bet nezini ar ko sākt? Sperot pirmos soļus, vari meklēt padomu šeit
Message
Author
bubu
Guru
Guru
Posts: 398
Joined: 07 Dec 2010, 11:54

Re: Networking Question

#31 Post by bubu » 21 Jan 2012, 03:58

bitcnt ir mainīgais, kas tiek izmantots tālāk kodā. Tā jēga ir izrēķināt cik bitus no tmp integera vajadzēs saglabāt buferī.

Kāda vēl -100; +100 vērtību piešķiršana? -100 vai +100 nav jāpiešķir. Tās ir jāizmanto lai izrēķinātu to tmp un bitcnt. Bez tām nekāda bitu ietaupīšana nesanāks.

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

Re: Networking Question

#32 Post by CodeWolf » 21 Jan 2012, 15:50

hmm ja pareizi saprartu tad tas viss kods ko rakstiji iepriekš ir jaapvieno vienā ..
ja ja tad laikam ka viss kods bus japarraksta jo pirmstam rakstiju katram atsevišķi + izlaidu max & min daļu jo aizgaja runa par bitu samazinašanu un taja brīdi aizmirsu par to..
+ kā to Write-> read
dabūt iekš
bsIn.Read(?
tos datus.. lai viņš nolasītu un dotu viņiem kādu vērtību..)
tpt arī rakstot..
//OpenGL

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

Re: Networking Question

#33 Post by bubu » 21 Jan 2012, 22:08

Protams, ka visu kopā jāsaliek
1) tev ir float x, kuram zini min, max un precizitāti
2) to pārtaisi par int'u, ar to atņemšanu un dalīšanu
3) int'u sapako bitos baiti buferī

Pie nolasīšanas visu dari no otra gala:
1) izvelk int'u no baitu bufera ņemot vajadzīga skaita bit'us (kuru izrēķina no tām pašām min/max/precision vērtībām)
2) int'u pārtaisa par floatu ar saskaitīšanu un reizināšanu

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

Re: Networking Question

#34 Post by CodeWolf » 21 Jan 2012, 22:38

hmh kamēr gaidiju atbildi saliktu tada secībā bet tomēr kautkas nav
1) tev ir float x, kuram zini min, max un precizitāti
nu pieņemsim skaitlis 67 /Min -100.0f ,/max+100.0f/precizitate 0.01f
atrodas @

Code: Select all

case ID_NEW_INCOMING_CONNECTION:
		printf("Piesledzas klients .. 5sek .\n");
		Sleep(1000);
		bsOut.Write((RakNet::MessageID)NEW_CLIENT);
		Pakete::write(67.0f,-100,+100,0.01f);
		peer->Send(&bsOut,HIGH_PRIORITY,RELIABLE_ORDERED,0,packet->systemAddress,false);

		bsOut.Reset();
2) to pārtaisi par int'u, ar to atņemšanu un dalīšanu
iekš Pakete write ->>

Code: Select all

 int tmp = (int)((value - min) / precision);
 int bitcnt = Log2((max - min) / precision);
3) int'u sapako bitos baiti buferī

Code: Select all

initBits();
	storeBits(tmp,bitcnt);
	int BBC = (filledBits+7)/8;
	bsOut.Write((char*)buffer,BBC);
//un nosutam

Pie nolasīšanas visu dari no otra gala:
1) izvelk int'u no baitu bufera ņemot vajadzīga skaita bit'us (kuru izrēķina no tām pašām min/max/precision vērtībām) | + | 2) int'u pārtaisa par floatu ar saskaitīšanu un reizināšanu
iekš Pakete Read->>

Code: Select all

float Pakete::read(float min, float max, float precision)
{
	RakNet::BitStream bsIn(packet->data,packet->length,false);
    int bitcnt = Log2((max - min) / precision);
	bsIn.Read(buf,bitcnt);
	bufPos=0;
	int tmp = readBits(10);
    return min + tmp * precision;
}
lai iegūtu vertibu daru šādi

Code: Select all

 switch (packet->data[0])
      {
        case NEW_CLIENT:
			float x;
			
		x=	Pakete::read(-100,+100,0.01f);
			printf("%f\n",x);
			
        default:
hmm saņemot vertiba ir minimalais x...
meiģināju arī tmp iegut.. ta vertiba bija 0;

Varbut esmu pielaidis kļūdu kautkur sākumā..
http://pastebin.com/QBsX12VT//Serveris
http://pastebin.com/uFHHrKLB//Klients
//OpenGL

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

Re: Networking Question

#35 Post by bubu » 22 Jan 2012, 08:34

Tas kods, ko tu te raksti, un kas ir pastebin'ā, ir pilnīgi divas dažādas lietas.
Te tu raksti:

Code: Select all

storeBits(tmp,bitcnt);
kas ir pareizi. Bet pastebinā tev ir:

Code: Select all

storeBits(tmp,14);
kas ir nepareizi. Kā tu zini, ka tmp vajag tikai 14 bitus? Ja min=-100, max=+100 un prec=0.01, tad tam vajag 15 bitus (2^14 = 16384, bet 2^15=32768, un 200/0.01 = 20000).

Un tik cik bitus tu ieraksti, vienmēr vajag tikpat nolasīt.
Tev tur nolasīšanas bitu skaits pamatīgi atšķiras.
Te tu ieraksti bitcnt bitus, bet nolasi vienmēr 10 - wtf?
pastebinā tu ieraksti 14, bet nolasi 10 bitus - arī wtf.

Un vispār - tavu kodu grūti lasīt. Sakārto vispirms to. Sākot ar identāciju, un beidzot ar globālo mainīgo un neizmantota koda iznīdēšanu. Kam tev tur klases vajag (Packet), ja visas metodes statiskas... Un baitu buferus bitu pakošanai nevajag globālus glabāt - priekš kam? Lokāli mainīgi nav aizliegti.

Uztaisi jaunu klasi, kurā izolē visu šo funkcionalitāti - klasei vajadzētu mācēt lasīt un rakstīt float'us, un vajadzētu piedāvāt nolasīt/uzstādīt buferi un tā izmēru baitos.
Tad šo klasi notestē, bez tīkla funkcionalitātes. Kas būs daudz vieglāk un ērtāk. Ieraksti dažādus skaitļus tajā, un nolasi tos. Kad to būsi nodebugojis un pārliecinājies, ka tas strādā. Tikai tad integrēt savā tīkla kodā.

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

Re: Networking Question

#36 Post by CodeWolf » 23 Jan 2012, 02:26

hmh , atvainojos par to koda jucekli vienkārši pirms raksta nodošanas vel paris reizes to pamainīju.. un neatjaunoju...
Izskatas ka izdevās nodot value klientam
Image
tikai tas nedaudz atšķiras ...
+ radās jautājums.. Kā var noteikt BBC(

Code: Select all

int BBC = (filledBits+7)/8;
)[/i] izmēru iekš nolasītāja..
tagad noteicu uz aci .. jo iekš servera bbc vertiba bija 2
bet kā to izdarīt automātiski?

Code: Select all

initBits();
	storeBits(tmp,bitcnt);
	int BBC = (filledBits+7)/8;
	bsOut.Write((char*)buffer,BBC);
nolasīšanā

Code: Select all

 int bitcnt = Log2((max - min) / precision);
	bsIn.Read((char*)buf,2);//Šeit 2....
	bufPos=0;
	int tmp = readBits(bitcnt);
//OpenGL

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

Re: Networking Question

#37 Post by bubu » 23 Jan 2012, 05:03

Loģiski, ka atšķiras. Kā tad tu iedomājies ietaupīt bitus neko nepazaudējot? Brīva vieta no tukša gaisa neradīsies - kautkas ir jāziedo.
Bet galvenais jau ir tas, lai neatšķiras vairāk par precision mainīgā vērtību - tur jau tā visa sāls. Ka tu to vari kontrolēt - viss manējais kods, ko te biju postējis, mainīgo vērtību izmaina sapakojot tajos bitos. Vienīgais, ko tas garantē, ir ka vērtība neatšķirsies vairāk par precision.
Tavā piemērā abs(61.0 - 60.999996) = 0.000004, un tas ir mazāks par 0.1f, ja to tu izmantoji par precision.

Ja tev tas BBC ir baitu skaits, kas jāsūta klientam, tad tas vienkārši ir bitu skaits dalīts ar 8 (noapaļojot uz augšu). To arī kods (filledBits+7)/8 dara.
Nolasītāja galā to var izrēķināt tieši tāpatās. Ja tu zini kādus datus tu tur nolasīsi, tad filledBits būs to visu datu bitu skaitu summa. Bet principā to vari arī nedarīt. Vienīgais uzliec papiluds pārbaudi, lai netiek nolasīts vairāk par saņemtajiem datiem (lai neaiztiek atmiņu, kas nav tev izdalīta), un arī būs ok.

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

Re: Networking Question

#38 Post by CodeWolf » 23 Jan 2012, 14:47

Tas gan , neaizdomājos par precizitāti..
hmh šodien nedaudz pamainīju Write-> value .. gribēju parbaudīt cik lielu skaitli tas spēj pārnest + vai tas kādi nejietekmētu BBC izmērus..
ieliekot randomu skaitli.. ieguvu klienta pusē dīvainus skaitļus..
Uztaisiju pārbaudi lai sameketu pie kura skaitļa tas viss pārvēršas ...
Image
Redzams ka pie skaitļa 64.0f value pārvēršas par negatīvu ..
Kas varētu būt pie vainas? + kāpēc..?
//OpenGL

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

Re: Networking Question

#39 Post by bubu » 23 Jan 2012, 18:24

Ja min=-100, max=+100 un prec=0.1, tad, jau kā iepriekš teicu, 14 ir vienu bitu par maz - paskaties kā augstāk es uzrakstīju, ka tur vajag 15 bitus.

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

Re: Networking Question

#40 Post by CodeWolf » 23 Jan 2012, 18:58

Pag ja pareizi sapratu tad ar + un - nosaku minimālo un maksimalo vērtību kādai lietai... piem pozicijai...
tā nedrīkst būt lielāka par +100.0f un mazāka par -100.0f
+ sanāk ka pakas izmērs = 2biti un ja pieskaitot bitcnt klat skaitli tas nepaplašinas tad jau es varu entos bitus salikt aizmugurē jo savādāk uzliekot uz 15 rodas jauns ierobežojums ,kautkur pie ~230...
Es drīkstu viņu tā izmantot..? vienkārši man gluži ar 100x100 spelējamo laukumu nepietiek.. :roll:
//OpenGL

Post Reply

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