- Katılım
- 12 May 2019
- Konular
- 21
- Mesajlar
- 384
- Çözüm
- 2
- Online süresi
- 17d 1h
- Reaksiyon Skoru
- 245
- Altın Konu
- 0
- TM Yaşı
- 7 Yıl 28 Gün
- Başarım Puanı
- 108
- MmoLira
- 1,332
- DevLira
- 21
ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!
Sorun:
Canavarlar,Simyalar, öğeler vb. için sabit boyutlu diziler içeren CHARACTER_POINT_INSTANT yapısını kullanılıyor. Her canavar için bu diziler bellek ayırıyor, ancak canavarlar bu belleği kullanmıyor...
Çözüm:
Sabit boyutlu dizileri std::map veya diğer veri türleri ile değiştirin
Kendi testlerime göre, özel envanter sistemi ve aşağıda listelenen optimize edilmiş değişkenlerle bellek kullanımında %70'in üzerinde azalma gördüm:
[CODE lang="cpp" title="Memory Fix"]
//in char.cpp at the end of void CHARACTER::Initialize() function add
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap.clear();
#endif
//in char.h after function LPITEM GetInventoryItem add
#ifdef ENABLE_ITEM_GRID_MAP
BYTE ItemGridMapGetConst(BYTE cell_index) const;
#endif
//in char.h replace BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX]; with
#ifdef ENABLE_ITEM_GRID_MAP
std::map<BYTE, BYTE> pItemsGridMap;
#else
BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX];
#endif
//in char_item.cpp replace function CHARACTER::SetItem with
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;
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap[p] = 0;
#else
m_pointsInstant.bItemGrid[p] = 0;
#endif
}
}
else
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap[wCell] = 0;
#else
m_pointsInstant.bItemGrid[wCell] = 0;
#endif
}
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;
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap[p] = wCell + 1;
#else
m_pointsInstant.bItemGrid[p] = wCell + 1;
#endif
}
}
else
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap[wCell] = wCell + 1;
#else
m_pointsInstant.bItemGrid[wCell] = wCell + 1;
#endif
}
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;
}
}
}
#ifdef 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;
}
}
#endif
//in char_item.cpp replace function CHARACTER::IsEmptyItemGrid with
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;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(bCell))
{
if (ItemGridMapGetConst(bCell) == iExceptionCell)
return true;
return false;
}
#else
if (m_pointsInstant.bItemGrid[bCell])
{
if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell)
return true;
return false;
}
#endif
if (bSize == 1)
return true;
}
else if (bCell >= INVENTORY_MAX_NUM)
return false;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(bCell))
{
if (ItemGridMapGetConst(bCell) == iExceptionCell)
#else
if (m_pointsInstant.bItemGrid[bCell])
{
if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell)
#endif
{
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;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(p))
if (ItemGridMapGetConst(p) != iExceptionCell)
return false;
#else
if (m_pointsInstant.bItemGrid[p])
if (m_pointsInstant.bItemGrid[p] != iExceptionCell)
return false;
#endif
}
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;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(p))
if (ItemGridMapGetConst(p) != iExceptionCell)
return false;
#else
if (m_pointsInstant.bItemGrid[p])
if (m_pointsInstant.bItemGrid[p] != iExceptionCell)
return false;
#endif
}
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;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(p))
#else
if (m_pointsInstant.bItemGrid[p])
#endif
if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell)
return false;
}
while (++j < bSize);
return true;
}
}
}
}[/CODE]
Canavarlar,Simyalar, öğeler vb. için sabit boyutlu diziler içeren CHARACTER_POINT_INSTANT yapısını kullanılıyor. Her canavar için bu diziler bellek ayırıyor, ancak canavarlar bu belleği kullanmıyor...
Çözüm:
Sabit boyutlu dizileri std::map veya diğer veri türleri ile değiştirin
Kendi testlerime göre, özel envanter sistemi ve aşağıda listelenen optimize edilmiş değişkenlerle bellek kullanımında %70'in üzerinde azalma gördüm:
[CODE lang="cpp" title="Memory Fix"]
//in char.cpp at the end of void CHARACTER::Initialize() function add
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap.clear();
#endif
//in char.h after function LPITEM GetInventoryItem add
#ifdef ENABLE_ITEM_GRID_MAP
BYTE ItemGridMapGetConst(BYTE cell_index) const;
#endif
//in char.h replace BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX]; with
#ifdef ENABLE_ITEM_GRID_MAP
std::map<BYTE, BYTE> pItemsGridMap;
#else
BYTE bItemGrid[INVENTORY_AND_EQUIP_SLOT_MAX];
#endif
//in char_item.cpp replace function CHARACTER::SetItem with
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;
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap[p] = 0;
#else
m_pointsInstant.bItemGrid[p] = 0;
#endif
}
}
else
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap[wCell] = 0;
#else
m_pointsInstant.bItemGrid[wCell] = 0;
#endif
}
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;
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap[p] = wCell + 1;
#else
m_pointsInstant.bItemGrid[p] = wCell + 1;
#endif
}
}
else
#ifdef ENABLE_ITEM_GRID_MAP
m_pointsInstant.pItemsGridMap[wCell] = wCell + 1;
#else
m_pointsInstant.bItemGrid[wCell] = wCell + 1;
#endif
}
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;
}
}
}
#ifdef 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;
}
}
#endif
//in char_item.cpp replace function CHARACTER::IsEmptyItemGrid with
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;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(bCell))
{
if (ItemGridMapGetConst(bCell) == iExceptionCell)
return true;
return false;
}
#else
if (m_pointsInstant.bItemGrid[bCell])
{
if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell)
return true;
return false;
}
#endif
if (bSize == 1)
return true;
}
else if (bCell >= INVENTORY_MAX_NUM)
return false;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(bCell))
{
if (ItemGridMapGetConst(bCell) == iExceptionCell)
#else
if (m_pointsInstant.bItemGrid[bCell])
{
if (m_pointsInstant.bItemGrid[bCell] == iExceptionCell)
#endif
{
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;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(p))
if (ItemGridMapGetConst(p) != iExceptionCell)
return false;
#else
if (m_pointsInstant.bItemGrid[p])
if (m_pointsInstant.bItemGrid[p] != iExceptionCell)
return false;
#endif
}
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;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(p))
if (ItemGridMapGetConst(p) != iExceptionCell)
return false;
#else
if (m_pointsInstant.bItemGrid[p])
if (m_pointsInstant.bItemGrid[p] != iExceptionCell)
return false;
#endif
}
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;
#ifdef ENABLE_ITEM_GRID_MAP
if (ItemGridMapGetConst(p))
#else
if (m_pointsInstant.bItemGrid[p])
#endif
if (m_pointsInstant.wDSItemGrid[p] != iExceptionCell)
return false;
}
while (++j < bSize);
return true;
}
}
}
}[/CODE]
En Çok Reaksiyon Alan Mesajlar
Kanıt var mı acaba merak ediyorum da bu arada çok bilgilisin
Senin 1 tane classın var 100tane işlem yapıyor sen bu classı 2 ye ayırdın
karakter ve mob olarak biri 60 işlem yapıyor diğeri 40 senin işlem gücün düşmüş olmuyor
aynı şekilde cpu kullanmaya devam eder oyun gereksiz yere hafıza ayırıyorsa tıp ki konuda olduğu gibi ozaman ram düşer
Konuya dönelim stl de map arraye göre yavaş çalışır array olarak yapın hatta array in smart pointer özelliğini kullanın
daha çok performans alın kodu optimize edin cpuyu düşürün bana böyle söyle baştacısın ama ben class ayırdım cpu düştü bu sadece kuru bir gürültü
Ben ne yazmışım sen ne anlamışsın garip bana anlatmak yerine önce dikkatli okuyun ne dediğimi çözmeye çalışın savunma durumuna geçmeden önce yazılım kafasına sahip olan biri olası durumları düşünür. sınıfı ayırınca aynı sınıfı kopyalarsanız hiç bir değişiklik olmaz sıfırdan komple yeni sınıf yazacaksın en baştan komple bütün hesaplamaları işlemleri yeniden yazarak yeni paketler yazarak gerekirse paket iletişimini en baştan yazacaksın tamamen bağımsız yapılacak stl ye fazla güvenme o stl bazı durumlarda yeterli performans sağlamaz daha zararlı oluyor örnek 32 bit bir uygulamanın 64 de taşındığında işlem sürelerinin düşmesi beklenir ama stl de bulunan yaygın kullanılan fonksiyonlarda vs çoğu durumda bu tam tersi daha fazla uzun sürüyor işlemler o yüzden yapmak istenilen şeye göre en verimli yol planlanır gerekirse yeni algoritmalar ile yeni fonksiyonlar yazılır hazır kütüphane kullanmak yerine. Kuru gültü diye düşünebilirsin öyle devam et bir insan ne zaman bir şeyler bildiğini sanarsa o zaman hata yapar dikkatli ol her şeyi doğru sanma bir gün yenisini öğrenirsin o doğru bildiğin herşey bir anda yanlış olduğunu öğrenirsin kendini her zaman geliştir. Bu konudaki işlem benim gözümde yetersiz senin dediğin array mantığı da aynı şekilde yetersiz komple envanter yapısının baştan yazılması planlanması gerek normalde bu işlemler sadece kısa vadede iş görür global bir yeni mmorpg oyun yazmaya başlanırsa asla böyle bir envanter sistemi yazılamaz yetersiz kalır çünkü.
- Katılım
- 24 Eki 2013
- Konular
- 295
- Mesajlar
- 5,953
- Çözüm
- 2
- Online süresi
- 3mo 11d
- Reaksiyon Skoru
- 1,566
- Altın Konu
- 2
- Başarım Puanı
- 302
- MmoLira
- 3,476
- DevLira
- 21
Kanıt var mı acaba merak ediyorum da bu arada çok bilgilisin 

- Katılım
- 12 Kas 2021
- Konular
- 0
- Mesajlar
- 4
- Online süresi
- 33m 59s
- Reaksiyon Skoru
- 2
- Altın Konu
- 0
- TM Yaşı
- 4 Yıl 6 Ay 28 Gün
- Başarım Puanı
- 4
- MmoLira
- 4
- DevLira
- 0
Paylaşım için teşekkürler.
Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)
Benzer konular
- Cevaplar
- 8
- Görüntüleme
- 305
- Cevaplar
- 11
- Görüntüleme
- 545
- Cevaplar
- 12
- Görüntüleme
- 582
- Cevaplar
- 20
- Görüntüleme
- 788
- Cevaplar
- 9
- Görüntüleme
- 436






