4

我开始使用 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();

我的问题是:以这种方式使用代码块是否有任何性能问题,即使非常轻微?还是与编译程序后根本不使用代码块相同?

4

3 回答 3

6

使用这样的块应该没有成本。块是用于范围界定的语言的句法特征,并且没有关联的运行时功能。查看 JVM 执行的编译字节码,无法判断函数的作用域规则是什么,因此 JVM 应该在有和没有块的情况下提供相同的性能。

如果您认为它更易于阅读,请随意执行此操作。事实上,这几乎总是你的首要任务,除非你有理由怀疑。

希望这可以帮助!

于 2012-04-08T20:02:18.257 回答
5

对 glVertex 的无数次调用对您的性能的影响比其他任何事情都大得多。这应该是你真正关心的问题。查看顶点数组和顶点缓冲区对象以获得真正的性能提升。您的代码也会看起来更好。

于 2012-04-08T20:19:55.380 回答
1

如果您不打算将变量声明为块的本地变量,则根本不要使用本地块。这样做除了可能导致必须阅读和维护您的代码的人(包括您自己)感到困惑之外,您什么也得不到。

本地块对于在方法内声明短期对象很有用,这些对象仅在块的持续时间内保留在范围内。即便如此,也无法保证他们会在方法结束之前收集到垃圾。

使用本地块作为性能优化是没有实际意义的,您最好对应用程序进行分析并调整被证明很慢的部分,而不是执行诸如此类最终会使代码更难阅读和维护的微优化。

使用本地块来提高可读性,这是值得商榷的,但它可能会为在块内执行的代码的范围问题打开一罐蠕虫的可能性,可能会产生一些非常难以发现的错误。

为了可读性,为什么不在每个glBegin()and之前和之后添加一些放置良好的评论glEnd()呢?

于 2012-04-08T20:12:54.107 回答