Circles are currently drawn as texture, so every time you create
acircle with a different radius, the OpenGL pipeline generates a
newtexture. It should however not run out of memory since the
circlestextures are kept in a fixed size cache. You should
callsetLayerType(View.LAYER_TYPE_SOFTWARE, null) on your View to
workaround this problem.

Update: I checked and this out of memory error is a bug in 3.2 that we
fixed in 4.0.
On Thu, Dec 15, 2011 at 4:31 PM, Christopher Van Kirk
<[email protected]> wrote:
> How many times is 'a few'?
>
> On 12/15/2011 12:45 AM, Christopher Golden wrote:
>>
>> In the course of developing an Android application, I'm finding a need
>> to draw several unfilled concentric circles centered on an arbitrary
>> point, enough that some of them are only partly visible on the
>> display. However, this does not appear to work with hardware
>> acceleration. My test rig is a stock Samsung Galaxy Tab 10.1 running
>> Android 3.2.
>>
>> The following code comes from a test subclass of View I wrote to
>> isolate the issue:
>>
>> private Paint paint = new Paint();
>>
>> private int count = 0;
>>
>> private static final int[] COLORS = { 0xffff0000, 0xff00ff00,
>> 0xff0000ff, 0xffff00ff };
>>
>> public TestCircles(Context context) {
>>     super(context);
>>     paint.setStrokeWidth(1.0f);
>>     paint.setStyle(Paint.Style.STROKE);
>> }
>>
>> public TestCircles(Context context, AttributeSet attributes) {
>>     super(context, attributes);
>>     paint.setStrokeWidth(1.0f);
>>     paint.setStyle(Paint.Style.STROKE);
>> }
>>
>> public boolean onTouchEvent(MotionEvent e) {
>>     if (e.getAction() == MotionEvent.ACTION_DOWN)
>>         invalidate();
>>     return true;
>> }
>>
>> protected void onDraw(Canvas canvas) {
>>
>>     // Pick the color to use, cycling through the colors list
>> repeatedly, so that we can
>>     // see the different redraws.
>>     paint.setColor(COLORS[count++]);
>>     count %= COLORS.length;
>>
>>     // Set up the parameters for the circles; they will be centered at
>> the center of the
>>     // canvas and have a maximum radius equal to the distance between
>> a canvas corner
>>     // point and its center.
>>     final float x = canvas.getWidth() / 2f;
>>     final float y = canvas.getHeight() / 2f;
>>     final float maxRadius = (float) Math.sqrt((x * x) + (y * y));
>>
>>     // Paint the rings until the rings are too large to see.
>>     for (float radius = 20; radius<  maxRadius;
>>             radius += 20)
>>         canvas.drawCircle(x, y, radius, paint);
>> }
>>
>> I am running TestCircles as the only View in an Activity, laying it
>> out to fill the available width and height (i.e. it is nearly full-
>> screen). I can tap on the display (triggering redraws) only a few
>> times before the redraws no longer occur (i.e. the circles' color
>> doesn't change). Actually, the onDraw() code is still running in
>> response to each tap -- as proven with diagnostic messages -- but
>> nothing changes onscreen.
>>
>> When onDraw() first starts to fail to redraw, the debug log includes
>> the following entry, once for every call to onDraw():
>>
>>     E/OpenGLRenderer(21867): OpenGLRenderer is out of memory!
>>
>> If I turn off hardware acceleration in the manifest, these problems go
>> away -- not surprising since clearly OpenGL is having problems -- and
>> actually it is a good deal faster than the few times it actually works
>> under hardware acceleration.
>>
>> My questions are:
>>
>> First, am I misusing Canvas, or is this a bug, or both? Is Android
>> allocating large bitmaps under the hood to draw these circles? It
>> doesn't seem like this should be this challenging to OpenGL, but I'm
>> new to hardware accelerated app development.
>>
>> Second, what's a good alternative way to draw large unfilled circles
>> that have portions extending out of the clipping region of the Canvas?
>> Losing hardware acceleration is not an option.
>>
>> Thanks in advance...
>>
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en



-- 
Romain Guy
Android framework engineer
[email protected]

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to