当前位置: 首页 > 知识库问答 >
问题:

使用游戏循环比使用计时器有什么优势?

年健
2023-03-14

我想每秒运行一个函数60次。我更喜欢使用Util定时器,我认为这是一个非常简单的方法

int second = 1000;
int fpsLimit = 60;
Timer timer = new Timer();
TimerTask task = new TimerTask(){

    public void run(){
    //
    }

    }
    
   
timer.scheduleAtFixedRate(task, 0, second / fpsLimit);`

但是我看到很多人使用游戏循环,它们更长更复杂。

long lastime = System.nanoTime();
double AmountOfTicks = 30;
double ns = 1000000000 / AmountOfTicks;
            double delta = 0;
            int frames = 0;
            double time = System.currentTimeMillis();
            
            while(isRunning == true) {
                long now = System.nanoTime();
                delta += (now - lastime) / ns;
                lastime = now;
                
                if(delta >= 1) {
                    Update();
                    Render();
                    frames++;
                    delta--;
                    if(System.currentTimeMillis() - time >= 1000) {
                        System.out.println("fps:" + frames);
                        time += 1000;
                        frames = 0;
                    }
                }
            }

抱歉,因为我并不真正理解gameloops,除了跟踪fps之外,使用它们还有什么好处吗?

共有1个答案

羊舌琛
2023-03-14

答案可能可以用一个词来概括:准确性。

计时器经常使用线程。睡眠或另一种类似的方法,让一个线程进入睡眠状态,然后在时间流逝时将其唤醒。

它是有效的,但分辨率通常不超过几十毫秒。同样,我们可以说延迟是向上舍入的,或者线程的睡眠时间可能比指定的稍长,或者计时器在两次调用之间的等待时间可能不完全相同。这意味着基本相同的事情。

当然,对于运行游戏并正确渲染它来说,这太不准确了。精确计算自己需要等待的时间,并以纳秒为单位指定目标延迟。

 类似资料:
  • 问题内容: 我正在尝试为xlib窗口创建游戏循环,但是无法正确绘制该窗口。现在,我正在使用XCreateSimpleWindow(…)创建一个窗口,并使用for循环一次绘制所有像素。(这些像素的颜色是从一个大的整数数组中读取的,现在,我将所有像素设置为蓝色。)现在,实际的游戏循环如下: 全局定义了变量dsp,win,pixels,gc。 现在,当我编译并执行二进制文件时,y坐标低的行主要是蓝色,而

  • 出于好奇,如果在java8样式中使用Comparator,即使用Lambda表达式比常规比较有任何优势,即。 一种按id排序的方法是:- 其他方法可以是Java 8 way:- 与前一种方法相比,后一种方法(< code>java-8方法参考)是否有性能优势? 请帮忙!!!

  • 本食谱演示了使用组合流来创建游戏循环的一种方式。本食谱旨在突出如何用响应式的方式来重新思考现有问题。在这个示例中,我们将提供整体循环以及自上帧以来的增量时间。与此相结合的是用户输入流,以及当前的游戏状态,我们可以用它来更新我们的对象,并根据每帧的发出来将其渲染到屏幕上。 示例代码 ( StackBlitz ) import { BehaviorSubject, Observable, of, fr

  • 包含在程序启动时启动的线程。这个线程包含一个循环,每40毫秒更新一次游戏并重新绘制()board。 备选办法B: 板创建一个摆动计时器。这个计时器的动作监听器是板本身。actionPerformed()方法每40毫秒运行一次,并更新game+repaints Board()。 谢谢

  • 问题内容: 有人可以告诉我为什么对node.js如此大惊小怪吗?与用php框架编写的常规网站相比,用node.js编写的常规网站(比如博客)是否更快?我知道用node.js编写的Web服务器将比apache快,但是不创建线程或类似对象的真实Web应用程序呢? 问题答案: 编辑: 有两个主要优点: 速度!(性能) Node.js是事件驱动和非阻塞的,并且非常擅长处理并发请求。 这是指向 Apache

  • 问题内容: 用…实现事情 似乎 已经 很简单 了… 与 ngResource相比 ,使用Restangular 有哪些优点/缺点? 1.1.3 将返回承诺,并且可以使用[最新的PRcommit来实现。将来会提供支持来支持Restangular所做的其他动词吗?如果发生这种情况,Restangular似乎将消失并变得不耐烦。 问题答案: 我是Restangular的创建者。 我已经在自述文件中创建了