Great OfflineShop Memory Leak ( - FİX - )

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 53

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Yabancı Bir forumdan alıntıdır.

SQLMsg* pkMsg(DBManager::instance().DirectQuery(... :
Kod:
void CHARACTER::UpdateShopItems() Sonuna : delete Msg; ####################################################### void CHARACTER::LoadPrivShops() Sonuna: delete pkMsg; ####################################################### void CHARACTER::OpenShop(DWORD id, const char* name, bool onboot) Sonuna: pkMsg.reset(nullptr); ####################################################### ACMD(do_shop_update_item) Sonrasına:                     if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(30000, i))                     {                         CharacterVectorInteractor::iterator it = i.begin();                         while (it != i.end())                         {                             LPCHARACTER pc = *it++;                             if (pc)                                 if (pc->GetRaceNum() == 30000 && pc->GetPrivShop() == shop_id)                                 {                                     pc->UpdateShopItems();                                     return;                                 }                         }                     } Ekle:                     delete pkMsg;                    Sonrasına:                     if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(30000, i))                     {                         CharacterVectorInteractor::iterator it = i.begin();                         while (it != i.end())                         {                             LPCHARACTER pc = *it++;                             if (pc)                                 if (pc->GetRaceNum() == 30000 && pc->GetPrivShop() == shop_id)                                 {                                     pc->UpdateShopItems();                                     return;                                 }                         }                     } Ekle:                     delete pkMsg;                      Sonrasına:                             TPacketShopUpdateItem packet;                             packet.shop_id = shop_id;                             db_clientdesc->DBPacket(HEADER_GD_SHOP_UPDATE_ITEM, 0, &packet, sizeof(packet));                     }                 } Ekle:                 delete pkMsg;                      #######################################################    ACMD(do_shop_refresh_items)    sonuna : delete pkMsg; #######################################################    EVENTFUNC(fix_shop_event) Önce:     return PASSES_PER_SEC(SHOP_TIME_REFRESH * 60); Ekle:     delete pkMsg;

Metin2 Sunucularında Büyük OfflineShop Bellek Sızıntısı (Fix)
Metin2 özel sunucuları geliştirirken karşılaşılan bellek sızıntıları, özellikle uzun süre çalışan sistemlerde ciddi performans sorunlarına yol açabilir. Bu yazıda, OfflineShop sisteminde görülen büyük bellek sızıntısını ve çözümünü detaylı şekilde ele alacağız. Bu konu, Metin2 özel sunucu geliştirme, C++ sistem ve Python GUI gibi teknik konularla yakından ilişkilidir.

OfflineShop Sistemi Nedir?
OfflineShop, oyuncuların internete bağlı olmadan dükkanlarını açık bırakabildiği, kendi itemlerini satabildiği bir özelliktir. Özellikle Metin2 özel sunucularında popüler olan bu sistem, doğru yapılandırılmadığında ciddi bellek sızıntılarına neden olabilir. Sistem, genellikle py root ve uiscript dosyalarıyla entegre çalışır. Ancak hatalı bellek yönetimi durumunda, her işlemde yeni nesneler oluşturulup eski nesneler silinmeden sistem yavaş yavaş çökebilir.

Problemin Kaynağı
Bu sorun genellikle C++ tabanlı sunucu tarafında, nesne yaşam döngüsünün doğru yönetilememesinden kaynaklanır. Özellikle OfflineShop nesnesi her satış veya güncelleme işleminde bellekte kalır ve silinmezse, zamanla sistemde ciddi bir bellek birikimi oluşur. Bu da sunucunun yavaşlamasına veya tamamen çökmesine neden olabilir.

Fix Uygulaması
Fix uygulamak için öncelikle bellek tahsis edilen sınıflarda destructor metodunun doğru çalıştığından emin olunmalıdır. Ayrıca, game server programming sürecinde nesnelerin yaşam döngüsü manuel olarak kontrol edilmeli ve gereksiz bellek alanları serbest bırakılmalıdır. Örnek olarak, bir OfflineShop nesnesi silinmeden önce aşağıdaki adımlar yapılmalıdır:

- Shop verileri temizlenmeli
- Bağlı item referansları serbest bırakılmalı
- Bellek blokları doğru şekilde free edilmeli

Python Tarafında Dikkat Edilmesi Gerekenler
Python tarafında geliştirilen GUI arayüzlerinde, genellikle PyGUI veya UIScript kullanılır. Bu sistemlerde de nesne referansları dikkatlice yönetilmelidir. Özellikle pack işlemi sırasında nesnelerin tekrar tekrar yüklenip belleğe alınmaması sağlanmalıdır. Aksi takdirde, OfflineShop gibi dinamik sistemlerde ciddi bellek sızıntısı meydana gelebilir.

Metin2 Compile ve Source Edit Aşamalarında Dikkat
Sistemi düzeltmek için Metin2 server src üzerinde değişiklik yapmak gerekebilir. Bu süreçte, source edit işlemleri dikkatli yapılmalı ve her değişiklikten sonra derleme (compile) işlemi yapılarak test edilmelidir. Bu işlemler, Metin2 development ve Metin2dev süreçlerinde sıkça kullanılan yöntemlerdir.

Özet
Metin2 özel sunucularında OfflineShop sistemi, doğru yapılandırılmadığında büyük bellek sızıntılarına neden olabilir. Bu sorunun çözümü, hem C++ hem de Python tarafında nesne yaşam döngüsünü doğru yönetmeyi gerektirir. Game core, DB core, Channel gibi alt sistemlerle entegre çalışan bu yapılar, Martysama ve benzeri geliştiriciler tarafından sıkça optimize edilmektedir. Bellek sızıntılarını önlemek için düzenli olarak game server programming süreçlerinde testler yapılmalı ve gerekli düzeltmeler zamanında yapılmalıdır.


Great OfflineShop Memory Leak (Fix)
Memory leaks encountered while developing Metin2 private servers can cause serious performance issues on long-running systems. In this article, we will discuss the large memory leak observed in the OfflineShop system and its fix in detail. This topic is closely related to technical subjects such as Metin2 private server development, C++ system, and Python GUI.

What is the OfflineShop System?
OfflineShop is a feature that allows players to keep their shops open without being connected to the internet, selling their own items. This system, popular especially in Metin2 private servers, can cause significant memory leaks if not configured properly. The system typically works integrated with py root and uiscript files. However, incorrect memory management may lead to newly created objects remaining in memory without being deleted during each operation, eventually causing the system to crash slowly.

Source of the Problem
This issue generally stems from incorrect object lifecycle management on the C++-based server side. Especially when the OfflineShop object remains in memory without being deleted after each sale or update operation, over time, significant memory accumulation occurs in the system. This can result in the server slowing down or crashing entirely.

Applying the Fix
To apply the fix, first ensure that the destructor method correctly runs for classes where memory is allocated. Additionally, during game server programming, object lifecycles must be manually controlled and unnecessary memory blocks freed. For example, before deleting an OfflineShop object, the following steps should be taken:

- Clear shop data
- Release linked item references
- Free memory blocks correctly

Things to Consider on the Python Side
In GUI interfaces developed using Python, PyGUI or UIScript are commonly used. Object references must also be carefully managed in these systems. Especially during pack operations, objects should not repeatedly reload and occupy memory. Otherwise, significant memory leaks can occur in dynamic systems like OfflineShop.

Attention During Metin2 Compile and Source Edit Phases
Correcting the system may require modifications on Metin2 server src. During this process, source edit operations must be performed carefully, and after every change, a compilation (compile) should be executed and tested. These processes are frequently used methods in Metin2 development and Metin2dev phases.

Summary
In Metin2 private servers, the OfflineShop system can cause major memory leaks if not properly configured. Solving this problem requires correct object lifecycle management on both C++ and Python sides. Structures integrating with subsystems like game core, DB core, Channel are frequently optimized by developers like Martysama. To prevent memory leaks, tests must be regularly conducted during game server programming and necessary fixes applied timely.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt