Drat.
I was able to get this to work, but now it just always runs out of memory!
I guess this method is less memory-efficient? Here's the code being
executed:
for(int i = 0; i < total_animation_length; i++)
>
> imageResources[i] =
>> Drawable.createFromResourceStream(context.getResources(), new TypedValue(),
>> context.getAssets().open("flame_high/" + String.format(file_name, i)),
>> "test");
>
>
On Wednesday, July 18, 2012 6:09:46 PM UTC-4, Fran wrote:
>
> Use they Assets folder instead. Take a look on AssetManager docs.
> El 17/07/2012 22:00, "Matt Schoen" <[email protected]> escribió:
>
>> Unfortunately I've already done your last suggestion. The images are
>> pretty small already. I'm still not convinced that the streaming would
>> work. For one thing, the flicker loops, and for another, the range of
>> frames changes quite often. For example:
>>
>> If the phone starts upright, we play images 90, 91, 92, 93, 94, 95, 90,
>> 91...
>>
>> Then, if you til it, it'll be like 90, 91, 92, 80, 81, 82, 60, 61, 62,
>> 40, 41, 120, 121, 140, 141...
>> ^ ^
>> ^ ^ ^
>>
>> The carats signify where the accelerometer value has changed so that the
>> "first" frame is different. This happens quite frequently (to make for a
>> smooth "bend") and is completely unpredictable. As far as I can tell, we'd
>> always get a hiccup when the accelerometer value changed.
>>
>> I'm really hoping that I can do what I was originally asking for. It
>> seems so simple to just force the loading of a different set of drawables.
>>
>> If I wanted to load the images some other way (not through the drawables
>> folder) how could I do that?
>>
>> On Tuesday, July 17, 2012 12:48:48 PM UTC-4, Nobu Games wrote:
>>>
>>> You still could go with the "streaming" idea. At any given time you
>>> would have a fixed size amount of frames in memory (let's say 15 bitmaps,
>>> just as an example). As the animation progresses you need to load the next
>>> batch and discard older ones. In order to prevent loading hickups you could
>>> proceed as follows:
>>>
>>> - Your "window" of animation bitmaps has 15 items.
>>> - As the animation counter reaches item #6 you would recycle the
>>> last 5 ones and load the next 5 ones that come after item #15
>>> - Loading needs to be done in a background thread (AsyncTask)
>>>
>>> Of course you'd need to add special logic for your case, like allowing
>>> to loop a certain amount of animation frames and starting playback from any
>>> point of the sequence and so on. But this could be done with a fixed size
>>> window of frames.
>>> I think that's the only sane way to do that based on that huge bitmap
>>> sequence and you could even adjust the window size according to the
>>> available memory. Play around with these numbers in order to get the best
>>> result for your animation.
>>>
>>> By the way, I would just animate the flame itself and use a single,
>>> static bitmap for the lighter. That way you could use a low-resolution
>>> bitmap sequence of the flame and scale it up on devices with less memory.
>>> Lights and shadows could be faked in real time, too, by drawing overlays on
>>> the view's canvas.
>>>
>>> Maybe you can get away with that solution and don't need to implement a
>>> streaming technique.
>>>
>>>
>>> On Tuesday, July 17, 2012 9:28:59 AM UTC-5, Matt Schoen wrote:
>>>>
>>>> Hey, thanks for the reply.
>>>>
>>>> I guess I should have explained more clearly. This is a "lighter" type
>>>> animation, which responds to accelerometer input. The flame flickers
>>>> (plays from a start frame on a short loop) and when you tilt the phone,
>>>> the
>>>> start frame is "swept" through an animation of the flame bending from one
>>>> side to another.
>>>>
>>>> Because of this, I'm not sure I could really "stream" anything since I
>>>> might need any one frame of the animation at any point. It just occurred
>>>> to me that maybe I could store only half the frames and flip them in
>>>> software (currently the "flip" is just rendered into the animation).
>>>>
>>>> This is why I'm just using a big image sequence (about 150 frames) as
>>>> drawables. Any advice?
>>>>
>>>> On Saturday, July 14, 2012 12:26:13 PM UTC-4, Nobu Games wrote:
>>>>>
>>>>> How many items are in your animation list? If it is really, really
>>>>> huge I'd add some "streaming" logic to your animation player, so older
>>>>> frames get recycled while future frames are loaded in the background.
>>>>> That
>>>>> way you have absolute control over a moving window of frames and you
>>>>> could
>>>>> size that window according to the available amount of free memory. You
>>>>> wouldn't risk OOM crashes on any device with that technique.
>>>>>
>>>>> Alternatively you could create a video based on your frames and play
>>>>> that one back instead.
>>>>>
>>>>>
>>>>> On Friday, July 13, 2012 10:54:46 PM UTC-5, Matt Schoen wrote:
>>>>>>
>>>>>> Hey there,
>>>>>>
>>>>>> I've tried to find info on this, but it seems like a pretty esoteric
>>>>>> case. I'll admit that I'm probably completely off-base to start, but
>>>>>> the
>>>>>> app is 99% done, so I'd rather not change my implementation from it's
>>>>>> current state. I have an animation that I'm using a big list of
>>>>>> drawables
>>>>>> to display, and while it works fine on phones with enough RAM, I get "VM
>>>>>> out of memory" crashes on devices with basically 512 MB RAM and below.
>>>>>>
>>>>>> I've found the getMemoryClass() function, which seems to report "32"
>>>>>> for a device with 512MB. I tried overriding the density value, which
>>>>>> successfully avoided the crash, but also resized my whole view! All I
>>>>>> want
>>>>>> is to be able to programmatically tell the view framework to default to
>>>>>> the
>>>>>> low-res images. Is this possible?
>>>>>>
>>>>>
>> On Tuesday, July 17, 2012 12:48:48 PM UTC-4, Nobu Games wrote:
>>>
>>> You still could go with the "streaming" idea. At any given time you
>>> would have a fixed size amount of frames in memory (let's say 15 bitmaps,
>>> just as an example). As the animation progresses you need to load the next
>>> batch and discard older ones. In order to prevent loading hickups you could
>>> proceed as follows:
>>>
>>> - Your "window" of animation bitmaps has 15 items.
>>> - As the animation counter reaches item #6 you would recycle the
>>> last 5 ones and load the next 5 ones that come after item #15
>>> - Loading needs to be done in a background thread (AsyncTask)
>>>
>>> Of course you'd need to add special logic for your case, like allowing
>>> to loop a certain amount of animation frames and starting playback from any
>>> point of the sequence and so on. But this could be done with a fixed size
>>> window of frames.
>>> I think that's the only sane way to do that based on that huge bitmap
>>> sequence and you could even adjust the window size according to the
>>> available memory. Play around with these numbers in order to get the best
>>> result for your animation.
>>>
>>> By the way, I would just animate the flame itself and use a single,
>>> static bitmap for the lighter. That way you could use a low-resolution
>>> bitmap sequence of the flame and scale it up on devices with less memory.
>>> Lights and shadows could be faked in real time, too, by drawing overlays on
>>> the view's canvas.
>>>
>>> Maybe you can get away with that solution and don't need to implement a
>>> streaming technique.
>>>
>>>
>>> On Tuesday, July 17, 2012 9:28:59 AM UTC-5, Matt Schoen wrote:
>>>>
>>>> Hey, thanks for the reply.
>>>>
>>>> I guess I should have explained more clearly. This is a "lighter" type
>>>> animation, which responds to accelerometer input. The flame flickers
>>>> (plays from a start frame on a short loop) and when you tilt the phone,
>>>> the
>>>> start frame is "swept" through an animation of the flame bending from one
>>>> side to another.
>>>>
>>>> Because of this, I'm not sure I could really "stream" anything since I
>>>> might need any one frame of the animation at any point. It just occurred
>>>> to me that maybe I could store only half the frames and flip them in
>>>> software (currently the "flip" is just rendered into the animation).
>>>>
>>>> This is why I'm just using a big image sequence (about 150 frames) as
>>>> drawables. Any advice?
>>>>
>>>> On Saturday, July 14, 2012 12:26:13 PM UTC-4, Nobu Games wrote:
>>>>>
>>>>> How many items are in your animation list? If it is really, really
>>>>> huge I'd add some "streaming" logic to your animation player, so older
>>>>> frames get recycled while future frames are loaded in the background.
>>>>> That
>>>>> way you have absolute control over a moving window of frames and you
>>>>> could
>>>>> size that window according to the available amount of free memory. You
>>>>> wouldn't risk OOM crashes on any device with that technique.
>>>>>
>>>>> Alternatively you could create a video based on your frames and play
>>>>> that one back instead.
>>>>>
>>>>>
>>>>> On Friday, July 13, 2012 10:54:46 PM UTC-5, Matt Schoen wrote:
>>>>>>
>>>>>> Hey there,
>>>>>>
>>>>>> I've tried to find info on this, but it seems like a pretty esoteric
>>>>>> case. I'll admit that I'm probably completely off-base to start, but
>>>>>> the
>>>>>> app is 99% done, so I'd rather not change my implementation from it's
>>>>>> current state. I have an animation that I'm using a big list of
>>>>>> drawables
>>>>>> to display, and while it works fine on phones with enough RAM, I get "VM
>>>>>> out of memory" crashes on devices with basically 512 MB RAM and below.
>>>>>>
>>>>>> I've found the getMemoryClass() function, which seems to report "32"
>>>>>> for a device with 512MB. I tried overriding the density value, which
>>>>>> successfully avoided the crash, but also resized my whole view! All I
>>>>>> want
>>>>>> is to be able to programmatically tell the view framework to default to
>>>>>> the
>>>>>> low-res images. Is this possible?
>>>>>>
>>>>> --
>> 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
>
>
--
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