Hopefully fix the rare lightmap flicker

This commit is contained in:
Kae 2023-11-25 23:36:36 +11:00
parent f3c7bd1d5e
commit 8181cff72e
2 changed files with 6 additions and 9 deletions

View File

@ -1403,7 +1403,7 @@ void WorldClient::collectLiquid(List<Vec2I> const& tilePositions, LiquidId liqui
} }
void WorldClient::waitForLighting(Image* out) { void WorldClient::waitForLighting(Image* out) {
MutexLocker lock(m_lightingMutex); MutexLocker lock(m_lightMapMutex);
if (out) if (out)
*out = move(m_lightMap); *out = move(m_lightMap);
} }
@ -1648,22 +1648,18 @@ void WorldClient::lightingTileGather() {
} }
void WorldClient::lightingMain() { void WorldClient::lightingMain() {
MutexLocker condLocker(m_lightingMutex);
while (true) { while (true) {
MutexLocker locker(m_lightingMutex);
m_lightingCond.wait(m_lightingMutex); m_lightingCond.wait(m_lightingMutex);
if (m_stopLightingThread) if (m_stopLightingThread)
return; return;
MutexLocker mapLocker(m_lightMapMutex);
int64_t start = Time::monotonicMicroseconds(); int64_t start = Time::monotonicMicroseconds();
lightingTileGather(); lightingTileGather();
m_lightingCalculator.calculate(m_lightMap); m_lightingCalculator.calculate(m_lightMap);
mapLocker.unlock();
LogMap::set("client_render_world_async_light_calc", strf(u8"{:05d}\u00b5s", Time::monotonicMicroseconds() - start)); LogMap::set("client_render_world_async_light_calc", strf(u8"{:05d}\u00b5s", Time::monotonicMicroseconds() - start));
continue;
locker.unlock();
Thread::yield();
} }
} }

View File

@ -269,9 +269,10 @@ private:
CellularLightingCalculator m_lightingCalculator; CellularLightingCalculator m_lightingCalculator;
mutable CellularLightIntensityCalculator m_lightIntensityCalculator; mutable CellularLightIntensityCalculator m_lightIntensityCalculator;
ThreadFunction<void> m_lightingThread; ThreadFunction<void> m_lightingThread;
Mutex m_lightingMutex; Mutex m_lightingMutex;
ConditionVariable m_lightingCond; ConditionVariable m_lightingCond;
Mutex m_lightMapMutex;
Image m_lightMap; Image m_lightMap;
atomic<bool> m_stopLightingThread; atomic<bool> m_stopLightingThread;