[Bf-blender-cvs] [761de8713b5] opensubdiv_compare: OpenSubdiv: Reduce memory footprint of cached topology
Sergey Sharybin
noreply at git.blender.org
Mon May 25 15:46:23 CEST 2020
Commit: 761de8713b52125560e993b7e24b658d22ccd73c
Author: Sergey Sharybin
Date: Fri May 22 10:25:34 2020 +0200
Branches: opensubdiv_compare
https://developer.blender.org/rB761de8713b52125560e993b7e24b658d22ccd73c
OpenSubdiv: Reduce memory footprint of cached topology
Brings down worst case of 1.5M faced mesh from 102 MiB to 90 MiB.
===================================================================
M intern/opensubdiv/internal/topology/mesh_topology.h
M intern/opensubdiv/internal/topology/mesh_topology_compare.cc
===================================================================
diff --git a/intern/opensubdiv/internal/topology/mesh_topology.h b/intern/opensubdiv/internal/topology/mesh_topology.h
index 196d79c87df..0810ae7a9a5 100644
--- a/intern/opensubdiv/internal/topology/mesh_topology.h
+++ b/intern/opensubdiv/internal/topology/mesh_topology.h
@@ -47,20 +47,41 @@ class EdgeTopology {
class FaceTopology {
public:
- void setNumVertices(int num_vertices)
+ FaceTopology()
{
- vertex_indices.resize(num_vertices, -1);
+ }
+
+ ~FaceTopology()
+ {
+ delete[] vertex_indices;
+ }
+
+ void setNumVertices(int new_num_vertices)
+ {
+ num_vertices = new_num_vertices;
+
+ delete[] vertex_indices;
+ vertex_indices = new int[num_vertices];
}
void setVertexIndices(int *face_vertex_indices)
{
- memcpy(vertex_indices.data(), face_vertex_indices, sizeof(int) * vertex_indices.size());
+ memcpy(vertex_indices, face_vertex_indices, sizeof(int) * getNumVertices());
+ }
+
+ bool isVertexIndicesEqual(const vector<int> &other_vertex_indices) const
+ {
+ if (other_vertex_indices.size() != getNumVertices()) {
+ return false;
+ }
+
+ return memcmp(vertex_indices, other_vertex_indices.data(), sizeof(int) * num_vertices);
}
bool isValid() const
{
- for (int vertex_index : vertex_indices) {
- if (vertex_index < 0) {
+ for (int i = 0; i < getNumVertices(); ++i) {
+ if (vertex_indices[i] < 0) {
return false;
}
}
@@ -70,10 +91,19 @@ class FaceTopology {
int getNumVertices() const
{
- return vertex_indices.size();
+ return num_vertices;
}
- vector<int> vertex_indices;
+ // NOTE: Use bare pointers to avoid object's size overhed. For example, when
+ // using managed vector<int> it is 24 bytes on GCC-10 (to store an internal
+ // state of the vector). Here is is only 8 bytes (on 64bit machine).
+ //
+ // TODO(sergey): Consider using packed structure to lower the memory footprint
+ // since, for some reason, due to padding the sizeof(FaceTopology) is 16 bytes
+ // which could be packed down to 12.
+ int *vertex_indices = nullptr;
+
+ int num_vertices = 0;
};
class EdgeTopologyTag {
diff --git a/intern/opensubdiv/internal/topology/mesh_topology_compare.cc b/intern/opensubdiv/internal/topology/mesh_topology_compare.cc
index 0aa217ac711..cb210e1ae86 100644
--- a/intern/opensubdiv/internal/topology/mesh_topology_compare.cc
+++ b/intern/opensubdiv/internal/topology/mesh_topology_compare.cc
@@ -106,7 +106,7 @@ bool isEqualGeometryFace(const MeshTopology &mesh_topology, const OpenSubdiv_Con
vertices_of_face.resize(num_face_vertices);
converter->getFaceVertices(converter, face_index, vertices_of_face.data());
- if (current_face.vertex_indices != vertices_of_face) {
+ if (!current_face.isVertexIndicesEqual(vertices_of_face)) {
return false;
}
}
More information about the Bf-blender-cvs
mailing list