Networking Question
Re: Networking Question
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.
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.
Re: Networking Question
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..
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
Re: Networking Question
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
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
Re: Networking Question
hmh kamēr gaidiju atbildi saliktu tada secībā bet tomēr kautkas nav
atrodas @
//un nosutam
Pie nolasīšanas visu dari no otra gala:
lai iegūtu vertibu daru šādi
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
nu pieņemsim skaitlis 67 /Min -100.0f ,/max+100.0f/precizitate 0.01f1) tev ir float x, kuram zini min, max un precizitāti
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();
iekš Pakete write ->>2) to pārtaisi par int'u, ar to atņemšanu un dalīšanu
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);
Pie nolasīšanas visu dari no otra gala:
iekš Pakete Read->>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
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;
}
Code: Select all
switch (packet->data[0])
{
case NEW_CLIENT:
float x;
x= Pakete::read(-100,+100,0.01f);
printf("%f\n",x);
default:
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
Re: Networking Question
Tas kods, ko tu te raksti, un kas ir pastebin'ā, ir pilnīgi divas dažādas lietas.
Te tu raksti:
kas ir pareizi. Bet pastebinā tev ir:
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ā.
Te tu raksti:
Code: Select all
storeBits(tmp,bitcnt);
Code: Select all
storeBits(tmp,14);
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ā.
Re: Networking Question
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
tikai tas nedaudz atšķiras ...
+ radās jautājums.. Kā var noteikt BBC()[/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?
nolasīšanā
Izskatas ka izdevās nodot value klientam
tikai tas nedaudz atšķiras ...
+ radās jautājums.. Kā var noteikt BBC(
Code: Select all
int BBC = (filledBits+7)/8;
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);
Code: Select all
int bitcnt = Log2((max - min) / precision);
bsIn.Read((char*)buf,2);//Šeit 2....
bufPos=0;
int tmp = readBits(bitcnt);
//OpenGL
Re: Networking Question
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.
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.
Re: Networking Question
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 ...
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..?
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 ...
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
Re: Networking Question
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.
Re: Networking Question
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..
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..
//OpenGL