[Bf-blender-cvs] [ac6038e] cycles_memory_experiments: Cycles: free mesh BVH after packing the scene BVH

Sergey Sharybin noreply at git.blender.org
Fri Apr 10 20:33:20 CEST 2015


Commit: ac6038e9914f2e9fe73b12c57f89f969be1f2bb7
Author: Sergey Sharybin
Date:   Thu Apr 2 21:08:20 2015 +0500
Branches: cycles_memory_experiments
https://developer.blender.org/rBac6038e9914f2e9fe73b12c57f89f969be1f2bb7

Cycles: free mesh BVH after packing the scene BVH

The idea is to avoid having original BVH and BVH packed into scene BVH and hence
reduce memory footprint.

This change doesn't give any measurable differences on it's own, but together
with D1215 and D1217 it gives quite nice results.

Reviewers: campbellbarton, brecht, juicyfruit

Subscribers: eyecandy

Differential Revision: https://developer.blender.org/D1218

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/render/scene.cpp
M	intern/cycles/render/scene.h

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index bdacea0..5b13647 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -100,7 +100,8 @@ void BlenderSession::create_session()
 	start_resize_time = 0.0;
 
 	/* create scene */
-	scene = new Scene(scene_params, session_params.device);
+	bool free_data_after_update = background && !scene_params.persistent_data;
+	scene = new Scene(scene_params, session_params.device, free_data_after_update);
 
 	/* setup callbacks for builtin image support */
 	scene->image_manager->builtin_image_info_cb = function_bind(&BlenderSession::builtin_image_info, this, _1, _2, _3, _4, _5, _6, _7);
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index c21a9ac..5e205bf 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -554,9 +554,10 @@ bool Mesh::has_motion_blur() const
 
 /* Mesh Manager */
 
-MeshManager::MeshManager()
+MeshManager::MeshManager(const bool free_data_after_update_)
 {
 	bvh = NULL;
+	free_data_after_update = free_data_after_update_;
 	need_update = true;
 	need_flags_update = true;
 }
@@ -1304,6 +1305,15 @@ void MeshManager::device_update(Device *device, DeviceScene *dscene, Scene *scen
 
 	device_update_bvh(device, dscene, scene, progress);
 
+	if(free_data_after_update) {
+		foreach(Object *object, scene->objects) {
+			if(object->mesh->bvh != NULL) {
+				delete object->mesh->bvh;
+				object->mesh->bvh = NULL;
+			}
+		}
+	}
+
 	need_update = false;
 }
 
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 76c186a..887ef65 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -152,7 +152,10 @@ public:
 	bool need_update;
 	bool need_flags_update;
 
-	MeshManager();
+	/* Free memory used by BVH after device update. */
+	bool free_data_after_update;
+
+	MeshManager(const bool free_data_after_update);
 	~MeshManager();
 
 	bool displace(Device *device, DeviceScene *dscene, Scene *scene, Mesh *mesh, Progress& progress);
diff --git a/intern/cycles/render/scene.cpp b/intern/cycles/render/scene.cpp
index 71741c0..0aa3dab 100644
--- a/intern/cycles/render/scene.cpp
+++ b/intern/cycles/render/scene.cpp
@@ -43,7 +43,9 @@
 
 CCL_NAMESPACE_BEGIN
 
-Scene::Scene(const SceneParams& params_, const DeviceInfo& device_info_)
+Scene::Scene(const SceneParams& params_,
+             const DeviceInfo& device_info_,
+             const bool free_data_after_update)
 : params(params_)
 {
 	device = NULL;
@@ -54,7 +56,7 @@ Scene::Scene(const SceneParams& params_, const DeviceInfo& device_info_)
 	film = new Film();
 	background = new Background();
 	light_manager = new LightManager();
-	mesh_manager = new MeshManager();
+	mesh_manager = new MeshManager(free_data_after_update);
 	object_manager = new ObjectManager();
 	integrator = new Integrator();
 	image_manager = new ImageManager();
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index 53c3a95..a68ae96 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -193,7 +193,9 @@ public:
 	/* mutex must be locked manually by callers */
 	thread_mutex mutex;
 
-	Scene(const SceneParams& params, const DeviceInfo& device_info);
+	Scene(const SceneParams& params,
+	      const DeviceInfo& device_info,
+	      const bool free_data_after_update = false);
 	~Scene();
 
 	void device_update(Device *device, Progress& progress);




More information about the Bf-blender-cvs mailing list