public void run()
    {
        long lastTime = System.nanoTime();
        double nsPerTick = 1000000000D / 60D;
        
        int ticks = 0;
        int frames = 0;
        
        long lastTimer = System.currentTimeMillis();
        double delta = 0;
        
        init();
        
        while (running)
        {
            long now = System.nanoTime();
            delta += (now - lastTime) / nsPerTick;
            lastTime = now;
            boolean shouldRender = true;
            
            while (delta >= 1)
            {
                ticks++;
                tick();
                delta -= 1;
                
                shouldRender = true;
            }
            
            try
            {
                Thread.sleep(2);
            } catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            
            if (shouldRender)
            {
                frames++;
                render();
            }
            
            if (System.currentTimeMillis() - lastTimer >= 1000)
            {
                lastTimer += 1000;
                
                System.out.println( Reference.ENGINE_NAME + ": " + ticks + " Ticks, " + frames + " FPS" );
                
                frames = 0;
                ticks = 0;
            }
        }
    }