2012-05-22 23 views
38

Android kodumda bir süredir FloatBuffers kullanıyorum (bazı opengles eğiticilerinden kopyaladım), ancak bu yapının ne olduğunu ve neden gerekli olduğunu tam olarak anlayamıyorum.FloatBuffer neden float []?

Örneğin bu kodu (veya benzeri) Birçok birçok insanın kodu ve android dökümanında bakın: bildiğim kadarıyla söyleyebilirim sadece bir fantezi olduğunu

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 

Bu müthiş ayrıntılı ve bir şey için dağınık görünüyor bir dizi yüzen etrafında sarıcı.

Sorular:

  • toplanması veya yüzen basit dizinin başka türlü aksine sınıfın bu tip (ByteBuffer, FloatBuffer) gerekçesi nedir

    ?

  • Bir FloatBuffer'a dönüştürmeden önce bir ByteBuffer oluşturmanın ardındaki fikir nedir? ByteBuffers ve yerli kod ile ara-yüz, diğer NIO sınıfları (tipik olarak bir geçici verileri arabelleğe kopya ihtiyacını kaçınılarak) işlemleri ivme enable:

cevap

39

ana nedeni performansıdır.

Örneğin bir çok OpenGL oluşturma çağrısı yapıyorsanız bu çok önemlidir.

Öncelikle bir ByteBuffer oluşturmanın nedeni, hızlandırılmış işlemlerden yararlanan bir doğrudan bayt arabelleği oluşturmak için allocateDirect çağrısını kullanmaktır. Daha sonra aynı belleği paylaşan bir FloatBuffer oluşturun. FloatBuffer'ın kendisi için bir sebep olan bir DirectDirect yöntemi yoktur, bu yüzden ByteBuffer üzerinden gitmeniz gerekir.

10

Kodlamayı Android'de Java'da yapıyoruz, ancak OpenGL ES'nin temel uygulaması aslında C dilinde yazılıyor. Verilerimizi OpenGL'ye aktarmadan önce, bunu anlayacağı bir formata dönüştürmemiz gerekiyor. Java ve yerel sistem, baytlarını aynı sırada saklayamayabilir, bu yüzden özel bir dizi tampon sınıfı kullanırız ve verilerimizi tutacak kadar büyük bir ByteBuffer oluştururuz ve verilerini yerel bayt sırasını kullanarak saklamasını söyleriz. Daha sonra onu bir FloatBuffer'a dönüştürerek kayan nokta verilerini tutmak için kullanabiliriz. Son olarak, dizimizi arabelleğe kopyalarız.