Thank you Jack for your explanation.

I am using VBOs now, so I can easily switch to direct buffers. By the
way, what is the limit for VBO buffers? (if there is one)

And one more thing. In my code I am drawing a 1008-vertex geometry
using glDrawArrays(GL_TRIANGLES). Weird thing is that it draws model +
garbage when I pass 1008 as 'count' argument to glDrawArrays, and
draws correctly when I pass 1008/3. I believe 1008 is the correct
value to pass, but it just not working that way. In many demos there
are calls to glDrawArrays with GL_TRIANGLES, but they only draws few
vertices (36 for example). I suspect my 1008 vertices (and normals) do
not fit in some sort of cache, and code draws them differently, and
somewhere it multiplies 'count' by 3 (hence drawing garbage when 1008
is passed). This behaviour shows up on the emulator and the G1.
(glDrawElements has the same behaviour when indices are simple array
[0,count-1].)


Dmitry

On 6 авг, 02:14, Jack Palevich <jack.palev...@gmail.com> wrote:
> Hi -- I work on the Java Open GL ES bindings for Android. Fadden asked
> me to chime in here.
>
> Please don't use indirect buffers with OpenGL ES -- indirect buffers
> are not supported, and your code will break, both on current and
> especially on future versions of Android.
>
> Let me see if I can explain what's going on:
>
> (In my message below I'm going to use the code-name "Cupcake" for the
> current Android release and the code-name "Donut" for the upcoming
> release.)
>
> There are several bugs in the way Android currently handles
> java.nio.Buffer objects passed to OpenGL ES APIs:
>
> 1) In all releases up to and including Cupcake, the implementation
> allocates "PlatformAddress" objects every time a direct buffer's base
> address is calculated. (In other words, when any glXXXPointer function
> is called.) This leads to garbage collections, even in programs that
> don't appear at the API level to be allocating any new objects. (You
> can use a heap analysis tools to watch these PlatformAddress objects
> being created.)
>
> 2) The OpenGL ES APIs that take buffers are only supposed to take
> direct buffers, but this runtime check was accidentally omitted from
> all releases up to and including Cupcake. The problem with non-direct
> buffers is that their data can be moved by the Java runtime while the
> OpenGL driver is holding a pointer to them, which means that OpenGL
> driver ends up reading the wrong data, or even trying to read no-
> longer-allocated memory.
>
> To fix problem #2, the Donut system software release will start
> enforcing the direct buffer requirement. To keep existing, mostly-
> working OpenGL applications from breaking, we are going to add a
> "compatibility shim" in Donut: If your application is compiled against
> the Cupcake or earlier SDK, then we won't throw an exception if you
> use a non-direct buffer with OpenGL ES. You app will still suffer from
> the same "occasionally crashes or renders incorrectly" bug that it
> currently suffers from under Cupcake, but things won't be any worse.
> We will print out an error message to the log so at least you have a
> way of detecting that your app is using OpenGL incorrectly.
>
> If your application is compiled with the Donut SDK, it will throw a
> runtime exception if you try to use a non-direct buffer with an OpenGL
> ES API. (The reasoning is that if you are compiling using the Donut
> SDK, then you can take the time to fix your app.)
>
> OK, so what's a poor developer to do now, before the Donut system
> software?
>
> You could try using indirect buffers, in which case you will get code
> that doesn't GC very much, but also occasionally renders incorrectly
> or crashes. Or you can use direct buffers, and live with more GCs.
>
> I recommend using direct buffers, because I think it's better to have
> occasional GC hiccups than crashes. And once Donut is released the GC
> disadvantage should be fixed.
>
> On Aug 5, 11:01 am, fadden <fad...@android.com> wrote:
>
> > On Aug 4, 11:09 pm, "Dmitry.Skiba" <dmitry.sk...@gmail.com> wrote:
>
> > > I've found a way to get rid of garbage collection!
> > > The receipt is simple (and ironic): do not use allocateDirect(), use
> > > allocate(). And use only ByteBuffer, not FloatBuffer, IntBuffer, etc.
> > > - using asFloatBuffer() on non-direct ByteBuffer will result in crash
> > > in libhgl. (I'm too lazy to create an issue for that.)
>
> > I'm pretty sure this will break in the next release.  My (very
> > limited) understanding is that direct buffers are supposed to be
> > required, but Android wasn't enforcing their use.  This situation has
> > been corrected.
>
> > The allocations reduced by 8767 (earlier in the thread) were Harmony
> > PlatformAddress objects, which are only associated with direct
> > buffers.  So it makes sense that your change would cut the
> > allocations; just be aware that it may stop working.
>
> > (I'll ask one of the GL folks to check me on this.)
>
>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to android-developers@googlegroups.com
To unsubscribe from this group, send email to
android-developers-unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to