From 999faa9d90453435ab1c61935a448fef01ff29e7 Mon Sep 17 00:00:00 2001 From: peterbell10 Date: Wed, 21 Feb 2018 10:30:48 +0000 Subject: cLightingThread: Faster chunk reading (#4185) Profiled at a 10x speedup for cLightingThread::ReadChunks. --- src/LightingThread.cpp | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'src/LightingThread.cpp') diff --git a/src/LightingThread.cpp b/src/LightingThread.cpp index 39b22f748..ccefdfef2 100644 --- a/src/LightingThread.cpp +++ b/src/LightingThread.cpp @@ -20,21 +20,31 @@ class cReader : virtual void ChunkData(const cChunkData & a_ChunkBuffer) override { BLOCKTYPE * OutputRows = m_BlockTypes; - int InputIdx = 0; int OutputIdx = m_ReadingChunkX + m_ReadingChunkZ * cChunkDef::Width * 3; - int MaxHeight = std::min(+cChunkDef::Height, m_MaxHeight + 16); // Need 16 blocks above the highest - for (int y = 0; y < MaxHeight; y++) + for (size_t i = 0; i != cChunkData::NumSections; ++i) { - for (int z = 0; z < cChunkDef::Width; z++) + auto * Section = a_ChunkBuffer.GetSection(i); + if (Section == nullptr) + { + // Skip to the next section + OutputIdx += 9 * cChunkData::SectionHeight * cChunkDef::Width; + continue; + } + + for (size_t OffsetY = 0; OffsetY != cChunkData::SectionHeight; ++OffsetY) { - a_ChunkBuffer.CopyBlockTypes(OutputRows + OutputIdx * 16, static_cast(InputIdx * 16), 16); - InputIdx++; - OutputIdx += 3; - } // for z - // Skip into the next y-level in the 3x3 chunk blob; each level has cChunkDef::Width * 9 rows - // We've already walked cChunkDef::Width * 3 in the "for z" cycle, that makes cChunkDef::Width * 6 rows left to skip - OutputIdx += cChunkDef::Width * 6; - } // for y + for (size_t Z = 0; Z != cChunkDef::Width; ++Z) + { + auto InPtr = Section->m_BlockTypes + Z * cChunkDef::Width + OffsetY * cChunkDef::Width * cChunkDef::Width; + std::copy_n(InPtr, cChunkDef::Width, OutputRows + OutputIdx * cChunkDef::Width); + + OutputIdx += 3; + } + // Skip into the next y-level in the 3x3 chunk blob; each level has cChunkDef::Width * 9 rows + // We've already walked cChunkDef::Width * 3 in the "for z" cycle, that makes cChunkDef::Width * 6 rows left to skip + OutputIdx += cChunkDef::Width * 6; + } + } } // BlockTypes() @@ -78,6 +88,7 @@ public: m_BlockTypes(a_BlockTypes), m_HeightMap(a_HeightMap) { + std::fill_n(m_BlockTypes, cChunkDef::NumBlocks * 9, E_BLOCK_AIR); } } ; -- cgit v1.2.3