Rjesenje za nestajanje objekata

Započeo twoblqck.art, Septembar 10, 2024, 19:18:44 POSLE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

per-object-streamanddraw - GitHub


Funkcija koja omogucava da se objektu dodjeli odreden Draw i Stream Distance. Napravljena kao rjesenje za nestajanje objekata kod vecih mapa.

Prije/Poslije:





Funkcija:
forward CDO(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz);
public CDO(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
    // Default values if an object is not present below
    new Float:streamingDistance = 100.0,
        Float:drawingDistance = 100.0;

    switch(modelid)
    {
        case OBJECT_ID:
            streamingDistance = 400.0,
            drawingDistance = 400.0;
    }
    return CreateDynamicObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, .worldid = -1, .streamdistance = streamingDistance, .drawdistance = drawingDistance);
}

Primjer:
forward CDO(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz);
public CDO(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz)
{
    new Float:streamingDistance = 100.0,
        Float:drawingDistance = 100.0;

    switch(modelid)
    {
        // Large objects - Important, silhouettes, outer walls, big buildings, etc.
        case 4516, 4507, 18981, 19378, 19355, 19357, 18762, 19457, 19353, 19438, 3599, 19377, 11459, 18239, 16337, 19481, 16089, 694,
        17071, 19841, 17031, 19460, 19360, 19459, 19369, 19428, 19371, 19367, 19436, 19426, 9244, 11420, 1383, 2774, 1393, 8168, 19588,
        19853, 19380, 19461, 1684, 16110, 16112, 16258, 16211, 17068, 8062, 12941, 9314, 9302, 19362, 19381, 9315, 3597:
            streamingDistance = 400.0,
            drawingDistance = 400.0;

        // Medium objects - Semi-important, texts, fences, etc.
        case 1251, 1237, 981, 1423, 1459, 1282, 1424, 19087, 18980, 1256, 2942, 1257, 1483, 1342, 4642, 19327, 1408, 1506, 1557,
        19622, 1687, 18890, 968, 3521, 16281, 8407, 1569, 2111, 8613, 7597, 1432, 8674, 672, 8397, 3861, 3243, 1570, 967, 3406,
        7914, 2722, 19943, 1532, 3034, 3926, 1499, 13025, 920, 19483, 2567, 2944, 1305, 7246, 3761, 3886, 1497, 9241, 731, 715,
        2661, 19325, 19604:
            streamingDistance = 100.0,
            drawingDistance = 100.0;

        // Small objects - Not that important, decoration, small objects you will not see from far away, etc.
        case 1238, 19419, 1425, 18652, 18647, 978, 1319, 19966, 19967, 1435, 18646, 1216, 957, 19124, 19425, 19987, 1285, 638,
        997, 9131, 2921, 18014, 1328, 3810, 644, 1294, 3460, 1372, 1343, 1478, 3802, 1265, 1415, 2840, 1450, 1364, 3801, 1985,
        1359, 637, 2245, 860, 1232, 970, 1410, 1368, 1223, 945, 2252, 15038, 632, 1214, 2048, 2801, 1728, 1670, 919, 1487, 923,
        1449, 1429, 2714, 11611, 1228, 1513, 14679, 19630, 19639, 1604, 1599, 2556, 1558, 19996, 1486, 1338, 18632, 19121, 19871,
        1453, 1280, 636, 635, 1481, 19632, 19997, 2690, 1463, 1594, 1757, 917, 2806, 1347, 1517, 19823, 11744, 19824, 1455, 1544,
        2059, 19873, 19878, 1308, 1458, 1226, 925, 1217, 851, 852, 910, 2115, 924, 3407, 933, 1431, 19831, 1462, 1448, 2945, 19927,
        1622, 1600, 1689, 3273, 640, 19975, 626, 1215, 19126, 1744, 1721, 2161, 2162, 19893, 19994, 2173, 2824, 19977, 2737, 19974,
        19989, 19894, 1318, 2854, 2284, 2271:
            streamingDistance = 30.0,
            drawingDistance = 30.0;
    }
    return CreateDynamicObject(modelid, Float:x, Float:y, Float:z, Float:rx, Float:ry, Float:rz, .worldid = -1, .streamdistance = streamingDistance, .drawdistance = drawingDistance);
}

