- Mesaj
- 29
- Çözümler
- 1
- Beğeni
- 10
- Puan
- 23
- Ticaret Puanı
- 0
İstek - oto toplama sistemi şu konunun yorumunda verilen sistemi ekledim fakat çok yavaş topluyor, toplamayı nasıl hızlandırabilirim?
game.py tarafından baktım da olmadı hocam vallabelki game.pye import time ekleyerek yapabilirsin if current time last auto pick time tarzı bi şey yapabilirsin ama kesin bir şey demiyorum daha fazla hızlı olması için c++ taraflı yapman lazım sanırım
hocam cevap için sağolun bende aynı şeyi demeye çalışmıştım aslında zaten dediğiniz gibi sadece denesin zarar gelmez amacıyla yazdım c++ daha çok uğraştırıcağından biraz kolay yönteme başvurdumHocam, game.py tarafında time ile süre kontrolü eklemek toplama hızını artırmaz, aksine çağrı sıklığını düşürebilir. Paylaştığın kodda PickCloseItem() ve PickCloseMoney() her Update döngüsünde çalışıyor ama her çağrıda yalnızca bir nesne için toplama paketi gönderiliyor.
Bence öncelikle C++ tarafındaki GetCloseItem() ve GetCloseMoney() fonksiyonlarını incelemek lazım. Yakındaki nesneleri bulma işlemi ve sunucunun toplama paketlerini işleme şekli hızı etkiliyor olabilir. Daha hızlı toplamak için yakın nesneleri tek seferde listeleyip işlemek düşünülebilir; ancak bunun gerçekten toplu çalışması için sunucu tarafının da desteklemesi gerekir. Sadece game.py üzerinden süreyi değiştirmek pek çözüm olmaz.
// ARATILIR:
bool GetCloseMoney(const TPixelPosition & c_rPixelPosition, DWORD* dwItemID, DWORD dwDistance=300);
// ALTINA EKLENIR:
void GetCloseItemList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList);
void GetCloseMoneyList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList);
// Arat (GetCloseItem fonksiyonunun içinde):
TGroundItemInstance * pInstance = i->second;
DWORD dwxDistance = DWORD(c_rPixelPosition.x)-DWORD(pInstance->v3EndPosition.x); // @fixme022
// Değiştir:
TGroundItemInstance * pInstance = i->second;
if (pInstance->dwVirtualNumber==VNUM_MONEY)
continue;
DWORD dwxDistance = DWORD(c_rPixelPosition.x)-DWORD(pInstance->v3EndPosition.x); // @fixme022
// Arat:
bool CPythonItem::GetCloseItem(const TPixelPosition & c_rPixelPosition, DWORD * pdwItemID, DWORD dwDistance)
// Ekle:
static void __GetCloseGroundItemList(CPythonItem::TGroundItemInstanceMap & rMap, const TPixelPosition & c_rPixelPosition, DWORD dwDistance, bool bMoney, std::vector<DWORD> & rVIDList)
{
const float fMaxDistance = float(dwDistance)*float(dwDistance);
CPythonItem::TGroundItemInstanceMap::iterator i;
for (i = rMap.begin(); i != rMap.end(); ++i)
{
CPythonItem::TGroundItemInstance * pInstance = i->second;
const bool bIsMoney = (pInstance->dwVirtualNumber == CPythonItem::VNUM_MONEY);
if (bIsMoney != bMoney)
continue;
float fx = c_rPixelPosition.x - pInstance->v3EndPosition.x;
float fy = c_rPixelPosition.y - (-pInstance->v3EndPosition.y);
if (fx*fx + fy*fy <= fMaxDistance)
rVIDList.push_back(i->first);
}
}
void CPythonItem::GetCloseItemList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList)
{
__GetCloseGroundItemList(m_GroundItemInstanceMap, c_rPixelPosition, dwDistance, false, rVIDList);
}
void CPythonItem::GetCloseMoneyList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList)
{
__GetCloseGroundItemList(m_GroundItemInstanceMap, c_rPixelPosition, dwDistance, true, rVIDList);
}
// Arat:
void CPythonPlayer::PickCloseMoney()
{
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
TPixelPosition kPPosMain;
pkInstMain->NEW_GetPixelPosition(&kPPosMain);
DWORD dwItemID;
CPythonItem& rkItem=CPythonItem::Instance();
if (!rkItem.GetCloseMoney(kPPosMain, &dwItemID, __GetPickableDistance()))
return;
SendClickItemPacket(dwItemID);
}
void CPythonPlayer::PickCloseItem()
{
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
TPixelPosition kPPosMain;
pkInstMain->NEW_GetPixelPosition(&kPPosMain);
DWORD dwItemID;
CPythonItem& rkItem=CPythonItem::Instance();
if (!rkItem.GetCloseItem(kPPosMain, &dwItemID, __GetPickableDistance()))
return;
SendClickItemPacket(dwItemID);
}
// Değiştir:
void CPythonPlayer::PickCloseMoney()
{
static DWORD s_dwLastTime = 0;
DWORD dwNow = ELTimer_GetMSec();
if (dwNow - s_dwLastTime < 150)
return;
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
TPixelPosition kPPosMain;
pkInstMain->NEW_GetPixelPosition(&kPPosMain);
std::vector<DWORD> vidList;
CPythonItem::Instance().GetCloseMoneyList(kPPosMain, __GetPickableDistance(), vidList);
if (vidList.empty())
return;
s_dwLastTime = dwNow;
for (size_t i = 0; i < vidList.size(); ++i)
SendClickItemPacket(vidList[i]);
}
void CPythonPlayer::PickCloseItem()
{
static DWORD s_dwLastTime = 0;
DWORD dwNow = ELTimer_GetMSec();
if (dwNow - s_dwLastTime < 150)
return;
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
TPixelPosition kPPosMain;
pkInstMain->NEW_GetPixelPosition(&kPPosMain);
std::vector<DWORD> vidList;
CPythonItem::Instance().GetCloseItemList(kPPosMain, __GetPickableDistance(), vidList);
if (vidList.empty())
return;
s_dwLastTime = dwNow;
for (size_t i = 0; i < vidList.size(); ++i)
SendClickItemPacket(vidList[i]);
}
edeyim hocamPythonItem.h:// ARATILIR: bool GetCloseMoney(const TPixelPosition & c_rPixelPosition, DWORD* dwItemID, DWORD dwDistance=300); // ALTINA EKLENIR: void GetCloseItemList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList); void GetCloseMoneyList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList);
PythonItem.cpp:// Arat (GetCloseItem fonksiyonunun içinde): TGroundItemInstance * pInstance = i->second; DWORD dwxDistance = DWORD(c_rPixelPosition.x)-DWORD(pInstance->v3EndPosition.x); // @fixme022 // Değiştir: TGroundItemInstance * pInstance = i->second; if (pInstance->dwVirtualNumber==VNUM_MONEY) continue; DWORD dwxDistance = DWORD(c_rPixelPosition.x)-DWORD(pInstance->v3EndPosition.x); // @fixme022 // Arat: bool CPythonItem::GetCloseItem(const TPixelPosition & c_rPixelPosition, DWORD * pdwItemID, DWORD dwDistance) // Ekle: static void __GetCloseGroundItemList(CPythonItem::TGroundItemInstanceMap & rMap, const TPixelPosition & c_rPixelPosition, DWORD dwDistance, bool bMoney, std::vector<DWORD> & rVIDList) { const float fMaxDistance = float(dwDistance)*float(dwDistance); CPythonItem::TGroundItemInstanceMap::iterator i; for (i = rMap.begin(); i != rMap.end(); ++i) { CPythonItem::TGroundItemInstance * pInstance = i->second; const bool bIsMoney = (pInstance->dwVirtualNumber == CPythonItem::VNUM_MONEY); if (bIsMoney != bMoney) continue; float fx = c_rPixelPosition.x - pInstance->v3EndPosition.x; float fy = c_rPixelPosition.y - (-pInstance->v3EndPosition.y); if (fx*fx + fy*fy <= fMaxDistance) rVIDList.push_back(i->first); } } void CPythonItem::GetCloseItemList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList) { __GetCloseGroundItemList(m_GroundItemInstanceMap, c_rPixelPosition, dwDistance, false, rVIDList); } void CPythonItem::GetCloseMoneyList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList) { __GetCloseGroundItemList(m_GroundItemInstanceMap, c_rPixelPosition, dwDistance, true, rVIDList); }
PythonPlayerInput.cpp:// Arat: void CPythonPlayer::PickCloseMoney() { CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); DWORD dwItemID; CPythonItem& rkItem=CPythonItem::Instance(); if (!rkItem.GetCloseMoney(kPPosMain, &dwItemID, __GetPickableDistance())) return; SendClickItemPacket(dwItemID); } void CPythonPlayer::PickCloseItem() { CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); DWORD dwItemID; CPythonItem& rkItem=CPythonItem::Instance(); if (!rkItem.GetCloseItem(kPPosMain, &dwItemID, __GetPickableDistance())) return; SendClickItemPacket(dwItemID); } // Değiştir: void CPythonPlayer::PickCloseMoney() { static DWORD s_dwLastTime = 0; DWORD dwNow = ELTimer_GetMSec(); if (dwNow - s_dwLastTime < 150) return; CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); std::vector<DWORD> vidList; CPythonItem::Instance().GetCloseMoneyList(kPPosMain, __GetPickableDistance(), vidList); if (vidList.empty()) return; s_dwLastTime = dwNow; for (size_t i = 0; i < vidList.size(); ++i) SendClickItemPacket(vidList[i]); } void CPythonPlayer::PickCloseItem() { static DWORD s_dwLastTime = 0; DWORD dwNow = ELTimer_GetMSec(); if (dwNow - s_dwLastTime < 150) return; CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); std::vector<DWORD> vidList; CPythonItem::Instance().GetCloseItemList(kPPosMain, __GetPickableDistance(), vidList); if (vidList.empty()) return; s_dwLastTime = dwNow; for (size_t i = 0; i < vidList.size(); ++i) SendClickItemPacket(vidList[i]); }
kaldırmadıysan test eder misin?
Hocam, mantık olarak hızlandırabilir ama bu kod gerçek toplu paket göndermiyor; yakınındaki tüm itemlerin VID'lerini listeleyip her biri için ayrı SendClickItemPacket() çağırıyor. Bir de s_dwLastTime değerini boş liste kontrolünden önce güncellemek gerekiyor; aksi hâlde yerde item yokken her Update'te tarama yapılır. Daha sağlıklı bir çözüm için gönderilen paket sayısını sınırlandırmak ve mümkünse sunucu tarafında toplu toplama desteği eklemek gerekir. m2devde örnek var toplu içinPythonItem.h:// ARATILIR: bool GetCloseMoney(const TPixelPosition & c_rPixelPosition, DWORD* dwItemID, DWORD dwDistance=300); // ALTINA EKLENIR: void GetCloseItemList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList); void GetCloseMoneyList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList);
PythonItem.cpp:// Arat (GetCloseItem fonksiyonunun içinde): TGroundItemInstance * pInstance = i->second; DWORD dwxDistance = DWORD(c_rPixelPosition.x)-DWORD(pInstance->v3EndPosition.x); // @fixme022 // Değiştir: TGroundItemInstance * pInstance = i->second; if (pInstance->dwVirtualNumber==VNUM_MONEY) continue; DWORD dwxDistance = DWORD(c_rPixelPosition.x)-DWORD(pInstance->v3EndPosition.x); // @fixme022 // Arat: bool CPythonItem::GetCloseItem(const TPixelPosition & c_rPixelPosition, DWORD * pdwItemID, DWORD dwDistance) // Ekle: static void __GetCloseGroundItemList(CPythonItem::TGroundItemInstanceMap & rMap, const TPixelPosition & c_rPixelPosition, DWORD dwDistance, bool bMoney, std::vector<DWORD> & rVIDList) { const float fMaxDistance = float(dwDistance)*float(dwDistance); CPythonItem::TGroundItemInstanceMap::iterator i; for (i = rMap.begin(); i != rMap.end(); ++i) { CPythonItem::TGroundItemInstance * pInstance = i->second; const bool bIsMoney = (pInstance->dwVirtualNumber == CPythonItem::VNUM_MONEY); if (bIsMoney != bMoney) continue; float fx = c_rPixelPosition.x - pInstance->v3EndPosition.x; float fy = c_rPixelPosition.y - (-pInstance->v3EndPosition.y); if (fx*fx + fy*fy <= fMaxDistance) rVIDList.push_back(i->first); } } void CPythonItem::GetCloseItemList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList) { __GetCloseGroundItemList(m_GroundItemInstanceMap, c_rPixelPosition, dwDistance, false, rVIDList); } void CPythonItem::GetCloseMoneyList(const TPixelPosition & c_rPixelPosition, DWORD dwDistance, std::vector<DWORD> & rVIDList) { __GetCloseGroundItemList(m_GroundItemInstanceMap, c_rPixelPosition, dwDistance, true, rVIDList); }
PythonPlayerInput.cpp:// Arat: void CPythonPlayer::PickCloseMoney() { CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); DWORD dwItemID; CPythonItem& rkItem=CPythonItem::Instance(); if (!rkItem.GetCloseMoney(kPPosMain, &dwItemID, __GetPickableDistance())) return; SendClickItemPacket(dwItemID); } void CPythonPlayer::PickCloseItem() { CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); DWORD dwItemID; CPythonItem& rkItem=CPythonItem::Instance(); if (!rkItem.GetCloseItem(kPPosMain, &dwItemID, __GetPickableDistance())) return; SendClickItemPacket(dwItemID); } // Değiştir: void CPythonPlayer::PickCloseMoney() { static DWORD s_dwLastTime = 0; DWORD dwNow = ELTimer_GetMSec(); if (dwNow - s_dwLastTime < 150) return; CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); std::vector<DWORD> vidList; CPythonItem::Instance().GetCloseMoneyList(kPPosMain, __GetPickableDistance(), vidList); if (vidList.empty()) return; s_dwLastTime = dwNow; for (size_t i = 0; i < vidList.size(); ++i) SendClickItemPacket(vidList[i]); } void CPythonPlayer::PickCloseItem() { static DWORD s_dwLastTime = 0; DWORD dwNow = ELTimer_GetMSec(); if (dwNow - s_dwLastTime < 150) return; CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); std::vector<DWORD> vidList; CPythonItem::Instance().GetCloseItemList(kPPosMain, __GetPickableDistance(), vidList); if (vidList.empty()) return; s_dwLastTime = dwNow; for (size_t i = 0; i < vidList.size(); ++i) SendClickItemPacket(vidList[i]); }
kaldırmadıysan test eder misin?
Hmm peki bu?Hocam, mantık olarak hızlandırabilir ama bu kod gerçek toplu paket göndermiyor; yakınındaki tüm itemlerin VID'lerini listeleyip her biri için ayrı SendClickItemPacket() çağırıyor. Bir de s_dwLastTime değerini boş liste kontrolünden önce güncellemek gerekiyor; aksi hâlde yerde item yokken her Update'te tarama yapılır. Daha sağlıklı bir çözüm için gönderilen paket sayısını sınırlandırmak ve mümkünse sunucu tarafında toplu toplama desteği eklemek gerekir. m2devde örnek var toplu için
#include <map>
static void __SendPickupVIDs(const std::vector<DWORD> & vidList)
{
static std::map<DWORD, DWORD> s_mapSent;
const DWORD dwNow = ELTimer_GetMSec();
const size_t kMaxPerTick = 5;
size_t sent = 0;
for (std::map<DWORD, DWORD>::iterator it = s_mapSent.begin(); it != s_mapSent.end(); )
{
if (dwNow - it->second > 2000)
s_mapSent.erase(it++);
else
++it;
}
for (size_t i = 0; i < vidList.size() && sent < kMaxPerTick; ++i)
{
std::map<DWORD, DWORD>::iterator it = s_mapSent.find(vidList[i]);
if (it != s_mapSent.end() && dwNow - it->second < 500)
continue;
s_mapSent[vidList[i]] = dwNow;
SendClickItemPacket(vidList[i]);
++sent;
}
}
// Değiştirilecek kısımlar:
void CPythonPlayer::PickCloseItem()
{
static DWORD s_dwLastTime = 0;
DWORD dwNow = ELTimer_GetMSec();
if (dwNow - s_dwLastTime < 150)
return;
s_dwLastTime = dwNow;
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
TPixelPosition kPPosMain;
pkInstMain->NEW_GetPixelPosition(&kPPosMain);
std::vector<DWORD> vidList;
CPythonItem::Instance().GetCloseItemList(kPPosMain, __GetPickableDistance(), vidList);
__SendPickupVIDs(vidList);
}
void CPythonPlayer::PickCloseMoney()
{
static DWORD s_dwLastTime = 0;
DWORD dwNow = ELTimer_GetMSec();
if (dwNow - s_dwLastTime < 150)
return;
s_dwLastTime = dwNow;
CInstanceBase * pkInstMain = NEW_GetMainActorPtr();
if (!pkInstMain)
return;
TPixelPosition kPPosMain;
pkInstMain->NEW_GetPixelPosition(&kPPosMain);
std::vector<DWORD> vidList;
CPythonItem::Instance().GetCloseMoneyList(kPPosMain, __GetPickableDistance(), vidList);
__SendPickupVIDs(vidList);
}
Bu sürüm daha mantıklı görünüyor hocam. Özellikle çağrı başına 5 paket sınırı ve aynı VID'ye kısa sürede tekrar istek gönderilmesini engellemesi güzel olmuş. Yine de gerçek toplu paket değil, her item için ayrı istek gönderiyor. Deneyip sonuçları görmek lazım, elinize sağlık paylaşım için.Hmm peki bu?
PythonPlayerInput.cpp:#include <map> static void __SendPickupVIDs(const std::vector<DWORD> & vidList) { static std::map<DWORD, DWORD> s_mapSent; const DWORD dwNow = ELTimer_GetMSec(); const size_t kMaxPerTick = 5; size_t sent = 0; for (std::map<DWORD, DWORD>::iterator it = s_mapSent.begin(); it != s_mapSent.end(); ) { if (dwNow - it->second > 2000) s_mapSent.erase(it++); else ++it; } for (size_t i = 0; i < vidList.size() && sent < kMaxPerTick; ++i) { std::map<DWORD, DWORD>::iterator it = s_mapSent.find(vidList[i]); if (it != s_mapSent.end() && dwNow - it->second < 500) continue; s_mapSent[vidList[i]] = dwNow; SendClickItemPacket(vidList[i]); ++sent; } } // Değiştirilecek kısımlar: void CPythonPlayer::PickCloseItem() { static DWORD s_dwLastTime = 0; DWORD dwNow = ELTimer_GetMSec(); if (dwNow - s_dwLastTime < 150) return; s_dwLastTime = dwNow; CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); std::vector<DWORD> vidList; CPythonItem::Instance().GetCloseItemList(kPPosMain, __GetPickableDistance(), vidList); __SendPickupVIDs(vidList); } void CPythonPlayer::PickCloseMoney() { static DWORD s_dwLastTime = 0; DWORD dwNow = ELTimer_GetMSec(); if (dwNow - s_dwLastTime < 150) return; s_dwLastTime = dwNow; CInstanceBase * pkInstMain = NEW_GetMainActorPtr(); if (!pkInstMain) return; TPixelPosition kPPosMain; pkInstMain->NEW_GetPixelPosition(&kPPosMain); std::vector<DWORD> vidList; CPythonItem::Instance().GetCloseMoneyList(kPPosMain, __GetPickableDistance(), vidList); __SendPickupVIDs(vidList); }