diff --git a/nemu/src/device/device.cc b/nemu/src/device/device.cc
index 667f0c9a51619f3cfdccdfa008f9cbd0e9ad0e5a..f9a53043270df70ae03c50f63d62a931fc39c3b3 100644
--- a/nemu/src/device/device.cc
+++ b/nemu/src/device/device.cc
@@ -41,11 +41,6 @@ static void timer_sig_handler(int signum) {
 }
 
 void device_update_impl() {
-    // async
-    if(device_update_flag)
-        device_update_flag = false;
-    else
-        return;
   if (update_screen_flag) {
     update_screen();
     update_screen_flag = false;
@@ -75,9 +70,16 @@ void device_update_impl() {
   }
 }
 
-void device_update() {device_update_impl();}
+void device_update() {
+#ifdef ENABLE_ASYNC_RENDER
+#else
+  if(device_update_flag.exchange(false)) {
+    device_update_impl();
+  }
+#endif
+}
 
-static void device_update_thread_daemon() {
+[[maybe_unused]] static void device_update_thread_daemon() {
   while(true) {
     if(device_update_flag.exchange(false)) {
       device_update_impl();
@@ -109,7 +111,9 @@ void init_device() {
   ret = setitimer(ITIMER_VIRTUAL, &it, NULL);
   Assert(ret == 0, "Can not set timer");
 
-  // std::thread(device_update_thread_daemon).detach();
+#ifdef ENABLE_ASYNC_RENDER
+  std::thread(device_update_thread_daemon).detach();
+#endif
 }
 #else
 
diff --git a/nemu/src/device/vga.cc b/nemu/src/device/vga.cc
index 4529e8e97521f2dbd2be47529df5f9b23c12624b..8db9ea52c6bb19e644bb63884cd7a186f44ab6ef 100644
--- a/nemu/src/device/vga.cc
+++ b/nemu/src/device/vga.cc
@@ -40,7 +40,9 @@ static void init_vga_impl() {
 
 void update_screen() {
 #ifndef DISABLE_MMIO
-  // if(window == nullptr) init_vga_impl();
+#ifdef ENABLE_ASYNC_RENDER
+  if(window == nullptr) init_vga_impl();
+#endif
   SDL_ErrorCheck(SDL_UpdateTexture(texture, NULL, vmem, SCREEN_W * sizeof(vmem[0][0])));
   SDL_ErrorCheck(SDL_RenderClear(renderer));
   SDL_ErrorCheck(SDL_RenderCopy(renderer, texture, NULL, NULL));
@@ -49,9 +51,12 @@ void update_screen() {
 }
 
 void init_vga() {
+#ifdef ENABLE_ASYNC_RENDER
   // Because of fucking SDL design, vga_init should be done in updating thread.
   // Do nothing in main thread.
+#else
   init_vga_impl();
+#endif
 }
 
 #endif	/* HAS_IOE */