Avatar utilizator
SCOOB
Administrator
Administrator
  • Mesaje: 4900
    Membru din: 07 Aug 2024, 18:53
  • Reacții: 120900
  • Mesaje utile: 47
  • Status: Pe aici.. 🤠
    Server: Saga2 - Soon
  • Regat: Jinno
  • [ID Discord]
  • Avatar utilizator
    SCOOB
    Administrator
    Administrator
    *Descriere:

    Metin2 Memory & Lifetime Fixes - Rezolvare Memory Leak Game si DB

    Acest fix rezolva mai multe probleme de memory leak si gestionare incorecta a memoriei din sursa Metin2, atat pe Game, cat si pe DB. Modificarile ajuta la eliberarea corecta a obiectelor si previn pastrarea unor pointeri invalizi dupa reload.

    - rezolva memory leak-uri in AccountDB si Player Delete;
    - elibereaza corect memoria dupa Shop si Skill Reload;
    - elimina pointerii vechi din Item Manager;
    - corecteaza eliberarea bufferului GuildMark la eroare;
    - modificarile sunt controlate prin ENABLE_MEMORY_LIFETIME_FIXES.


    *Link download / Code:

    Deschide common/service.h si adauga:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Deschide game/src/db.cpp si cauta functia:
    Code:
    void AccountDB::Process()

    In aceasta functie, SQLMsg este sters abia dupa terminarea buclei, moment in care pMsg este deja NULL.

    Modifica functia astfel incat obiectul sa fie eliberat la fiecare iteratie:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Nota: Daca functia ta contine si alte cazuri in switch, pastreaza-le. Modificarea importanta este mutarea lui delete pMsg in interiorul buclei.


    Deschide db/src/ClientManagerPlayer.cpp si adauga langa celelalte include-uri:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Cauta functia:
    Code:
    void CClientManager::__RESULT_PLAYER_DELETE(
        CPeer* peer,
        SQLMsg* msg
    )

    In aceasta functie cauta:
    Code:
    ClientHandleInfo* pi =
        static_cast<ClientHandleInfo*>(qi->pvData);

    Inlocuieste cu:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Restul apelurilor existente prin pi-> raman neschimbate. Folosirea std::unique_ptr permite eliberarea automata a contextului, inclusiv atunci cand functia se termina printr-un return anticipat.


    Deschide game/src/shop_manager.cpp si cauta functia:
    Code:
    bool CShopManager::Initialize(
        TShopTable* table,
        int size
    )

    Cauta zona unde sunt eliminati vizitatorii si sunt golite map-urile:
    Code:
    m_map_pkShop.clear();
    m_map_pkShopByNPCVnum.clear();

    Modifica partea de cleanup astfel:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Astfel, obiectele CShop sunt eliberate inainte de golirea map-urilor. m_map_pkShop ramane owner-ul, iar m_map_pkShopByNPCVnum contine doar referinte catre aceleasi instante.


    Deschide game/src/skill.cpp si cauta:
    Code:
    SendLog("There were errors when loading skill table");

    In blocul else pentru eroarea de incarcare a tabelului de skill-uri, adauga inainte de SendLog:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Blocul respectiv va avea urmatoarea structura:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Modificarea elibereaza obiectele CSkillProto create temporar atunci cand incarcarea noii tabele esueaza, fara sa modifice tabela activa.


    Deschide game/src/item_manager.cpp si cauta functia:
    Code:
    bool ITEM_MANAGER::Initialize(
        TItemTable* table,
        int size
    )

    Adauga la inceputul functiei, imediat dupa acolada de deschidere:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Aceste containere trebuie golite inainte ca m_vec_prototype sa fie reconstruit, pentru a evita pastrarea pointerilor catre vechea generatie de item proto.


    Deschide game/src/MarkImage.cpp si cauta blocul care verifica rezultatul functiei ilTexImage:
    Code:
    if (!ilTexImage(
        WIDTH,
        HEIGHT,
        1,
        4,
        IL_BGRA,
        IL_UNSIGNED_BYTE,
        data
    ))
    {
        sys_err(
            "GuildMarkImage: cannot initialize image"
        );
    
        return false;
    }

    Inlocuieste cu:
    Conținut: Ascuns
    Reacționează ❤️ la acest mesaj și conținutul se va afișa automat.



    Astfel, bufferul alocat prin malloc este eliberat inclusiv atunci cand initializarea imaginii esueaza.


    Atentie la CMobManager!

    In game/src/mob_manager.cpp exista o alta problema legata de lifetime-ul obiectelor CMob, insa autorul nu recomanda aplicarea unui M2_DELETE direct inainte de golirea map-urilor.

    La reload, unele caractere active pot pastra in continuare pointeri catre vechile date Mob Proto, ceea ce ar putea produce un Use After Free.

    Aceasta parte necesita o rezolvare separata:
    - construirea noii generatii Mob Proto;
    - actualizarea referintelor pentru instantele Non-PC active;
    - eliberarea generatiei vechi abia dupa actualizarea pointerilor.

    Nu sterge direct obiectele CMob fara sa verifici mai intai mecanismul de rebind din sursa ta.

    Nota: Codurile originale pot necesita ajustari de indentare sau formatare in functie de structura sursei Metin2 utilizate.

    Nou Cum descarc de pe TeraBox?

    Afișează detalii Ascunde detalii
    • Este asemănător cu Mega.nz
    • Instalați-vă clientul lor de Download de aici
    • Faceți-vă un cont (vă puteți loga cu Facebook / Google / etc)
    • Nou Dacă nu vreți să descărcați clientul de Download, folosiți acest site
    • Gata! Acum puteți descărca resursele rapid & simplu.

    De ce folosim TeraBox?

    • Este gratuit
    • Primești 1TB de spațiu gratuit la orice cont creat!
    • Este ușor de folosit și varianta premium este foarte ieftină
    • Fișierele nu sunt șterse niciodată
    TeraBox logo
    Comunitatea Metin2 Romania este si pe Discord! :ymcowboy:

    2500+ membri • Chat activ zilnic • Support • Cereri & Resurse

    ► discord.gg/jWxeDSf7HP ◄





    See full signature

    Înapoi la “FIX-uri”

    Discord ID copiat: