Ram kullanımını %70 düşürün türkçe

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

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Kod:
// char.cpp'de void CHARACTER::Initialize() işlevinin sonuna ekleyin [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP m_pointsInstant.pItemsGridMap.clear(); [HASH=3]#endif[/HASH] // char.h'de LPITEM GetInventoryItem add hemen altına ekleyin [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP     BYTE    ItemGridMapGetConst(BYTE cell_index) const; [HASH=3]#endif[/HASH] //char.h'de BYTE bItemGrid'i değiştirin [INVENTORY_AND_EQUIP_SLOT_MAX]; ile [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP     std::map<BYTE, BYTE> pItemsGridMap; [HASH=2311]#else[/HASH]     BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX]; [HASH=3]#endif[/HASH] //char_item.cpp içinde CHARACTER::SetItem işlevini değiştirin void CHARACTER::SetItem(TItemPos Cell, LPITEM pItem) {     WORD wCell = Cell.cell;     BYTE window_type = Cell.window_type;     if ((unsigned long)((CItem*)pItem) == 0xff || (unsigned long)((CItem*)pItem) == 0xffffffff)     {         sys_err("!!! FATAL ERROR !!! item == 0xff (char: %s cell: %u)", GetName(), wCell);         core_dump();         return;     }     if (pItem && pItem->GetOwner())     {         assert(!"GetOwner exist");         return;     }       switch(window_type)     {     case INVENTORY:     case EQUIPMENT:         {             if (wCell >= INVENTORY_AND_EQUIP_SLOT_MAX)             {                 sys_err("CHARACTER::SetItem: invalid item cell %d", wCell);                 return;             }             LPITEM pOld = m_pointsInstant.pItems[wCell];             if (pOld)             {                 if (wCell < INVENTORY_MAX_NUM)                 {                     for (int i = 0; i < pOld->GetSize(); ++i)                     {                         int p = wCell + (i * 5);                         if (p >= INVENTORY_MAX_NUM)                             continue;                         if (m_pointsInstant.pItems[p] && m_pointsInstant.pItems[p] != pOld)                             continue; [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP                         m_pointsInstant.pItemsGridMap[p] = 0; [HASH=2311]#else[/HASH]                         m_pointsInstant.bItemGrid[p] = 0; [HASH=3]#endif[/HASH]                     }                 }                 else [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP                     m_pointsInstant.pItemsGridMap[wCell] = 0; [HASH=2311]#else[/HASH]                     m_pointsInstant.bItemGrid[wCell] = 0; [HASH=3]#endif[/HASH]             }             if (pItem)             {                 if (wCell < INVENTORY_MAX_NUM)                 {                     for (int i = 0; i < pItem->GetSize(); ++i)                     {                         int p = wCell + (i * 5);                         if (p >= INVENTORY_MAX_NUM)                             continue;                      [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP                         m_pointsInstant.pItemsGridMap[p] = wCell + 1; [HASH=2311]#else[/HASH]                         m_pointsInstant.bItemGrid[p] = wCell + 1; [HASH=3]#endif[/HASH]                     }                 }                 else [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP                     m_pointsInstant.pItemsGridMap[wCell] = wCell + 1; [HASH=2311]#else[/HASH]                     m_pointsInstant.bItemGrid[wCell] = wCell + 1; [HASH=3]#endif[/HASH]             }             m_pointsInstant.pItems[wCell] = pItem;         }         break;     case DRAGON_SOUL_INVENTORY:         {             LPITEM pOld = m_pointsInstant.pDSItems[wCell];             if (pOld)             {                 if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)                 {                     for (int i = 0; i < pOld->GetSize(); ++i)                     {                         int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);                         if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)                             continue;                         if (m_pointsInstant.pDSItems[p] && m_pointsInstant.pDSItems[p] != pOld)                             continue;                         m_pointsInstant.wDSItemGrid[p] = 0;                     }                 }                 else                     m_pointsInstant.wDSItemGrid[wCell] = 0;             }             if (pItem)             {                 if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)                 {                     sys_err("CHARACTER::SetItem: invalid DS item cell %d", wCell);                     return;                 }                 if (wCell < DRAGON_SOUL_INVENTORY_MAX_NUM)                 {                     for (int i = 0; i < pItem->GetSize(); ++i)                     {                         int p = wCell + (i * DRAGON_SOUL_BOX_COLUMN_NUM);                         if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)                             continue;                         m_pointsInstant.wDSItemGrid[p] = wCell + 1;                     }                 }                 else                     m_pointsInstant.wDSItemGrid[wCell] = wCell + 1;             }             m_pointsInstant.pDSItems[wCell] = pItem;         }         break;     default:         sys_err ("Invalid Inventory type %d", window_type);         return;     }     if (GetDesc())     {         if (pItem)         {             TPacketGCItemSet pack;             pack.header = HEADER_GC_ITEM_SET;             pack.Cell = Cell;             pack.count = pItem->GetCount();             pack.vnum = pItem->GetVnum();             pack.flags = pItem->GetFlag();             pack.anti_flags    = pItem->GetAntiFlag();             pack.highlight = (Cell.window_type == DRAGON_SOUL_INVENTORY);             thecore_memcpy(pack.alSockets, pItem->GetSockets(), sizeof(pack.alSockets));             thecore_memcpy(pack.aAttr, pItem->GetAttributes(), sizeof(pack.aAttr));             GetDesc()->Packet(&pack, sizeof(TPacketGCItemSet));         }         else         {             TPacketGCItemDelDeprecated pack;             pack.header = HEADER_GC_ITEM_DEL;             pack.Cell = Cell;             pack.count = 0;             pack.vnum = 0;             memset(pack.alSockets, 0, sizeof(pack.alSockets));             memset(pack.aAttr, 0, sizeof(pack.aAttr));             GetDesc()->Packet(&pack, sizeof(TPacketGCItemDelDeprecated));         }     }     if (pItem)     {         pItem->SetCell(this, wCell);         switch (window_type)         {         case INVENTORY:         case EQUIPMENT:             if ((wCell < INVENTORY_MAX_NUM) || (BELT_INVENTORY_SLOT_START <= wCell && BELT_INVENTORY_SLOT_END > wCell))                 pItem->SetWindow(INVENTORY);             else                 pItem->SetWindow(EQUIPMENT);             break;         case DRAGON_SOUL_INVENTORY:             pItem->SetWindow(DRAGON_SOUL_INVENTORY);             break;         }     } } [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP BYTE CHARACTER::ItemGridMapGetConst(BYTE cell_index) const {     auto it = m_pointsInstant.pItemsGridMap.find(cell_index);     if (it != m_pointsInstant.pItemsGridMap.end())     {         return it->second;     }     else     {         return 0;     } } [HASH=3]#endif[/HASH] //char_item.cpp içinde CHARACTER::IsEmptyItemGrid işlevini şununla değiştirin bool CHARACTER::IsEmptyItemGrid(TItemPos Cell, BYTE bSize, int iExceptionCell) const {     switch (Cell.window_type)     {     case INVENTORY:         {             BYTE bCell = Cell.cell;             ++iExceptionCell;             if (Cell.IsBeltInventoryPosition())             {                 LPITEM beltItem = GetWear(WEAR_BELT);                 if (NULL == beltItem)                     return false;                 if (false == CBeltInventoryHelper::IsAvailableCell(bCell - BELT_INVENTORY_SLOT_START, beltItem->GetValue(0)))                     return false; [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP                 if (ItemGridMapGetConst(bCell))                 {                     if (ItemGridMapGetConst(bCell) == iExceptionCell)                         return true;                     return false;                 } [HASH=2311]#else[/HASH]                 if (m_pointsInstant.bItemGrid[bCell])                 {                     if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell)                         return true;                     return false;                 } [HASH=3]#endif[/HASH]                 if (bSize == 1)                     return true;             }             else if (bCell >= INVENTORY_MAX_NUM)                 return false; [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP             if (ItemGridMapGetConst(bCell))             {                 if (ItemGridMapGetConst(bCell) == iExceptionCell) [HASH=2311]#else[/HASH]             if (m_pointsInstant.bItemGrid[bCell])             {                 if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell) [HASH=3]#endif[/HASH]                 {                     if (bSize == 1)                         return true;                     int j = 1;                     BYTE bPage = bCell / (INVENTORY_MAX_NUM / 2);                     do                     {                         BYTE p = bCell + (5 * j);                         if (p >= INVENTORY_MAX_NUM)                             return false;                         if (p / (INVENTORY_MAX_NUM / 2) != bPage)                             return false; [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP                         if (ItemGridMapGetConst(p))                             if (ItemGridMapGetConst(p) != iExceptionCell)                                 return false; [HASH=2311]#else[/HASH]                         if (m_pointsInstant.bItemGrid[p])                             if (m_pointsInstant.bItemGrid[p] != iExceptionCell)                                 return false; [HASH=3]#endif[/HASH]                      }                     while (++j < bSize);                     return true;                 }                 else                     return false;             }             if (1 == bSize)                 return true;             else             {                 int j = 1;                 BYTE bPage = bCell / (INVENTORY_MAX_NUM / 2);                 do                 {                     BYTE p = bCell + (5 * j);                     if (p >= INVENTORY_MAX_NUM)                         return false;                     if (p / (INVENTORY_MAX_NUM / 2) != bPage)                         return false; [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP                     if (ItemGridMapGetConst(p))                         if (ItemGridMapGetConst(p) != iExceptionCell)                             return false; [HASH=2311]#else[/HASH]                     if (m_pointsInstant.bItemGrid[p])                         if (m_pointsInstant.bItemGrid[p] != iExceptionCell)                             return false; [HASH=3]#endif[/HASH]                 }                 while (++j < bSize);                 return true;             }         }         break;     case DRAGON_SOUL_INVENTORY:         {             WORD wCell = Cell.cell;             if (wCell >= DRAGON_SOUL_INVENTORY_MAX_NUM)                 return false;             iExceptionCell++;             if (m_pointsInstant.wDSItemGrid[wCell])             {                 if (m_pointsInstant.wDSItemGrid[wCell] == iExceptionCell)                 {                     if (bSize == 1)                         return true;                     int j = 1;                     do                     {                         BYTE p = wCell + (DRAGON_SOUL_BOX_COLUMN_NUM * j);                         if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)                             return false;                         if (m_pointsInstant.wDSItemGrid[p])                             if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell)                                 return false;                     }                     while (++j < bSize);                     return true;                 }                 else                     return false;             }             if (1 == bSize)                 return true;             else             {                 int j = 1;                 do                 {                     BYTE p = wCell + (DRAGON_SOUL_BOX_COLUMN_NUM * j);                     if (p >= DRAGON_SOUL_INVENTORY_MAX_NUM)                         return false; [HASH=2]#ifdef[/HASH] ENABLE_ITEM_GRID_MAP                     if (ItemGridMapGetConst(p)) [HASH=2311]#else[/HASH]                     if (m_pointsInstant.bItemGrid[p]) [HASH=3]#endif[/HASH]                         if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell)                             return false;                 }                 while (++j < bSize);                 return true;             }         }     } }

Metin2 Sunucularında RAM Kullanımını %70 Azaltmak

Metin2 özel sunucuları geliştirirken karşılaşılan en yaygın sorunlardan birisi yüksek bellek (RAM) tüketimidir. Özellikle yoğun oyuncu trafiği sırasında sunucu performansı ciddi şekilde düşebilir. Bu yazıda, Metin2 özel sunucularında RAM kullanımını %70 oranında düşürebileceğiniz yöntemleri detaylıca ele alacağız. Bu süreçte C++ sistem düzenlemeleri, kaynak kod optimizasyonları ve yapısal değişiklikler gibi teknik konulara değineceğiz.

Sunucu Çekirdeğindeki Bellek Sızıntısını Belirlemek

RAM tüketimini azaltmaya başlamadan önce, mevcut bellek sızıntılarını belirlemek büyük önem taşır. Özellikle game server programming sürecinde, nesnelerin doğru şekilde bellekten silinmemesi bellek sızıntlarına neden olur. C++ tabanlı Metin2 server src dosyalarında bu tür sızıntılar sıkça görülür. Memory leak detection araçlarını kullanarak bu durumları erken aşamada tespit edebilirsiniz.

Oyun Veritabanı (DB) Optimize Edilmesi

Veritabanı işlemleri sırasında da RAM üzerinde ciddi yük oluşabilir. Özellikle DB Core yapılarında, gereksiz sorguların tekrarlanması ya da indekslenmemiş veri sorgulamaları RAM tüketimini artırır. Bu tür işlemlerde sorguları optimize etmek, RAM kullanımını önemli ölçüde düşürür. Metin2 DB üzerinde çalışırken, veri çekme işlemlerini minimum seviyeye indirmek büyük fark yaratır.