Kako koristiti? Samo je potrebno zamjeniti CreateDynamicObject sa CDO (ili kako ste ga vec nazvali)
CreateDynamicObject(OBJECT_ID, X, Y, Z, RX, RY, RZ);
CDO(OBJECT_ID, X, Y, Z, RX, RY, RZ);

Bitno je napomenuti, da je potreban Streamer kako bi ovo funkcionisalo. Ovo je mozda i nepotrebno napominjati jer 99% servera koristi Streamer kao neki osnovni plugin/include.

Kao sto je u primjeru pokazano, objekte mozete podjeliti u grupe: Veliki/Bitno objekti - Velike zgrade, siluete mapa itd, Srednji objekti - Koji nisu toliko vazni, ali sluze zbog npr. izgleda, ili text na mapama i sl., procjenite sami sta vam je bitno, a sta ne, i Male objekte/Dekoracije.
Jedini minus ovoga je to sto IDeve morate rucno upisivati i provjeravati.
Potrebno je vremena, ali isplati se na kraju krajeva.
Draw i stream distance mozete stavljati po svojoj volji, onoliko koliko smatrate da treba. Ukoliko imate manje objekata, mozete i povecati draw/stream distance.
Testirajte i nadite distance koje vama odgovaraju.

    new Float:streamingDistance = 100.0,
        Float:drawingDistance = 100.0;


Po defaultu je 300, tako da stavi na 300 

Citat: Bit Frosty poslato Septembar 10, 2024, 21:04:32 POSLE PODNE    new Float:streamingDistance = 100.0,
        Float:drawingDistance = 100.0;


Po defaultu je 300, tako da stavi na 300
Prepravljeno, to je ostalo kako sam kod sebe radio, jer sam tamo sve objekte ubacio, pa ako sam slucajno 1 ili 2 zaboravio, stavio sam da streama na 100


Što se tice ovih id-eva koje moraš ručno određivati, dobro bi bilo da napraviš
funkciju koja može da izmjeri širinu i visinu objekta na osnovu trenutnog id-a, i da na osnovu dobivenog rezultata odredi da li je objekat veliki ili mali.
I da mu onda stavi distancu, puno bi lakše bilo nego da igrać mora ručno dodavati.
Postoje plugini za ObjectModelSize..

Citat: K ROSE poslato Septembar 20, 2024, 14:20:34 POSLE PODNEŠto se tice ovih id-eva koje moraš ručno određivati, dobro bi bilo da napraviš
funkciju koja može da izmjeri širinu i visinu objekta na osnovu trenutnog id-a, i da na osnovu dobivenog rezultata odredi da li je objekat veliki ili mali.
I da mu onda stavi distancu, puno bi lakše bilo nego da igrać mora ručno dodavati.
Postoje plugini za ObjectModelSize..

To nisam znao da postoji, znam da na dev.prineside.com imaju dimenzije obekata, preko cega sam rucno i unosio.

Također u ovaj kod možeš da staviš prioritete, na primjer da prvo ocita sve vece objekte, pa tek onda najmanje.
Da ne ocitava sve odjednom.
Ja sam kod sebe tako pravio, skoro sam ubacio zlataru koja ima preko 1300 objekata,
SAMP klijent moze da prikaže 1000 objekata na jednom mjestu,
pa sam morao uraditi optimizaciju mape.
Ljudi isto pogrešno ubacuju mape, npr interijere, stave distancu na 300 metara po defaultu.
Nikakve logike nema da se objekat poput pepeljare za cigarete ocitava na distanci od 300m

