我最近在看一个关于用LWJGL在Java编写OpenGL游戏的教程。在其中,讲述者/作者首先将浮点数组从float[]
转换为floatbuffer
,然后将其交给gl15.glbufferdata()
。最初我对此并没有多想,但我无意中直接给gl15.glBufferData()
浮动数组,而不是将其转换为floatBuffer
,结果代码最终仍然可以工作。我查阅了文档,它只写了“array version of:bufferdata”作为注释,这仍然让我无法确定。
这让我不禁要问,假设floatbuffer
是通过使用floatbuffer::put()
给floatbuffer
赋值的,因此包含相同的数据,那么在使用Java 15在LWJGL 3.0中调用gl15.glbufferdata()
时,将float[]
转换为floatbuffer
有什么意义吗?
我建议使用float[]而不是FloatBuffer,因为float[]似乎更有效,而且这正是您所期望的:堆栈上的字节数组。另外,在幕后,FloatBuffer实际上只是一个float[],所以在一天结束的时候并没有太大的关系。继续我的观点,将float[]转换为FloatBuffer似乎是不必要的,而且过于复杂。
直接NIO缓冲区和浮点数组之间的区别在于,当您将浮点数组交给LWJGL时,它首先需要将使用JNI调用的数组pin到Java运行库中,这将给LWJGL的本机代码一个虚拟内存地址,它可以将其交给实际调用的本机函数。然后,需要再次解除浮动数组的固定,使其再次符合垃圾回收的条件。
对于直接NIO缓冲区,这不需要发生,因为直接NIO缓冲区已经由本机虚拟内存地址支持。因此使用直接的NIO缓冲区要快得多(在性能方面)。当然,当您首先创建一个浮点数组,然后将其复制到NIO缓冲区时,所有这些性能都有些损失。
您只需要不使用浮点数组,而只需要填充直接的NIO缓冲区。
假设我有一个方法: 它位于类内部。如果我只使用调用函数的对象,然后使用关键字,这有什么区别吗?这样传递一个对象似乎是多余的,并且总体上使方法看起来更干净。
问题内容: 有什么区别? 如果没有差异,那么为什么两者都存在? 问题答案: 第一个带逗号的是上个世纪的旧样式。 第二个使用CROSS JOIN的是新的ANSI JOIN语法。 而这两个查询确实会给出相同的结果。 它们都将表“ a”的每个记录链接到表“ b”的每个记录。 因此,如果表“ a”具有10行,而表“ b”具有100行。 那么结果将是10 * 100 = 1000条记录。 但是,为什么某些数
“Kafka spout”和“Kafka Consumer”都从Kafka经纪人那里检索数据,到目前为止我知道的spout是用来与Storm通信的,而Consumer是用来与其他任何东西通信的。 --但是,技术上的区别是什么? -或者,如果我使用Consumer提取数据,然后使用“Storm Spout”接收数据,和如果我只是使用“Kafka Spout”,然后将其添加到我的Storm拓扑构建器的
本文向大家介绍清空一个数组的方式有哪些?它们有什么区别?相关面试题,主要包含被问及清空一个数组的方式有哪些?它们有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 方法1 这是完美的,因为这实际上创建了一个全新的(空)数组 仅当您仅通过数组的原始变量A引用数组时才使用此选项。 方法2 通过将现有数组的长度设置为 0 来清除该数组 会影响元数组 方法3 .splice()函数将返回一个包含所有已
我的数据库中有一个请求表。这里是它的结构 通常我用手创建实体,但这次我决定从数据库生成它。这是我得到的 我注意到出现了一个奇怪的注释@Lob。我以前从未见过她。我决定用谷歌搜索它的意思以及为什么要放它。我找到了很多答案,他们都说需要这个注释,以便Hibernate理解这里可能有一个大对象。 但在我看来,这个注释没有任何作用。毕竟,不管是否值得,一切都是一样的? 它是干什么用的?
问题内容: 我发布此消息是因为该主题刚刚在另一个问题/答案中提出,并且该行为没有得到很好的记录。 考虑数据框 我想获取由column定义的每个组的第一行和最后一行。 我试过了 但是,这并没有给我我所期望的。 如何获得每个组中的实际第一个和最后一个值? 问题答案: 一种选择是使用该方法: 但是,我还没有找到一种将它们整齐地聚合的方法。当然,总是可以使用构造函数: 注意:我明确使用了该属性,否则您必须