docs: def render_thread(self):
      """A render loop that pulls observations off the queue to render."""
      obs = True
      while obs:  # Send something falsy through the queue to shut down.
        obs = self._obs_queue.get()
        if obs:
          for alert in obs.observation.alerts:
            self._alerts[sc_pb.Alert.Name(alert)] = time.time()
          for err in obs.action_errors:
            if err.result != sc_err.Success:
              self._alerts[sc_err.ActionResult.Name(err.result)] = time.time()
          self.prepare_actions(obs)
          if self._obs_queue.empty():
            # Only render the latest observation so we keep up with the game.
            self.render_obs(obs)
          if self._video_writer:
            self._video_writer.add(np.transpose(
                pygame.surfarray.pixels3d(self._window), axes=(1, 0, 2)))
        self._obs_queue.task_done()