Skip to content

Commit a3e48cc

Browse files
committed
UPBGE: Use memory pool to allocate vertex data.
Currently in the conversion vertex data are always allocated, checked for redundant then maybe copied and free. To avoid frequently allocation a memory pool is used for each display array type, this memory pool is a boost::object_pool. Tested with sintel desert_level.blend file: Before: 0.85s After: 0.82s
1 parent 8166b30 commit a3e48cc

File tree

3 files changed

+22
-5
lines changed

3 files changed

+22
-5
lines changed

source/gameengine/Converter/BL_BlenderDataConversion.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,6 +589,9 @@ void BL_ConvertDerivedMeshToArray(DerivedMesh *dm, Mesh *me, const std::vector<B
589589
sharedList.push_back({array, offset});
590590
}
591591

592+
// Destruct the vertex data as it is copied or unused.
593+
array->DeleteVertexData(vertex);
594+
592595
// Add tracked vertices by the mpoly.
593596
vertices[vertid] = offset;
594597
}

source/gameengine/Rasterizer/RAS_DisplayArray.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929

3030
#include "RAS_IDisplayArray.h"
3131

32+
#include "boost/pool/object_pool.hpp"
33+
3234
template <class VertexData>
3335
class RAS_BatchDisplayArray;
3436

@@ -41,6 +43,9 @@ friend class RAS_BatchDisplayArray<VertexData>;
4143
protected:
4244
std::vector<VertexData> m_vertexes;
4345

46+
// Temporary vertex data storage.
47+
static boost::object_pool<VertexData> m_vertexPool;
48+
4449
public:
4550
RAS_DisplayArray(PrimitiveType type, const RAS_VertexFormat& format)
4651
:RAS_IDisplayArray(type, format)
@@ -109,14 +114,18 @@ friend class RAS_BatchDisplayArray<VertexData>;
109114
return m_vertexes.data();
110115
}
111116

112-
virtual unsigned int AddVertex(RAS_Vertex& vert)
117+
virtual unsigned int AddVertex(const RAS_Vertex& vert)
113118
{
114119
VertexData *data = static_cast<VertexData *>(vert.GetData());
115120
m_vertexes.push_back(*data);
116-
delete data;
117121
return m_vertexes.size() - 1;
118122
}
119123

124+
virtual void DeleteVertexData(const RAS_Vertex& vert)
125+
{
126+
m_vertexPool.destroy(static_cast<VertexData *>(vert.GetData()));
127+
}
128+
120129
virtual void Clear()
121130
{
122131
m_vertexes.clear();
@@ -139,7 +148,7 @@ friend class RAS_BatchDisplayArray<VertexData>;
139148
const unsigned int *rgba,
140149
const MT_Vector3& normal)
141150
{
142-
VertexData *data = new VertexData(xyz, uvs, tangent, rgba, normal);
151+
VertexData *data = new (m_vertexPool.malloc()) VertexData(xyz, uvs, tangent, rgba, normal);
143152
return RAS_Vertex(data, m_format);
144153
}
145154

@@ -150,7 +159,7 @@ friend class RAS_BatchDisplayArray<VertexData>;
150159
const unsigned int *rgba,
151160
const float normal[3])
152161
{
153-
VertexData *data = new VertexData(xyz, uvs, tangent, rgba, normal);
162+
VertexData *data = new (m_vertexPool.malloc()) VertexData(xyz, uvs, tangent, rgba, normal);
154163
return RAS_Vertex(data, m_format);
155164
}
156165

@@ -164,4 +173,7 @@ friend class RAS_BatchDisplayArray<VertexData>;
164173
}
165174
};
166175

176+
template <class VertexData>
177+
boost::object_pool<VertexData> RAS_DisplayArray<VertexData>::m_vertexPool;
178+
167179
#endif // __RAS_DISPLAY_ARRAY_H__

source/gameengine/Rasterizer/RAS_IDisplayArray.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ class RAS_IDisplayArray
121121
return m_vertexInfos[index];
122122
}
123123

124-
virtual unsigned int AddVertex(RAS_Vertex& vert) = 0;
124+
virtual unsigned int AddVertex(const RAS_Vertex& vert) = 0;
125+
126+
virtual void DeleteVertexData(const RAS_Vertex& vert) = 0;
125127

126128
inline void AddPrimitiveIndex(const unsigned int index)
127129
{

0 commit comments

Comments
 (0)