Python GUI ve Uiscript Kullanımı

Metin2 özel sunucularında arayüz ve kullanıcı deneyimi için Python GUI veya Uiscript dosyaları kullanılır. Ancak bu dosyalarda fazla nesne oluşturulması ya da gereksiz döngüler RAM tüketimini artırabilir. Py Root dosyalarında gereksiz fonksiyon çağrılarını engellemek, RAM kullanımını azaltmaya yardımcı olur.

Paketleme ve Sunucu Paketi Optimizasyonu

Metin2 sunucularında pack adı verilen sistem dosyaları çok önemlidir. Bu paketlerin içinde gereksiz dosya ve resimler yer alıyorsa, bu durum bellek üzerinde ekstra yük oluşturur. Paketlerinizi gözden geçirerek, RAM tüketimini azaltmak için gereksiz içerikleri kaldırmanız önerilir. Özellikle görsel içeriklerin sıkıştırılması ve optimize edilmesi RAM tasarrufu sağlar.

MartySama ve Diğer Geliştirici Kaynakları

Metin2 geliştiricileri arasında popüler olan MartySama gibi geliştiricilerin sunduğu sistemler, RAM optimizasyonu açısından incelenmelidir. Bu tür sistemlerde yer alan C++ source edit örnekleri, bellek yönetimi açısından öğrenilmesi gereken önemli kaynaklardır. Önemli:[/BR]Kaynak kodlarda yapılan her değişiklik, RAM tüketimini doğrudan etkileyebilir. Bu yüzden düzenlemeler özenle yapılmalıdır.

