Преглед на файлове

Initialize and execute the engine in a dedicated thread, first try

Daniele Bartolini преди 12 години
родител
ревизия
e49893e087
променени са 3 файла, в които са добавени 49 реда и са изтрити 18 реда
  1. 46 10
      engine/Device.cpp
  2. 3 0
      engine/Device.h
  3. 0 8
      engine/os/linux/main.cpp

+ 46 - 10
engine/Device.cpp

@@ -66,6 +66,33 @@ OTHER DEALINGS IN THE SOFTWARE.
 namespace crown
 {
 
+class MainThread : public Thread
+{
+public:
+
+	MainThread()
+		: Thread("main-thread")
+	{
+	}
+
+	int32_t run()
+	{
+		Device* engine = device();
+		engine->init();
+
+		while (!is_terminating() && engine->is_running())
+		{
+			engine->frame();
+		}
+
+		engine->shutdown();
+
+		return 0;
+	}
+};
+
+static MainThread g_main_thread;
+
 //-----------------------------------------------------------------------------
 Device::Device() : 
 	m_allocator(m_subsystems_heap, MAX_SUBSYSTEMS_HEAP),
@@ -141,6 +168,15 @@ bool Device::init(int argc, char** argv)
 		}
 	#endif
 
+	g_main_thread.start();
+	g_main_thread.join();
+
+	return true;
+}
+
+//-----------------------------------------------------------------------------
+void Device::init()
+{
 	// Initialize
 	Log::i("Initializing Crown Engine %d.%d.%d...", CROWN_VERSION_MAJOR, CROWN_VERSION_MINOR, CROWN_VERSION_MICRO);
 
@@ -225,8 +261,6 @@ bool Device::init(int argc, char** argv)
 		stop();
 		shutdown();
 	}
-
-	return true;
 }
 
 //-----------------------------------------------------------------------------
@@ -234,6 +268,8 @@ void Device::shutdown()
 {
 	CE_ASSERT(is_init(), "Engine is not initialized");
 
+	g_main_thread.stop();
+
 	// Shutdowns the game
 	m_lua_environment->call_global("shutdown", 0);
 
@@ -441,21 +477,21 @@ void Device::frame()
 	m_last_delta_time = (m_current_time - m_last_time) / 1000000.0f;
 	m_last_time = m_current_time;
 
-	m_resource_manager->poll_resource_loader();
-
-	m_window->frame();
-	m_input_manager->frame(frame_count());
-
 	if (!m_is_paused)
 	{
+		m_resource_manager->poll_resource_loader();
+
+		m_window->frame();
+		m_input_manager->frame(frame_count());
+
 		if (!m_lua_environment->call_global("frame", 1, ARGUMENT_FLOAT, last_delta_time()))
 		{
 			pause();
 		}
-	}
 
-	m_debug_renderer->draw_all();
-	m_renderer->frame();
+		m_debug_renderer->draw_all();
+		m_renderer->frame();
+	}
 
 	m_frame_count++;
 }

+ 3 - 0
engine/Device.h

@@ -132,6 +132,7 @@ public:
 
 private:
 
+	void					init();
 	void					parse_command_line(int argc, char** argv);
 	void					check_preferred_settings();
 	void					read_engine_settings();
@@ -188,6 +189,8 @@ private:
 	// Disable copying
 	Device(const Device&);
 	Device& operator=(const Device&);
+
+	friend class MainThread;
 };
 
 CE_EXPORT Device* device();

+ 0 - 8
engine/os/linux/main.cpp

@@ -37,14 +37,6 @@ int main(int argc, char** argv)
 		exit(-1);
 	}
 
-	// Main loop
-	while (engine->is_running())
-	{
-		engine->frame();
-	}
-
-	engine->shutdown();
-
 	return 0;
 }