为什么在有println语句的情况下我的while循环的行为有所不同

时间:2018-10-23 23:33:42

标签: java eclipse if-statement while-loop keylistener

我正在制作一个光线追踪器,除此错误外,它工作得很好。该错误位于while循环中,该循环根据用户的输入来控制如何实时更新图像(如果场景发生变化,则必须更新图像)。

我所遇到的问题是,据我所知,while循环的逻辑是正确的(它在调试模式下工作,并且可以通过将println()语句放在while循环的主体)。但是,如果没有print语句,则在第一次迭代后将忽略循环内的if语句。当我遍历调试器(带有或不带有打印语句)时,不会忽略任何内容,并且代码按预期工作。

这里是发生错误的函数(请记住,raytracer可以工作,所以问题(据我所知)与缓冲图像或可运行对象或类似对象无关):< / p>

public void run() {

    running = true;
    reset = true;

    canvas.createBufferStrategy(3);
    BufferStrategy bs = canvas.getBufferStrategy();

    System.out.println("render thread started");
    while (running) {

        if (reset) {
            System.out.println("rendering...");
            randomPixelLoop(bs);
            System.out.println("done");
        }

    }
    System.out.println("render thread done");

}

这是循环主体中的print语句(上面的代码不起作用,但是下面的代码起作用):

public void run() {

    running = true;
    reset = true;

    canvas.createBufferStrategy(3);
    BufferStrategy bs = canvas.getBufferStrategy();

    System.out.println("render thread started");
    while (running) {

        if (reset) {
            System.out.println("rendering...");
            randomPixelLoop(bs);
            System.out.println("done");
        }
        System.out.println("still looping");

    }
    System.out.println("render thread done");

}

这是它的作用:

run()方法是可运行对象“ Tracer”的运行方法,该对象可控制某些图像属性(包括“ running”和“ reset”变量),否则效果很好。 (使用相同的Tracer对象创建一个或几个线程,以并行化渲染)。

“重置”是一个变量,它根据另一个线程(“控制器”线程)中的键侦听器进行更改。如果为true,则执行if语句中的代码,从而将场景呈现为当前状态。

“ randomPixelLoop()”是实际执行渲染的方法。首先将“重置”设置为false,然后在以下两种情况之一下返回:图像达到足够的质量,或者用户更改了场景的某些内容(即,移动了相机,物体或灯光)。当用户更改场景时,“ reset”设置为true,并且render方法返回到if语句的正文(同样,我已经验证了它在上面概述的条件下可以正常工作)

总体效果是:根据当前场景(缓慢)创建图像。在图像完成之前或之后的任何时候,用户都可以更改视角或移动对象,这将重置图像并重新开始渲染。

在while循环的主体中(如果if语句之外)有一个print语句时,整个程序将按预期运行。当我通过调试器时,我可以看到“ reset”的值是正确的,并且循环按照应有的方式执行。如果没有print语句,也没有在调试器中,则循环似乎以奇怪的方式忽略了if语句。 (它只渲染一次图像,在完成之前它仍然可以被场景中的更改打断,但是一旦完成图像,用户输入就无法重置图像。)

为什么在评估“ if”语句时,print语句的存在根本没有任何区别?在什么情况下,java在调试器中对while循环的处理方式可能会与其他情况不同? (我正在使用Eclipse btw)

0 个答案:

没有答案