helping branch prediction

This commit is contained in:
d1str4ught
2026-01-30 03:29:58 +01:00
parent 1eb9743742
commit 30ff18e982
11 changed files with 28 additions and 118 deletions

View File

@@ -71,7 +71,7 @@ struct FEffectUpdator
} }
void operator () (CEffectElementBaseInstance * pInstance) void operator () (CEffectElementBaseInstance * pInstance)
{ {
if (pInstance->Update(fElapsedTime)) if (pInstance->Update(fElapsedTime)) [[likely]]
isAlive = TRUE; isAlive = TRUE;
} }
}; };

View File

@@ -67,16 +67,13 @@ void CEffectManager::Update()
pEffectInstance->Update(/*fElapsedTime*/); pEffectInstance->Update(/*fElapsedTime*/);
if (!pEffectInstance->isAlive()) if (pEffectInstance->isAlive()) [[likely]] {
{
itor = m_kEftInstMap.erase(itor);
CEffectInstance::Delete(pEffectInstance);
}
else
{
++itor; ++itor;
continue;
} }
itor = m_kEftInstMap.erase(itor);
CEffectInstance::Delete(pEffectInstance);
} }
} }

View File

@@ -300,15 +300,13 @@ bool CParticleSystemInstance::OnUpdate(float fElapsedTime)
{ {
CParticleInstance * pInstance = *itor; CParticleInstance * pInstance = *itor;
if (!pInstance->Update(fElapsedTime,fAngularVelocity)) if (!pInstance->Update(fElapsedTime,fAngularVelocity)) [[unlikely]] {
{
pInstance->DeleteThis(); pInstance->DeleteThis();
itor = m_ParticleInstanceListVector[dwFrameIndex].erase(itor); itor = m_ParticleInstanceListVector[dwFrameIndex].erase(itor);
m_dwCurrentEmissionCount--; m_dwCurrentEmissionCount--;
} }
else else [[likely]] {
{
if (pInstance->m_byFrameIndex != dwFrameIndex) if (pInstance->m_byFrameIndex != dwFrameIndex)
{ {
m_ParticleInstanceListVector[dwFrameCount+pInstance->m_byFrameIndex].push_back(*itor); m_ParticleInstanceListVector[dwFrameCount+pInstance->m_byFrameIndex].push_back(*itor);

View File

@@ -144,10 +144,10 @@ void DeformPWNT3432toGrannyPNGBT33332(granny_int32x Count, void const* SourceIni
granny_int32x const* TransformTable, granny_matrix_4x4 const* Transforms, granny_int32x const* TransformTable, granny_matrix_4x4 const* Transforms,
granny_int32x CopySize, granny_int32x SourceStride, granny_int32x DestStride) granny_int32x CopySize, granny_int32x SourceStride, granny_int32x DestStride)
{ {
if (TransformTable) { if (TransformTable) [[likely]] {
DeformPWNT3432toGrannyPNGBT33332I(Count, SourceInit, DestInit, TransformTable, Transforms, CopySize, SourceStride, DestStride); DeformPWNT3432toGrannyPNGBT33332I(Count, SourceInit, DestInit, TransformTable, Transforms, CopySize, SourceStride, DestStride);
} }
else { else [[unlikely]] {
DeformPWNT3432toGrannyPNGBT33332D(Count, SourceInit, DestInit, Transforms, CopySize, SourceStride, DestStride); DeformPWNT3432toGrannyPNGBT33332D(Count, SourceInit, DestInit, Transforms, CopySize, SourceStride, DestStride);
} }
} }

View File

@@ -591,8 +591,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
fFontHeight=float(pCurCharInfo->height); fFontHeight=float(pCurCharInfo->height);
fFontAdvance=float(pCurCharInfo->advance); fFontAdvance=float(pCurCharInfo->advance);
if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth) if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth) [[unlikely]] {
{
if (m_isMultiLine) if (m_isMultiLine)
{ {
fCurX=fStanX; fCurX=fStanX;
@@ -693,8 +692,7 @@ void CGraphicTextInstance::Render(RECT * pClipRect)
fFontMaxHeight=(std::max)(fFontHeight, (float)pCurCharInfo->height); fFontMaxHeight=(std::max)(fFontHeight, (float)pCurCharInfo->height);
fFontAdvance=float(pCurCharInfo->advance); fFontAdvance=float(pCurCharInfo->advance);
if ((fCurX+fFontWidth)-m_v3Position.x > m_fLimitWidth) if ((fCurX + fFontWidth) - m_v3Position.x > m_fLimitWidth) [[unlikely]] {
{
if (m_isMultiLine) if (m_isMultiLine)
{ {
fCurX=fStanX; fCurX=fStanX;

View File

@@ -36,7 +36,6 @@ class IAbstractApplication : public TAbstractSingleton<IAbstractApplication>
virtual float GetGlobalTime() = 0; virtual float GetGlobalTime() = 0;
virtual float GetGlobalElapsedTime() = 0; virtual float GetGlobalElapsedTime() = 0;
virtual void SkipRenderBuffering(DWORD dwSleepMSec) = 0;
virtual void SetServerTime(time_t tTime) = 0; virtual void SetServerTime(time_t tTime) = 0;
virtual void SetCenterPosition(float fx, float fy, float fz) = 0; virtual void SetCenterPosition(float fx, float fy, float fz) = 0;

View File

@@ -718,8 +718,6 @@ bool CInstanceBase::__FindRaceType(DWORD dwRace, BYTE* pbType)
bool CInstanceBase::Create(const SCreateData& c_rkCreateData) bool CInstanceBase::Create(const SCreateData& c_rkCreateData)
{ {
IAbstractApplication::GetSingleton().SkipRenderBuffering(300);
SetInstanceType(c_rkCreateData.m_bType); SetInstanceType(c_rkCreateData.m_bType);

View File

@@ -256,11 +256,6 @@ void CPythonApplication::UpdateGame()
SetCenterPosition(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z); SetCenterPosition(kPPosMainActor.x, kPPosMainActor.y, kPPosMainActor.z);
} }
void CPythonApplication::SkipRenderBuffering(DWORD dwSleepMSec)
{
m_dwBufSleepSkipTime=ELTimer_GetMSec()+dwSleepMSec;
}
bool CPythonApplication::Process() bool CPythonApplication::Process()
{ {
ELTimer_SetFrameMSec(); ELTimer_SetFrameMSec();
@@ -275,8 +270,7 @@ bool CPythonApplication::Process()
static UINT s_uiLoad = 0; static UINT s_uiLoad = 0;
static DWORD s_dwCheckTime = ELTimer_GetMSec(); static DWORD s_dwCheckTime = ELTimer_GetMSec();
if (ELTimer_GetMSec() - s_dwCheckTime > 1000) if (ELTimer_GetMSec() - s_dwCheckTime > 1000) [[unlikely]] {
{
m_dwUpdateFPS = s_dwUpdateFrameCount; m_dwUpdateFPS = s_dwUpdateFrameCount;
m_dwRenderFPS = s_dwRenderFrameCount; m_dwRenderFPS = s_dwRenderFrameCount;
m_dwLoad = s_uiLoad; m_dwLoad = s_uiLoad;
@@ -329,8 +323,7 @@ bool CPythonApplication::Process()
#endif #endif
// Mouse // Mouse
POINT Point; POINT Point;
if (GetCursorPos(&Point)) if (GetCursorPos(&Point)) [[likely]] {
{
ScreenToClient(m_hWnd, &Point); ScreenToClient(m_hWnd, &Point);
OnMouseMove(Point.x, Point.y); OnMouseMove(Point.x, Point.y);
} }
@@ -531,14 +524,11 @@ bool CPythonApplication::Process()
bool canRender = true; bool canRender = true;
if (m_isMinimizedWnd) if (m_isMinimizedWnd) [[unlikely]] {
{
canRender = false; canRender = false;
} }
else else [[likely]] {
{ if (m_pyGraphic.IsLostDevice()) [[unlikely]] {
if (m_pyGraphic.IsLostDevice())
{
CPythonBackground& rkBG = CPythonBackground::Instance(); CPythonBackground& rkBG = CPythonBackground::Instance();
rkBG.ReleaseCharacterShadowTexture(); rkBG.ReleaseCharacterShadowTexture();
@@ -549,22 +539,11 @@ bool CPythonApplication::Process()
} }
} }
if (!IsActive()) if (canRender) [[likely]]
{
SkipRenderBuffering(3000);
}
// ¸®½ºÅä¾î 󸮶§¸¦ °í·ÁÇØ ÀÏÁ¤ ½Ã°£µ¿¾ÈÀº ¹öÆÛ¸µÀ» ÇÏÁö ¾Ê´Â´Ù
if (!canRender)
{
SkipRenderBuffering(3000);
}
else
{ {
// RestoreLostDevice // RestoreLostDevice
CCullingManager::Instance().Update(); CCullingManager::Instance().Update();
if (m_pyGraphic.Begin()) if (m_pyGraphic.Begin()) [[likely]] {
{
m_pyGraphic.ClearDepthBuffer(); m_pyGraphic.ClearDepthBuffer();
@@ -597,8 +576,7 @@ bool CPythonApplication::Process()
s_dwRenderRangeTime += m_dwCurRenderTime; s_dwRenderRangeTime += m_dwCurRenderTime;
++s_dwRenderRangeFrame; ++s_dwRenderRangeFrame;
if (dwRenderEndTime-s_dwRenderCheckTime>1000) if (dwRenderEndTime-s_dwRenderCheckTime>1000) [[unlikely]] {
{
m_fAveRenderTime=float(double(s_dwRenderRangeTime)/double(s_dwRenderRangeFrame)); m_fAveRenderTime=float(double(s_dwRenderRangeTime)/double(s_dwRenderRangeFrame));
s_dwRenderCheckTime=ELTimer_GetMSec(); s_dwRenderCheckTime=ELTimer_GetMSec();
@@ -612,52 +590,6 @@ bool CPythonApplication::Process()
if (dwCurFaceCount > 5000) if (dwCurFaceCount > 5000)
{ {
// ÇÁ·¹ÀÓ ¿ÏÃæ ó¸®
if (dwRenderEndTime > m_dwBufSleepSkipTime)
{
static float s_fBufRenderTime = 0.0f;
float fCurRenderTime = m_dwCurRenderTime;
if (fCurRenderTime > s_fBufRenderTime)
{
float fRatio = fMAX(0.5f, (fCurRenderTime - s_fBufRenderTime) / 30.0f);
s_fBufRenderTime = (s_fBufRenderTime * (100.0f - fRatio) + (fCurRenderTime + 5) * fRatio) / 100.0f;
}
else
{
float fRatio = 0.5f;
s_fBufRenderTime = (s_fBufRenderTime * (100.0f - fRatio) + fCurRenderTime * fRatio) / 100.0f;
}
// ÇѰèÄ¡¸¦ Á¤ÇÑ´Ù
if (s_fBufRenderTime > 100.0f)
s_fBufRenderTime = 100.0f;
DWORD dwBufRenderTime = s_fBufRenderTime;
if (m_isWindowed)
{
if (dwBufRenderTime>58)
dwBufRenderTime=64;
else if (dwBufRenderTime>42)
dwBufRenderTime=48;
else if (dwBufRenderTime>26)
dwBufRenderTime=32;
else if (dwBufRenderTime>10)
dwBufRenderTime=16;
else
dwBufRenderTime=8;
}
// ÀÏÁ¤ ÇÁ·¹ÀÓ ¼Óµµ¿¡ ¸ÂÃß¾îÁÖ´ÂÂÊ¿¡ ´«¿¡ ÆíÇÏ´Ù
// ¾Æ·¡¿¡¼­ Çѹø ÇÏ¸é ‰ç´?
//if (m_dwCurRenderTime<dwBufRenderTime)
// Sleep(dwBufRenderTime-m_dwCurRenderTime);
m_fAveRenderTime=s_fBufRenderTime;
}
m_dwFaceAccCount += dwCurFaceCount; m_dwFaceAccCount += dwCurFaceCount;
m_dwFaceAccTime += m_dwCurRenderTime; m_dwFaceAccTime += m_dwCurRenderTime;

View File

@@ -158,7 +158,6 @@ class CPythonApplication : public CMSApplication, public CInputKeyboard, public
void SetMinFog(float fMinFog); void SetMinFog(float fMinFog);
void SetFrameSkip(bool isEnable); void SetFrameSkip(bool isEnable);
void SkipRenderBuffering(DWORD dwSleepMSec);
bool Create(PyObject* poSelf, const char* c_szName, int width, int height, int Windowed); bool Create(PyObject* poSelf, const char* c_szName, int width, int height, int Windowed);
bool CreateDevice(int width, int height, int Windowed, int bit = 32, int frequency = 0); bool CreateDevice(int width, int height, int Windowed, int bit = 32, int frequency = 0);
@@ -437,7 +436,6 @@ class CPythonApplication : public CMSApplication, public CInputKeyboard, public
BOOL m_isWindowFullScreenEnable; BOOL m_isWindowFullScreenEnable;
DWORD m_dwStickyKeysFlag; DWORD m_dwStickyKeysFlag;
DWORD m_dwBufSleepSkipTime;
int m_iForceSightRange; int m_iForceSightRange;
protected: protected:

View File

@@ -84,12 +84,6 @@ void CPythonApplication::__UpdateCamera()
if (0.0f != m_kCmrPos.m_fUpDir) if (0.0f != m_kCmrPos.m_fUpDir)
pMainCamera->MoveVertical(m_kCmrPos.m_fUpDir); pMainCamera->MoveVertical(m_kCmrPos.m_fUpDir);
//////////////////////
if (pMainCamera->IsDraging())
SkipRenderBuffering(3000);
//////////////////////
// Sound Setting // Sound Setting
const D3DXVECTOR3 & c_rv3CameraDirection = pMainCamera->GetView(); const D3DXVECTOR3 & c_rv3CameraDirection = pMainCamera->GetView();
const D3DXVECTOR3 & c_rv3CameraUp = pMainCamera->GetUp(); const D3DXVECTOR3 & c_rv3CameraUp = pMainCamera->GetUp();

View File

@@ -172,8 +172,7 @@ void CPythonCharacterManager::Update()
if (pkInstMain) if (pkInstMain)
{ {
if (pkInstEach->IsForceVisible()) if (pkInstEach->IsForceVisible()) [[unlikely]] {
{
dwForceVisibleInstCount++; dwForceVisibleInstCount++;
continue; continue;
} }
@@ -181,8 +180,7 @@ void CPythonCharacterManager::Update()
// Optimized: Use squared distance to avoid sqrt // Optimized: Use squared distance to avoid sqrt
float fDistanceSquared = pkInstEach->NEW_GetDistanceFromDestInstanceSquared(*pkInstMain); float fDistanceSquared = pkInstEach->NEW_GetDistanceFromDestInstanceSquared(*pkInstMain);
const float fViewBoundSquared = (CHAR_STAGE_VIEW_BOUND + 10) * (CHAR_STAGE_VIEW_BOUND + 10); const float fViewBoundSquared = (CHAR_STAGE_VIEW_BOUND + 10) * (CHAR_STAGE_VIEW_BOUND + 10);
if (fDistanceSquared > fViewBoundSquared) if (fDistanceSquared > fViewBoundSquared) [[unlikely]] {
{
__DeleteBlendOutInstance(pkInstEach); __DeleteBlendOutInstance(pkInstEach);
m_kAliveInstMap.erase(c); m_kAliveInstMap.erase(c);
dwDeadInstCount++; dwDeadInstCount++;
@@ -342,12 +340,10 @@ void CPythonCharacterManager::UpdateDeleting()
{ {
CInstanceBase * pInstance = *itor; CInstanceBase * pInstance = *itor;
if (pInstance->UpdateDeleting()) if (pInstance->UpdateDeleting()) [[likely]] {
{
++itor; ++itor;
} }
else else [[unlikely]] {
{
CInstanceBase::Delete(pInstance); CInstanceBase::Delete(pInstance);
itor = m_kDeadInstList.erase(itor); itor = m_kDeadInstList.erase(itor);
} }
@@ -473,7 +469,7 @@ void CPythonCharacterManager::__RenderSortedAliveActorList()
s_kVct_pkInstAliveSort.clear(); s_kVct_pkInstAliveSort.clear();
CCamera* pCamera = CCameraManager::instance().GetCurrentCamera(); CCamera* pCamera = CCameraManager::instance().GetCurrentCamera();
if (!pCamera) if (!pCamera) [[unlikely]]
return; return;
TCharacterInstanceMap& rkMap_pkInstAlive=m_kAliveInstMap; TCharacterInstanceMap& rkMap_pkInstAlive=m_kAliveInstMap;
@@ -495,7 +491,7 @@ void CPythonCharacterManager::__RenderSortedDeadActorList()
s_kVct_pkInstDeadSort.clear(); s_kVct_pkInstDeadSort.clear();
CCamera* pCamera = CCameraManager::instance().GetCurrentCamera(); CCamera* pCamera = CCameraManager::instance().GetCurrentCamera();
if (!pCamera) if (!pCamera) [[unlikely]]
return; return;
TCharacterInstanceList& rkLst_pkInstDead=m_kDeadInstList; TCharacterInstanceList& rkLst_pkInstDead=m_kDeadInstList;
@@ -575,13 +571,13 @@ void CPythonCharacterManager::RenderCollision()
CInstanceBase * CPythonCharacterManager::CreateInstance(const CInstanceBase::SCreateData& c_rkCreateData) CInstanceBase * CPythonCharacterManager::CreateInstance(const CInstanceBase::SCreateData& c_rkCreateData)
{ {
CInstanceBase * pCharacterInstance = RegisterInstance(c_rkCreateData.m_dwVID); CInstanceBase * pCharacterInstance = RegisterInstance(c_rkCreateData.m_dwVID);
if (!pCharacterInstance) if (!pCharacterInstance) [[unlikely]]
{ {
TraceError("CPythonCharacterManager::CreateInstance: VID[%d] - ALREADY EXIST\n", c_rkCreateData); TraceError("CPythonCharacterManager::CreateInstance: VID[%d] - ALREADY EXIST\n", c_rkCreateData);
return NULL; return NULL;
} }
if (!pCharacterInstance->Create(c_rkCreateData)) if (!pCharacterInstance->Create(c_rkCreateData)) [[unlikely]]
{ {
TraceError("CPythonCharacterManager::CreateInstance VID[%d] Race[%d]", c_rkCreateData.m_dwVID, c_rkCreateData.m_dwRace); TraceError("CPythonCharacterManager::CreateInstance VID[%d] Race[%d]", c_rkCreateData.m_dwVID, c_rkCreateData.m_dwRace);
DeleteInstance(c_rkCreateData.m_dwVID); DeleteInstance(c_rkCreateData.m_dwVID);