Citat: K ROSE poslato Septembar 21, 2024, 04:40:06 PRE PODNETakođer u ovaj kod možeš da staviš prioritete, na primjer da prvo ocita sve vece objekte, pa tek onda najmanje.
Da ne ocitava sve odjednom.
Ja sam kod sebe tako pravio, skoro sam ubacio zlataru koja ima preko 1300 objekata,
SAMP klijent moze da prikaže 1000 objekata na jednom mjestu,
pa sam morao uraditi optimizaciju mape.
Ljudi isto pogrešno ubacuju mape, npr interijere, stave distancu na 300 metara po defaultu.
Nikakve logike nema da se objekat poput pepeljare za cigarete ocitava na distanci od 300m
Ima masu stvari koje ljudi rade pogresno ili jednostavno ne razumiju i slicno. Pocnimo od samog streamer plugina, koliko ljudi razume da on radi sa server side i da svaki create/destroy za objekte ide preko networka? Koliko ljudi shvata da se texture salju preko networka kao stringovi i da to stvara preopterecenje na upload link? Koliko ljudi razume da mi imamo streamer plugin, sa-mp streamer koji je client side, i gta sa enteties streamer koji je limitiran na 1000 enteties i 256mb video ram i da se sve koristi uvijek? Koliko ljudi recimo ima stream fix za gta a koliko nih nema? Mislim ulazimo u te stvari da ljudi ne znaju razliku izmedju stream i draw distance a i cude se kako im se mape lose ocitavaju i slicno, a iza obicne logike da veci objekti treabaju brze da se ocitaju stoji jos veca filozofija...Mislim pricamo o optimizaciji po velicini objekta a ljudi ni Virtual World ne koriste za mape kako bogu spada...

Ajde ovako, koliko je ljudi otvorilo streamer plugin source da vidi kako trenutno funkcionise? Koliko njih zna da se koristi grid system? Koliko je njih shvatilo da streamer se hook na sa-mp raknet i da recimo globalne objekte streamuje za svakoga igraca. To jest ne koristi CreateObject nego salje RPC...

Kada se radi o mapama za sa-mp ja ne znam jel ima makar 4-5 ljudi da znaju optimizovati kako treba, a da ne pricamo o volji da to urade. A i tih 4-5 ljudi ce biti ista ekipa koja visi zajedno...

@Bit Frosty
Razumijem šta želiš reći, i potpuno se slažem da postoji mnogo toga što većina ljudi ne razumije kada je u pitanju streamer plugin i način na koji funkcioniše na SA-MP serverima. Većina server administratora koristi gotova rješenja bez dubljeg razumijevanja kako stvari rade iza kulisa, bilo da se radi o kreiranju objekata, streamovanju tekstura ili korišćenju Virtual World-a za mape.

Međutim, ne možemo očekivati da svi igrači ili čak svi developeri detaljno prouče streamer plugin source code ili da razumiju grid sistem i načine na koje server komunicira sa klijentom preko RakNet-a. To je nivo optimizacije i tehničke ekspertize koji zahtjeva mnogo više truda i volje za učenjem.

Takođe, slažem se da je optimizacija mapa veoma zanemarena tema, ali je realnost da većina server vlasnika ili mappera nije spremna da uloži dodatno vrijeme da nauči o stvarima poput pravilne upotrebe Virtual World-a ili optimizacije velikih objekata po veličini i draw distance-u. Tu dolazi i problem sa resursima – mnogi se oslanjaju na gotove tutorijale ili pakete koji nisu optimizovani za njihove specifične potrebe.

Možda bi rješenje bilo više edukacije unutar zajednice. Razmjena iskustava među iskusnijim developerima mogla bi pomoći ostalima da bolje razumiju sve ove aspekte, jer trenutno ima jako malo resursa i vodiča koji se bave optimizacijom u kontekstu SA-MP servera. Kao što si rekao, malo je ljudi koji zaista znaju kako da to sve pravilno urade, a još manje onih koji imaju volju da se time bave.
Poslednja Izmena: Septembar 21, 2024, 11:36:56 PRE PODNE od K ROSE