我开始使用Java中的OpenGL,我遇到的情况是我需要在许多glBegin()和glEnd()调用之间放置大量代码,并且希望代码是自动格式化,以便一目了然哪些代码属于哪个glBegin / glEnd。
为实现这一目标,我一直在使用匿名代码块,如下所示:
glBegin(GL_QUADS);
{
glVertex2f(100, 100);
glVertex2f(100+200, 100);
glVertex2f(100+200, 100+200);
glVertex2f(100, 100+200);
}
glEnd();
我的问题是:对于以这种方式使用代码块,是否存在任何性能问题,即使是非常小的问题?或者,一旦编译程序,它是否完全不使用代码块?
答案 0 :(得分:6)
使用这样的块应该没有成本。块是用于作用域的语言的语法特征,并且没有关联的运行时功能。查看由JVM执行的编译字节码,无法确定函数的作用域规则是什么,因此JVM应该在有和没有块的情况下提供相同的性能。
如果你觉得它更容易阅读,请随意这样做。事实上,除非你有理由怀疑,否则这几乎应该是你的首要任务。
希望这有帮助!
答案 1 :(得分:5)
对glVertex的无数次调用对其性能的影响远远超过其他任何因素。这应该是你真正关心的问题。查看顶点数组和顶点缓冲区对象,以获得真正的性能提升。你的代码看起来也会更好。
答案 2 :(得分:1)
如果您不打算在块本地声明变量,那么根本不要使用本地块。除了在必须阅读和维护代码的人(包括你自己)中引起混淆的非常现实的可能性之外,你没有获得任何好处。
本地块对于声明方法内的短期对象非常有用,这些对象仅在块的持续时间内保留在作用域中。即便如此,在方法结束之前,没有什么可以保证他们会收集垃圾。
使用本地块作为性能优化是没有问题的,你最好分析你的应用程序并调整被证明是缓慢的部分,而不是执行这样的微优化,最终会使代码更难以阅读和维护。
使用本地块来提高可读性,这是值得商榷的,但是它可以为块内执行的代码打开一堆关于作用域问题的蠕虫,可能会产生一些非常难以发现的错误。
为了便于阅读,为什么不在每个glBegin()
和glEnd()
之前和之后发表一些有用的评论?