@Override
  protected void initGL() {

    if (glInitialized) {
      return;
    }
    glInitialized = true;

    try {
      LWJGLDisplaySystem display = (LWJGLDisplaySystem) DisplaySystem.getDisplaySystem();
      display.switchContext(this);

      // Complete canvas configuration.
      Dimension size = this.getSize();
      display.initForCanvas(size.width, size.height);

      impl.doSetup();

      if (display.getMinSamples() != 0 && GLContext.getCapabilities().GL_ARB_multisample) {
        GL11.glEnable(ARBMultisample.GL_MULTISAMPLE_ARB);
      }
    } catch (Exception e) {
      logger.log(Level.SEVERE, "Exception in initGL()", e);
    }
  }
  @Override
  protected void paintGL() {

    try {
      ((LWJGLDisplaySystem) DisplaySystem.getDisplaySystem()).switchContext(this);

      if (updateInput) {
        InputSystem.update();
      }

      GameTaskQueueManager.getManager().getQueue(GameTaskQueue.UPDATE).execute();

      impl.doUpdate();

      if (!drawWhenDirty || dirty) {
        GameTaskQueueManager.getManager().getQueue(GameTaskQueue.RENDER).execute();

        impl.doRender();

        swapBuffers();
        dirty = false;
      }
    } catch (LWJGLException e) {
      logger.log(Level.SEVERE, "Exception in paintGL()", e);
    }

    // sync
    if (syncRate > 0) {
      long sinceLast = System.nanoTime() - lastRender;
      if (sinceLast < syncNS) {
        try {
          Thread.sleep((Math.round((syncNS - sinceLast) / 1000000L)));
        } catch (InterruptedException e) {
        }
      }
      lastRender = System.nanoTime();
    }

    repaint();
  }
 public void setBackground(Color bgColor) {
   impl.setBackground(makeColorRGBA(bgColor));
 }