当前位置: 首页 > 面试题库 >

为什么用FloatBuffer而不是float []?

严远
2023-03-14
问题内容

我已经在Android代码中使用FloatBuffers一段时间了(从一些opengles教程中复制了它),但是我无法确切地理解此构造是什么以及为什么需要它。

例如,我在许多人的代码和android教程中看到了以下代码(或类似代码):

float[] vertices = ...some array...

ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
vbb.order(ByteOrder.nativeOrder());    // use the device hardware's native byte order
FloatBuffer fb = vbb.asFloatBuffer();  // create a floating point buffer from the ByteBuffer
fb.put(vertices);    // add the coordinates to the FloatBuffer
fb.position(0);      // set the buffer to read the first coordinate

就我所知,这似乎是冗长和混乱的,我只是说它们只是一个浮点数的包装而已。

问题:

  • 与任何其他类型的float集合或简单数组相反,这种类型的类(ByteBuffer,FloatBuffer)的理由是什么?

  • 在将ByteBuffer转换为FloatBuffer之前创建其背后的想法是什么?


问题答案:

主要原因是性能:ByteBuffers和其他NIO类在与本机代码交互时(通常是通过避免将数据复制到临时缓冲区中的需要)来启用加速的操作。

例如,如果您要进行许多OpenGL渲染调用,则这非常重要。

首先创建ByteBuffer的原因是您要使用allocateDirect调用来创建 直接
字节缓冲区,这得益于加速操作。然后,您可以从中创建一个共享相同内存的FloatBuffer。由于某些原因,FloatBuffer本身没有aallocateDirect方法,这就是为什么您必须通过ByteBuffer。



 类似资料:
  • 问题内容: 听说您应该在样式表中使用em而不是像素来定义尺寸和距离。所以问题是,为什么在CSS中定义样式时应该使用em而不是px?有一个很好的例子可以说明这一点吗? 问题答案: 我问这个问题的原因是,我忘记了如何使用em,因为我在CSS中愉快地编程时已经很久了。人们没有注意到我把这个问题笼罩了,因为我并不是在谈论字体本身的大小。我对如何在页面上的 任何给定块元素 上定义样式更感兴趣。 正如Henr

  • 很多人问了此问题,说bzero已经被posix-2008废弃,为何还使用bzero。选择bzero而不是memset,有2个原因: bzero有2个参数,指针和长度,很明确就是将制定size的内存初始化为0。而memset有3个参数,需要记忆参数的位置,有不少人经常把长度和初始化值搞错。 bzero比memset的可读性要好。memset可以制定初始化的值,实际上绝大多数情况都是0。 一旦新版本g

  • 我试图理解背后的动机。如果已经存在类型类和,为什么有必要呢? 诚然,的实例是具体的类型,而的实例需要一个类型参数。(有关有用的解释,请参见Monoid vs MonadPlus。)但是你不能重写任何类型的约束吗 作为和的组合? 从。它的实施是: 我只能使用和实现它: 有人能澄清和之间的真正区别吗?

  • 问题内容: 我不确定为什么列出项目时为什么需要使用ul-li而不是简单地使用div。我可以使两者看起来完全一样,因此与创建div相比,创建无序列表的功能优势在哪里? 问题答案: 为了语义正确。HTML具有表达事物列表的功能,它可以帮助Google机器人,屏幕阅读器以及所有不仅仅关心网站外观的用户更好地了解您的内容。

  • 问题内容: 的OpenJDK代码包括以下行: 为什么在这里使用,而不是?我很好奇。 问题答案: 要强调的是,数字是2的幂,而不是一个完全任意的选择。因此,它警告开发人员尝试不同的数字,他们应该在模式中使用其他数字(例如或,而不是),这样他们就不会破坏依赖于两个要求的幂的方法。有评论略高于: 任何一个的容量(表长度)始终是2的幂。之所以这样设计,是因为它允许使用快速的按位AND操作()将每个键的哈希

  • 我花了很多时间来解决这个问题。我是GRAILS和GROOVY中的begginer。我有一个名为“tms\u dev”的旧oracle数据库模式。此架构有一些表(例如checktypes表)。此外,我还有由GRAILS生成的域类Checktype和ChecktypesController类-controller。 此类具有列表方法: def列表(最大整数){ } 我还配置了Datasource。gr