You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-12 13:20:55 +00:00
Reduce unnecessary COW on Vector by make writing explicit
This commit makes operator[] on Vector const and adds a write proxy to it. From now on writes to Vectors need to happen through the .write proxy. So for instance: Vector<int> vec; vec.push_back(10); std::cout << vec[0] << std::endl; vec.write[0] = 20; Failing to use the .write proxy will cause a compilation error. In addition COWable datatypes can now embed a CowData pointer to their data. This means that String, CharString, and VMap no longer use or derive from Vector. _ALWAYS_INLINE_ and _FORCE_INLINE_ are now equivalent for debug and non-debug builds. This is a lot faster for Vector in the editor and while running tests. The reason why this difference used to exist is because force-inlined methods used to give a bad debugging experience. After extensive testing with modern compilers this is no longer the case.
This commit is contained in:
@@ -177,7 +177,7 @@ void CSGShape::_update_shape() {
|
||||
Vector<int> face_count;
|
||||
face_count.resize(n->materials.size() + 1);
|
||||
for (int i = 0; i < face_count.size(); i++) {
|
||||
face_count[i] = 0;
|
||||
face_count.write[i] = 0;
|
||||
}
|
||||
|
||||
for (int i = 0; i < n->faces.size(); i++) {
|
||||
@@ -200,7 +200,7 @@ void CSGShape::_update_shape() {
|
||||
}
|
||||
}
|
||||
|
||||
face_count[idx]++;
|
||||
face_count.write[idx]++;
|
||||
}
|
||||
|
||||
Vector<ShapeUpdateSurface> surfaces;
|
||||
@@ -210,18 +210,18 @@ void CSGShape::_update_shape() {
|
||||
//create arrays
|
||||
for (int i = 0; i < surfaces.size(); i++) {
|
||||
|
||||
surfaces[i].vertices.resize(face_count[i] * 3);
|
||||
surfaces[i].normals.resize(face_count[i] * 3);
|
||||
surfaces[i].uvs.resize(face_count[i] * 3);
|
||||
surfaces[i].last_added = 0;
|
||||
surfaces.write[i].vertices.resize(face_count[i] * 3);
|
||||
surfaces.write[i].normals.resize(face_count[i] * 3);
|
||||
surfaces.write[i].uvs.resize(face_count[i] * 3);
|
||||
surfaces.write[i].last_added = 0;
|
||||
|
||||
if (i != surfaces.size() - 1) {
|
||||
surfaces[i].material = n->materials[i];
|
||||
surfaces.write[i].material = n->materials[i];
|
||||
}
|
||||
|
||||
surfaces[i].verticesw = surfaces[i].vertices.write();
|
||||
surfaces[i].normalsw = surfaces[i].normals.write();
|
||||
surfaces[i].uvsw = surfaces[i].uvs.write();
|
||||
surfaces.write[i].verticesw = surfaces.write[i].vertices.write();
|
||||
surfaces.write[i].normalsw = surfaces.write[i].normals.write();
|
||||
surfaces.write[i].uvsw = surfaces.write[i].uvs.write();
|
||||
}
|
||||
|
||||
//fill arrays
|
||||
@@ -281,7 +281,7 @@ void CSGShape::_update_shape() {
|
||||
surfaces[idx].normalsw[last + order[j]] = normal;
|
||||
}
|
||||
|
||||
surfaces[idx].last_added += 3;
|
||||
surfaces.write[idx].last_added += 3;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -290,9 +290,9 @@ void CSGShape::_update_shape() {
|
||||
|
||||
for (int i = 0; i < surfaces.size(); i++) {
|
||||
|
||||
surfaces[i].verticesw = PoolVector<Vector3>::Write();
|
||||
surfaces[i].normalsw = PoolVector<Vector3>::Write();
|
||||
surfaces[i].uvsw = PoolVector<Vector2>::Write();
|
||||
surfaces.write[i].verticesw = PoolVector<Vector3>::Write();
|
||||
surfaces.write[i].normalsw = PoolVector<Vector3>::Write();
|
||||
surfaces.write[i].uvsw = PoolVector<Vector2>::Write();
|
||||
|
||||
if (surfaces[i].last_added == 0)
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user