Browse Source

Variant large bucket memory pool - for Projection

Add a larger bucket size pool for the new Projection Matrix.
lawnjelly 3 years ago
parent
commit
bb273bc972
3 changed files with 28 additions and 14 deletions
  1. 16 9
      core/variant/variant.cpp
  2. 8 2
      core/variant/variant.h
  3. 4 3
      core/variant/variant_internal.h

+ 16 - 9
core/variant/variant.cpp

@@ -40,6 +40,7 @@
 #include "core/variant/variant_parser.h"
 #include "core/variant/variant_parser.h"
 
 
 PagedAllocator<Variant::Pools::BucketSmall, true> Variant::Pools::_bucket_small;
 PagedAllocator<Variant::Pools::BucketSmall, true> Variant::Pools::_bucket_small;
+PagedAllocator<Variant::Pools::BucketMedium, true> Variant::Pools::_bucket_medium;
 PagedAllocator<Variant::Pools::BucketLarge, true> Variant::Pools::_bucket_large;
 PagedAllocator<Variant::Pools::BucketLarge, true> Variant::Pools::_bucket_large;
 
 
 String Variant::get_type_name(Variant::Type p_type) {
 String Variant::get_type_name(Variant::Type p_type) {
@@ -1191,15 +1192,16 @@ void Variant::reference(const Variant &p_variant) {
 			memnew_placement(_data._mem, Quaternion(*reinterpret_cast<const Quaternion *>(p_variant._data._mem)));
 			memnew_placement(_data._mem, Quaternion(*reinterpret_cast<const Quaternion *>(p_variant._data._mem)));
 		} break;
 		} break;
 		case BASIS: {
 		case BASIS: {
-			_data._basis = (Basis *)Pools::_bucket_large.alloc();
+			_data._basis = (Basis *)Pools::_bucket_medium.alloc();
 			memnew_placement(_data._basis, Basis(*p_variant._data._basis));
 			memnew_placement(_data._basis, Basis(*p_variant._data._basis));
 		} break;
 		} break;
 		case TRANSFORM3D: {
 		case TRANSFORM3D: {
-			_data._transform3d = (Transform3D *)Pools::_bucket_large.alloc();
+			_data._transform3d = (Transform3D *)Pools::_bucket_medium.alloc();
 			memnew_placement(_data._transform3d, Transform3D(*p_variant._data._transform3d));
 			memnew_placement(_data._transform3d, Transform3D(*p_variant._data._transform3d));
 		} break;
 		} break;
 		case PROJECTION: {
 		case PROJECTION: {
-			_data._projection = memnew(Projection(*p_variant._data._projection));
+			_data._projection = (Projection *)Pools::_bucket_large.alloc();
+			memnew_placement(_data._projection, Projection(*p_variant._data._projection));
 		} break;
 		} break;
 
 
 		// misc types
 		// misc types
@@ -1401,19 +1403,23 @@ void Variant::_clear_internal() {
 		case BASIS: {
 		case BASIS: {
 			if (_data._basis) {
 			if (_data._basis) {
 				_data._basis->~Basis();
 				_data._basis->~Basis();
-				Pools::_bucket_large.free((Pools::BucketLarge *)_data._basis);
+				Pools::_bucket_medium.free((Pools::BucketMedium *)_data._basis);
 				_data._basis = nullptr;
 				_data._basis = nullptr;
 			}
 			}
 		} break;
 		} break;
 		case TRANSFORM3D: {
 		case TRANSFORM3D: {
 			if (_data._transform3d) {
 			if (_data._transform3d) {
 				_data._transform3d->~Transform3D();
 				_data._transform3d->~Transform3D();
-				Pools::_bucket_large.free((Pools::BucketLarge *)_data._transform3d);
+				Pools::_bucket_medium.free((Pools::BucketMedium *)_data._transform3d);
 				_data._transform3d = nullptr;
 				_data._transform3d = nullptr;
 			}
 			}
 		} break;
 		} break;
 		case PROJECTION: {
 		case PROJECTION: {
-			memdelete(_data._projection);
+			if (_data._projection) {
+				_data._projection->~Projection();
+				Pools::_bucket_large.free((Pools::BucketLarge *)_data._projection);
+				_data._projection = nullptr;
+			}
 		} break;
 		} break;
 			// misc types
 			// misc types
 		case STRING_NAME: {
 		case STRING_NAME: {
@@ -2635,7 +2641,7 @@ Variant::Variant(const ::AABB &p_aabb) {
 
 
 Variant::Variant(const Basis &p_matrix) {
 Variant::Variant(const Basis &p_matrix) {
 	type = BASIS;
 	type = BASIS;
-	_data._basis = (Basis *)Pools::_bucket_large.alloc();
+	_data._basis = (Basis *)Pools::_bucket_medium.alloc();
 	memnew_placement(_data._basis, Basis(p_matrix));
 	memnew_placement(_data._basis, Basis(p_matrix));
 }
 }
 
 
@@ -2646,13 +2652,14 @@ Variant::Variant(const Quaternion &p_quaternion) {
 
 
 Variant::Variant(const Transform3D &p_transform) {
 Variant::Variant(const Transform3D &p_transform) {
 	type = TRANSFORM3D;
 	type = TRANSFORM3D;
-	_data._transform3d = (Transform3D *)Pools::_bucket_large.alloc();
+	_data._transform3d = (Transform3D *)Pools::_bucket_medium.alloc();
 	memnew_placement(_data._transform3d, Transform3D(p_transform));
 	memnew_placement(_data._transform3d, Transform3D(p_transform));
 }
 }
 
 
 Variant::Variant(const Projection &pp_projection) {
 Variant::Variant(const Projection &pp_projection) {
 	type = PROJECTION;
 	type = PROJECTION;
-	_data._projection = memnew(Projection(pp_projection));
+	_data._projection = (Projection *)Pools::_bucket_large.alloc();
+	memnew_placement(_data._projection, Projection(pp_projection));
 }
 }
 
 
 Variant::Variant(const Transform2D &p_transform) {
 Variant::Variant(const Transform2D &p_transform) {

+ 8 - 2
core/variant/variant.h

@@ -142,14 +142,20 @@ private:
 			Transform2D _transform2d;
 			Transform2D _transform2d;
 			::AABB _aabb;
 			::AABB _aabb;
 		};
 		};
+		union BucketMedium {
+			BucketMedium() {}
+			~BucketMedium() {}
+			Basis _basis;
+			Transform3D _transform3d;
+		};
 		union BucketLarge {
 		union BucketLarge {
 			BucketLarge() {}
 			BucketLarge() {}
 			~BucketLarge() {}
 			~BucketLarge() {}
-			Basis _basis;
-			Transform3D _transform3d;
+			Projection _projection;
 		};
 		};
 
 
 		static PagedAllocator<BucketSmall, true> _bucket_small;
 		static PagedAllocator<BucketSmall, true> _bucket_small;
+		static PagedAllocator<BucketMedium, true> _bucket_medium;
 		static PagedAllocator<BucketLarge, true> _bucket_large;
 		static PagedAllocator<BucketLarge, true> _bucket_large;
 	};
 	};
 
 

+ 4 - 3
core/variant/variant_internal.h

@@ -227,17 +227,18 @@ public:
 		v->type = Variant::AABB;
 		v->type = Variant::AABB;
 	}
 	}
 	_FORCE_INLINE_ static void init_basis(Variant *v) {
 	_FORCE_INLINE_ static void init_basis(Variant *v) {
-		v->_data._basis = (Basis *)Variant::Pools::_bucket_large.alloc();
+		v->_data._basis = (Basis *)Variant::Pools::_bucket_medium.alloc();
 		memnew_placement(v->_data._basis, Basis);
 		memnew_placement(v->_data._basis, Basis);
 		v->type = Variant::BASIS;
 		v->type = Variant::BASIS;
 	}
 	}
 	_FORCE_INLINE_ static void init_transform(Variant *v) {
 	_FORCE_INLINE_ static void init_transform(Variant *v) {
-		v->_data._transform3d = (Transform3D *)Variant::Pools::_bucket_large.alloc();
+		v->_data._transform3d = (Transform3D *)Variant::Pools::_bucket_medium.alloc();
 		memnew_placement(v->_data._transform3d, Transform3D);
 		memnew_placement(v->_data._transform3d, Transform3D);
 		v->type = Variant::TRANSFORM3D;
 		v->type = Variant::TRANSFORM3D;
 	}
 	}
 	_FORCE_INLINE_ static void init_projection(Variant *v) {
 	_FORCE_INLINE_ static void init_projection(Variant *v) {
-		v->_data._projection = memnew(Projection);
+		v->_data._projection = (Projection *)Variant::Pools::_bucket_large.alloc();
+		memnew_placement(v->_data._projection, Projection);
 		v->type = Variant::PROJECTION;
 		v->type = Variant::PROJECTION;
 	}
 	}
 	_FORCE_INLINE_ static void init_string_name(Variant *v) {
 	_FORCE_INLINE_ static void init_string_name(Variant *v) {