之前,在处理1.x时,我使用以下代码来启用VSync同步:
void enableVSync()
{
frameRate(-1);
GL pgl = (PGraphicsOpenGL)g;
gl = pgl.beginGL();
gl.setSwapInterval(1);
pgl.endGL();
}
这在处理 2.x 中不起作用,我似乎无法找出它如何在处理 2.x 中工作,甚至不知道它是否应该在处理 2.x 中工作。
编辑:
通过从 size(500, 500);
切换到 size(500, 500, P2D);
,这似乎有所帮助。现在看来,处理过程在后台缓冲区中完成了所有绘图,并在 VSync 时将其切换到前台缓冲区。
但是,draw()
函数仍然与垂直同步异步,即使我不再看到任何撕裂,只要跳过一帧或绘制两次,仍然会出现运动卡顿。
最佳答案
结果,PJOGL
中的 frameRate()
实际上运行了 setSwapInterval()
,尽管关于值集有一些奇怪的逻辑 ( github )。解决此问题的方法是:
void setup()
{
setup(500, 500, P2D);
frameRate(-1); // set unlimited frame rate
((PJOGL)PGraphicsOpenGL.pgl).gl.setSwapInterval(1); // enable waiting for vsync
// before swapping back/front buffers
}
编辑:
对于处理 3,我使用以下内容:
import java.awt.*;
import javax.media.opengl.glu.GLU;
void setup()
{
frameRate(-1);
beginPGL();
GLU.getCurrentGL().getGL2().setSwapInterval(1);
endPGL();
}
编辑2:
对于Processing 3.2,以下内容似乎有效:
void setup()
{
fullScreen(P3D);
frameRate(1000);
PJOGL pgl = (PJOGL)beginPGL();
pgl.gl.setSwapInterval(1);
endPGL();
}
关于java - 如何在处理2.x中启用VSync同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20551224/