public void init(GLAutoDrawable gLDrawable) {
        Thread.currentThread().setPriority(Thread.MAX_PRIORITY);

        getGL2(); // Repopulate gl each frame because it is not guaranteed to be persistent

        gl.glShadeModel(GL2.GL_SMOOTH);
        gl.setSwapInterval(1); // Enable V-Sync supposedly
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
        gl.glClearDepth(1.0f);
        gl.glEnable(GL2.GL_CULL_FACE);
        gl.glEnable(GL2.GL_DEPTH_TEST);
        gl.glEnable(GL2.GL_TEXTURE_2D);
        gl.glDepthFunc(GL2.GL_LEQUAL);
        gl.glHint(GL2.GL_PERSPECTIVE_CORRECTION_HINT, GL2.GL_NICEST);
        gl.glMatrixMode(GL2.GL_PROJECTION);
        gl.glLoadIdentity();
        gl.glFrustumf(-1, 1, -1, 1, Vector3f.EPSILON, FAR_PLANE);
        gl.glMatrixMode(GL2.GL_MODELVIEW);

        ((Component) gLDrawable).addKeyListener(game.Game.getInputHandler());

        Model.loadModels();
        Texture.initialize(gl);

        for(Model model: Model.loaded_models())
            build_display_list(model);

        try {
            shader.init(gl);
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
        shader.enable(gl);
        // We have to setup the lights after we enable the shader so we can set the uniform
        Light.initialize(gl, NUM_LIGHTS);
        shader.setUniform1i(gl, "numLights", NUM_LIGHTS);
        shader.setUniform1b(gl, "lightingEnabled", true);

        System.gc(); // This is probably a good a idea
    }