mirror of
https://github.com/k4zmu2a/SpaceCadetPinball.git
synced 2024-11-14 19:25:18 -05:00
Minor performance optimizations (#89)
* Optimize performance by calling FreePlayedBlocks rarely Don't call it at every main loop iteration, only after someTime. * Optimize more aggressively in Release mode
This commit is contained in:
parent
ab7184ef86
commit
585a2f7113
6 changed files with 23 additions and 10 deletions
|
@ -114,10 +114,10 @@ void Sound::Enable(int channelFrom, int channelTo, int enableFlag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::Idle()
|
void Sound::Idle(bool performCleanup)
|
||||||
{
|
{
|
||||||
if (pMem)
|
if (pMem)
|
||||||
WaveMix::Pump();
|
WaveMix::Pump(performCleanup);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Sound::Activate()
|
void Sound::Activate()
|
||||||
|
|
|
@ -6,7 +6,7 @@ class Sound
|
||||||
public:
|
public:
|
||||||
static int Init(HINSTANCE hInstance, int voices, void (* someFuncPtr)(int, MIXWAVE*, int));
|
static int Init(HINSTANCE hInstance, int voices, void (* someFuncPtr)(int, MIXWAVE*, int));
|
||||||
static void Enable(int channelFrom, int channelTo, int enableFlag);
|
static void Enable(int channelFrom, int channelTo, int enableFlag);
|
||||||
static void Idle();
|
static void Idle(bool performCleanup = true);
|
||||||
static void Activate();
|
static void Activate();
|
||||||
static void Deactivate();
|
static void Deactivate();
|
||||||
static void Close();
|
static void Close();
|
||||||
|
|
|
@ -308,6 +308,8 @@
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
|
@ -350,6 +352,8 @@
|
||||||
<ConformanceMode>false</ConformanceMode>
|
<ConformanceMode>false</ConformanceMode>
|
||||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
|
@ -392,6 +396,8 @@
|
||||||
<ConformanceMode>true</ConformanceMode>
|
<ConformanceMode>true</ConformanceMode>
|
||||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
|
@ -434,6 +440,8 @@
|
||||||
<ConformanceMode>false</ConformanceMode>
|
<ConformanceMode>false</ConformanceMode>
|
||||||
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
<PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
|
||||||
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
<MultiProcessorCompilation>true</MultiProcessorCompilation>
|
||||||
|
<InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
|
||||||
|
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
<SubSystem>Windows</SubSystem>
|
<SubSystem>Windows</SubSystem>
|
||||||
|
|
|
@ -550,7 +550,7 @@ int WaveMix::Activate(HANDLE hMixSession, bool fActivate)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaveMix::Pump()
|
void WaveMix::Pump(bool performCleanup)
|
||||||
{
|
{
|
||||||
Globals = GlobalsActive;
|
Globals = GlobalsActive;
|
||||||
if (GlobalsActive)
|
if (GlobalsActive)
|
||||||
|
@ -567,7 +567,8 @@ void WaveMix::Pump()
|
||||||
else
|
else
|
||||||
xHDR = xHDR->QNext;
|
xHDR = xHDR->QNext;
|
||||||
}
|
}
|
||||||
FreePlayedBlocks();
|
if (performCleanup)
|
||||||
|
FreePlayedBlocks();
|
||||||
while (MixerPlay(GetWaveBlock(), 1));
|
while (MixerPlay(GetWaveBlock(), 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1382,12 +1383,12 @@ int WaveMix::GetConfig(HANDLE hMixSession, MIXCONFIG* lpConfig)
|
||||||
|
|
||||||
unsigned WaveMix::MyWaveOutGetPosition(HWAVEOUT hWaveOut, int fGoodGetPos)
|
unsigned WaveMix::MyWaveOutGetPosition(HWAVEOUT hWaveOut, int fGoodGetPos)
|
||||||
{
|
{
|
||||||
mmtime_tag pmmt{};
|
MMTIME pmmt{};
|
||||||
|
|
||||||
if (!fGoodGetPos)
|
if (!fGoodGetPos)
|
||||||
return (timeGetTime() - Globals->dwBaseTime) * Globals->PCM.wf.nAvgBytesPerSec / 0x3E8 & 0xFFFFFFF8;
|
return (timeGetTime() - Globals->dwBaseTime) * Globals->PCM.wf.nAvgBytesPerSec / 0x3E8 & 0xFFFFFFF8;
|
||||||
pmmt.wType = TIME_BYTES;
|
pmmt.wType = TIME_BYTES;
|
||||||
waveOutGetPosition(hWaveOut, &pmmt, 0xCu);
|
waveOutGetPosition(hWaveOut, &pmmt, sizeof(MMTIME));
|
||||||
return Globals->pfnSampleAdjust(pmmt.u.ms, Globals->dwWaveOutPos);
|
return Globals->pfnSampleAdjust(pmmt.u.ms, Globals->dwWaveOutPos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -151,7 +151,7 @@ public:
|
||||||
static MIXWAVE* OpenWave(HANDLE hMixSession, LPCSTR szWaveFilename, HINSTANCE hInst, unsigned int dwFlags);
|
static MIXWAVE* OpenWave(HANDLE hMixSession, LPCSTR szWaveFilename, HINSTANCE hInst, unsigned int dwFlags);
|
||||||
static int FreeWave(HANDLE hMixSession, MIXWAVE* lpMixWave);
|
static int FreeWave(HANDLE hMixSession, MIXWAVE* lpMixWave);
|
||||||
static int Activate(HANDLE hMixSession, bool fActivate);
|
static int Activate(HANDLE hMixSession, bool fActivate);
|
||||||
static void Pump();
|
static void Pump(bool performCleanup = true);
|
||||||
static int Play(MIXPLAYPARAMS* lpMixPlayParams);
|
static int Play(MIXPLAYPARAMS* lpMixPlayParams);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -228,9 +228,10 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
|
||||||
float sleepRemainder = 0, frameDuration = TargetFrameTime;
|
float sleepRemainder = 0, frameDuration = TargetFrameTime;
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
if (!someTimeCounter)
|
if (someTimeCounter == 0)
|
||||||
{
|
{
|
||||||
someTimeCounter = 300;
|
someTimeCounter = 300;
|
||||||
|
|
||||||
if (DispFrameRate)
|
if (DispFrameRate)
|
||||||
{
|
{
|
||||||
auto curTime = timeGetTime();
|
auto curTime = timeGetTime();
|
||||||
|
@ -257,7 +258,10 @@ int winmain::WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Sound::Idle();
|
// Don't look for and free already played blocks at every single frame,
|
||||||
|
// as it is quite costly to look up. Only do that "sometimes".
|
||||||
|
bool performSoundCleanup = someTimeCounter == 300;
|
||||||
|
Sound::Idle(performSoundCleanup);
|
||||||
if (!ProcessWindowMessages() || bQuit)
|
if (!ProcessWindowMessages() || bQuit)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue