Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGl帧缓冲区性能问题_Java_Opengl_2d_Jogl_Framebuffer - Fatal编程技术网

Java OpenGl帧缓冲区性能问题

Java OpenGl帧缓冲区性能问题,java,opengl,2d,jogl,framebuffer,Java,Opengl,2d,Jogl,Framebuffer,我目前正在尝试为我用JAVA开发的游戏创建一个简单的照明引擎。我使用帧缓冲区对象将光源的图像绘制到环境色上,并将其与先前渲染的场景相结合以获得简单的照明。一切都很好地工作,除了帧率被削减一半,从稳定的60帧到波动的30帧 以下是我目前的做法: (这是在我的主显示循环中完成的) 将帧缓冲区创建移出我的循环确实解决了问题: public void init(GL2 gl2) { int[] params1 = new int[1]; gl2.glGenTextures(1, para

我目前正在尝试为我用JAVA开发的游戏创建一个简单的照明引擎。我使用帧缓冲区对象将光源的图像绘制到环境色上,并将其与先前渲染的场景相结合以获得简单的照明。一切都很好地工作,除了帧率被削减一半,从稳定的60帧到波动的30帧

以下是我目前的做法:

(这是在我的主显示循环中完成的)


将帧缓冲区创建移出我的循环确实解决了问题:

public void init(GL2 gl2)
{
    int[] params1 = new int[1];
    gl2.glGenTextures(1, params1, 0);
    textureID = params1[0];
    gl2.glBindTexture(GL.GL_TEXTURE_2D, textureID);
    gl2.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
    gl2.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
    gl2.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, Game.RES_WIDTH, Game.RES_HEIGHT, 0, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, null);

    int[] params2 = new int[1];
    gl2.glGenFramebuffers(1, params2, 0);
    frameBufferID = params2[0];
    gl2.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, frameBufferID);
    gl2.glFramebufferTexture2D(GL2.GL_DRAW_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, textureID, 0);

    gl2.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, 0);
}

你应该分析你的代码,看看减速的地方。它是
gl2.glGenFramebuffers(1,params2,0)
是否有可能提前生成所需的帧缓冲区,并在每次循环中重复使用它们?坏消息是,
glGenFramebuffers(…)
实际上什么都不做。它返回第一个未使用的名称并保留它,仅此而已。这意味着,无论您使用何种技术来确定您的瓶颈是什么,此函数都是错误的。更有可能的是,
gl2.glBindFramebuffer(…)
是您的实际瓶颈-这是唯一一个在
glGenFramebuffers(…)
附近具有可测量开销的API调用。这实际上会在您保留FBO后创建FBO,这可能会产生可观的开销。如果您的瓶颈合法地是
glGenFramebuffers(…)
,那么JOGL做错了什么。不过我很好奇,为什么您要给
glClear(…)
一个位掩码0?你在告诉它什么也不要清除。虽然这不会设置任何错误位,因此不会产生错误,但也完全没有意义。
public void init(GL2 gl2)
{
    int[] params1 = new int[1];
    gl2.glGenTextures(1, params1, 0);
    textureID = params1[0];
    gl2.glBindTexture(GL.GL_TEXTURE_2D, textureID);
    gl2.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_NEAREST);
    gl2.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_NEAREST);
    gl2.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGBA8, Game.RES_WIDTH, Game.RES_HEIGHT, 0, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, null);

    int[] params2 = new int[1];
    gl2.glGenFramebuffers(1, params2, 0);
    frameBufferID = params2[0];
    gl2.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, frameBufferID);
    gl2.glFramebufferTexture2D(GL2.GL_DRAW_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, textureID, 0);

    gl2.glBindFramebuffer(GL2.GL_DRAW_FRAMEBUFFER, 0);
}