From d0aa7cd60f81bee3abf44f44571900464d7ac96f Mon Sep 17 00:00:00 2001 From: David Williams Date: Thu, 21 Aug 2014 00:06:20 +0200 Subject: [PATCH] Replaced usage of our 'Array' class with native C array and got significant performance increase. --- .../MarchingCubesSurfaceExtractor.h | 10 ++++---- .../MarchingCubesSurfaceExtractor.inl | 24 ++++++++++++------- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h index cf42800e..17e30b1e 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h +++ b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.h @@ -156,6 +156,8 @@ namespace PolyVox template< typename VolumeType, typename MeshType, typename ControllerType> class MarchingCubesSurfaceExtractor { + private: + const static int BitmaskSize = 128; public: MarchingCubesSurfaceExtractor(VolumeType* volData, Region region, MeshType* result, ControllerType controller, WrapMode eWrapMode = WrapModes::Border, typename VolumeType::VoxelType tBorderValue = typename VolumeType::VoxelType()); @@ -164,14 +166,14 @@ namespace PolyVox private: //Compute the cell bitmask for a particular slice in z. template - uint32_t computeBitmaskForSlice(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask); + uint32_t computeBitmaskForSlice(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize]); //Compute the cell bitmask for a given cell. template - void computeBitmaskForCell(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask, uint32_t uXRegSpace, uint32_t uYRegSpace); + void computeBitmaskForCell(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize], uint32_t uXRegSpace, uint32_t uYRegSpace); //Use the cell bitmasks to generate all the vertices needed for that slice - void generateVerticesForSlice(const Array2DUint8& pCurrentBitmask, + void generateVerticesForSlice(uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize], Array2DInt32& m_pCurrentVertexIndicesX, Array2DInt32& m_pCurrentVertexIndicesY, Array2DInt32& m_pCurrentVertexIndicesZ); @@ -291,7 +293,7 @@ namespace PolyVox //////////////////////////////////////////////////////////////////////////////// //Use the cell bitmasks to generate all the indices needed for that slice - void generateIndicesForSlice(const Array2DUint8& pPreviousBitmask, + void generateIndicesForSlice(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], const Array2DInt32& m_pPreviousVertexIndicesX, const Array2DInt32& m_pPreviousVertexIndicesY, const Array2DInt32& m_pPreviousVertexIndicesZ, diff --git a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl index fd226560..39ebdeda 100644 --- a/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl +++ b/library/PolyVoxCore/include/PolyVoxCore/MarchingCubesSurfaceExtractor.inl @@ -52,6 +52,12 @@ namespace PolyVox const uint32_t uArrayHeight = m_regSizeInVoxels.getUpperY() - m_regSizeInVoxels.getLowerY() + 1; const uint32_t arraySizes[2]= {uArrayWidth, uArrayHeight}; // Array dimensions + // PolyVox has a hardcoded limit on how big the regions it can extract are. This lets us allocate various + // arrays at compile time rather than run time. If you *really* need to you can increase this by changing + // the 'BitmaskSize' constant, but you should be sure you really know what you are doing. + POLYVOX_THROW_IF(uArrayWidth > BitmaskSize, std::invalid_argument, "Requested extraction region is too large"); + POLYVOX_THROW_IF(uArrayHeight > BitmaskSize, std::invalid_argument, "Requested extraction region is too large"); + //For edge indices Array2DInt32 m_pPreviousVertexIndicesX(arraySizes); Array2DInt32 m_pPreviousVertexIndicesY(arraySizes); @@ -60,8 +66,8 @@ namespace PolyVox Array2DInt32 m_pCurrentVertexIndicesY(arraySizes); Array2DInt32 m_pCurrentVertexIndicesZ(arraySizes); - Array2DUint8 pPreviousBitmask(arraySizes); - Array2DUint8 pCurrentBitmask(arraySizes); + uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize]; + uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize]; //Create a region corresponding to the first slice m_regSlicePrevious = m_regSizeInVoxels; @@ -86,7 +92,8 @@ namespace PolyVox } std::swap(uNoOfNonEmptyCellsForSlice0, uNoOfNonEmptyCellsForSlice1); - pPreviousBitmask.swap(pCurrentBitmask); + //pPreviousBitmask.swap(pCurrentBitmask); + memcpy(pPreviousBitmask, pCurrentBitmask, BitmaskSize * BitmaskSize); m_pPreviousVertexIndicesX.swap(m_pCurrentVertexIndicesX); m_pPreviousVertexIndicesY.swap(m_pCurrentVertexIndicesY); m_pPreviousVertexIndicesZ.swap(m_pCurrentVertexIndicesZ); @@ -114,7 +121,8 @@ namespace PolyVox } std::swap(uNoOfNonEmptyCellsForSlice0, uNoOfNonEmptyCellsForSlice1); - pPreviousBitmask.swap(pCurrentBitmask); + //pPreviousBitmask.swap(pCurrentBitmask); + memcpy(pPreviousBitmask, pCurrentBitmask, BitmaskSize * BitmaskSize); m_pPreviousVertexIndicesX.swap(m_pCurrentVertexIndicesX); m_pPreviousVertexIndicesY.swap(m_pCurrentVertexIndicesY); m_pPreviousVertexIndicesZ.swap(m_pCurrentVertexIndicesZ); @@ -132,7 +140,7 @@ namespace PolyVox template template - uint32_t MarchingCubesSurfaceExtractor::computeBitmaskForSlice(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask) + uint32_t MarchingCubesSurfaceExtractor::computeBitmaskForSlice(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize]) { m_uNoOfOccupiedCells = 0; @@ -198,7 +206,7 @@ namespace PolyVox template template - void MarchingCubesSurfaceExtractor::computeBitmaskForCell(const Array2DUint8& pPreviousBitmask, Array2DUint8& pCurrentBitmask, uint32_t uXRegSpace, uint32_t uYRegSpace) + void MarchingCubesSurfaceExtractor::computeBitmaskForCell(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize], uint32_t uXRegSpace, uint32_t uYRegSpace) { uint8_t iCubeIndex = 0; @@ -397,7 +405,7 @@ namespace PolyVox } template - void MarchingCubesSurfaceExtractor::generateVerticesForSlice(const Array2DUint8& pCurrentBitmask, + void MarchingCubesSurfaceExtractor::generateVerticesForSlice(uint8_t pCurrentBitmask[BitmaskSize][BitmaskSize], Array2DInt32& m_pCurrentVertexIndicesX, Array2DInt32& m_pCurrentVertexIndicesY, Array2DInt32& m_pCurrentVertexIndicesZ) @@ -537,7 +545,7 @@ namespace PolyVox } template - void MarchingCubesSurfaceExtractor::generateIndicesForSlice(const Array2DUint8& pPreviousBitmask, + void MarchingCubesSurfaceExtractor::generateIndicesForSlice(uint8_t pPreviousBitmask[BitmaskSize][BitmaskSize], const Array2DInt32& m_pPreviousVertexIndicesX, const Array2DInt32& m_pPreviousVertexIndicesY, const Array2DInt32& m_pPreviousVertexIndicesZ,