Metin2 PVP Sistemleri ve Performans

Metin2 PVP sistem tasarımı sırasında da RAM tüketimi önemli bir faktördür. Özellikle savaş esnasında nesnelerin yaratılması ve yok edilmesi RAM üzerinde ani artışlara neden olabilir. Bu tür sistemlerde object pooling gibi teknikler kullanmak, bellek yönetimini optimize eder. Bu sayede RAM tüketimi azaltılırken aynı zamanda sunucu performansı artırılır.

Sunucu Kanalı (Channel) Yönetimi

Birden fazla kanal barındıran Metin2 sunucularında, her kanal ayrı bir işlem olarak RAM üzerinde yer kaplar. Kanal sayısını azaltmak ya da kanallar arası veri paylaşımını optimize etmek RAM kullanımını azaltabilir. Ayrıca kanal başına aktif oyuncu sayısını sınırlandırmak, RAM tüketimini daha dengeli hale getirir.

Sonuç

Metin2 özel sunucularında RAM tüketimini %70 oranında düşürmek, sadece teknik bilgiye sahip olmayı değil, aynı zamanda dikkatli sistem yönetimi gerektirir. C++ kaynak kodların düzenlenmesi, DB optimizasyonu, Python GUI ayarları ve PVP sistemlerinin optimize edilmesiyle bu hedefe ulaşmak mümkündür. Metin2Lobby üzerinden daha fazla sistem kaynağına ulaşabilir, gelişmiş destek alabilirsiniz.


Reducing RAM Usage by 70% on Metin2 Servers

One of the most common issues encountered while developing Metin2 private servers is high memory (RAM) consumption. Especially during periods of heavy player traffic, server performance can significantly decrease. In this article, we will detail methods to reduce RAM usage by up to 70% on Metin2 private servers. We will cover technical topics such as C++ system modifications, source code optimizations, and structural changes.

Identifying Memory Leaks in the Server Core

Before reducing RAM usage, identifying existing memory leaks is crucial. During game server programming, objects not being properly deleted from memory often cause memory leaks. Such leaks are frequently seen in C++ based Metin2 server src files. Using memory leak detection tools can help identify these issues early in the process.

Optimizing Game Database (DB)

Database operations can also create significant load on RAM. Particularly in DB Core structures, repeating unnecessary queries or querying unindexed data increases RAM consumption. Optimizing queries in such operations can greatly reduce RAM usage. When working with Metin2 DB, minimizing data retrieval operations can make a significant difference.

Using Python GUI and Uiscript

In Metin2 private servers, Python GUI or Uiscript files are used for interface and user experience. However, creating too many objects or unnecessary loops in these files can increase RAM consumption. Avoiding unnecessary function calls in Py Root files helps reduce RAM usage.

Packaging and Server Pack Optimization

System files known as pack are very important in Metin2 servers. If these packs contain unnecessary files or images, they create additional load on memory. Reviewing your packs and removing unnecessary content is recommended to reduce RAM usage. Compressing and optimizing visual content, in particular, can save RAM.

MartySama and Other Developer Resources

Popular developers like MartySama among Metin2 developers offer systems that should be examined for RAM optimization. Examples of C++ source edit found in such systems are important resources to learn about memory management. Important:[/BR]Any changes made in source codes can directly affect RAM consumption, so modifications must be done carefully.

Metin2 PVP Systems and Performance

RAM consumption is also a critical factor when designing Metin2 PVP systems. Especially during combat, creating and destroying objects can cause sudden spikes in RAM. Using techniques like object pooling in such systems optimizes memory management. This reduces RAM consumption while also improving server performance.

Server Channel Management

In Metin2 servers hosting multiple channels, each channel takes up space in RAM as a separate process. Reducing the number of channels or optimizing data sharing between them can decrease RAM usage. Additionally, limiting the number of active players per channel helps balance RAM consumption more evenly.

Conclusion

Reducing RAM consumption by 70% on Metin2 private servers requires not only technical knowledge but also careful system management. By editing C++ source codes, optimizing DB, adjusting Python GUI settings, and optimizing PVP systems, this goal is achievable. You can access more system resources and receive advanced support through Metin2Lobby.
 

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

Geri
Üst Alt