2013-07-26 4 views
3

Я создал пользовательский объект View, который переопределяет метод onDraw для рисования довольно активного пользовательского интерфейса. Я добавляю 5 этих пользовательских представлений на LinearLayout, , но только один вид виден в любой момент.Проблемы с производительностью при хранении нескольких растровых изображений

В зависимости от действий пользователей внутри моего приложения, я переключаю свойство View.Visibility на каждом, чтобы можно было видеть только один.

Просто для уточнения, метод, который я использую для меня, работает, и он кажется довольно отзывчивым. Меня немного волнует, как этот метод повлияет на устройства нижнего или нижнего уровня.

Вот пример моего текущего кода:

настраиваемое представление

public class MyDrawingView extends View { 
    private Bitmap mViewBitmap; 

    private int mWidth = 1024; // The width of the device screen 
    private int mHeight = 600; // Example value, this is dynamic 

    @Override 
    protected void onDraw(Canvas canvas) { 
    // Copy the in-memory bitmap to the canvas. 
    if(mViewBitmap != null) canvas.drawBitmap(mViewBitmap, 0, 0, mCanvasPaint); 
    } 

    private void drawMe() { 
    if(mViewBitmap == null) mViewBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888); 
    Canvas c = new Canvas(mViewBitmap); 
    c.drawBitmap(...); 
    c.drawText(...); 
    // Multiple different methods here drawing onto the canvas 
    c.save(); 
    } 
} 

Layout XML

<LinearLayout> 
    <com.company.project.ui.MyDrawingView 
      android:id="@+id/myCustomView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    <com.company.project.ui.MyDrawingView 
      android:id="@+id/myCustomView2" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    <com.company.project.ui.MyDrawingView 
      android:id="@+id/myCustomView3" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    <com.company.project.ui.MyDrawingView 
      android:id="@+id/myCustomView4" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
    <com.company.project.ui.MyDrawingView 
      android:id="@+id/myCustomView5" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
</LinearLayout> 

Вопросы

  1. Должен ли я хранить эти 5 отдельных экземпляров моего представления с растровыми изображениями размером 1024x600 в памяти все время?
  2. Должен ли я объединить функциональность, так что мне нужно добавить только один вид в мой макет XML, а затем повторно сгенерировать растровое изображение каждый раз, когда View необходимо обновить?
  3. Какой вариант лучше для производительности, учитывая, что перерисовка моего растрового изображения может занять некоторое время из-за его сложности?

Документация

Я уже прочитал Android документации на Managing Bitmap Memory, но я чувствую, что я реализовывали моменты, изложенные уже в моей настраиваемое представление, и я не думаю, что это вполне покрывает мой сценарий.

+0

Ваша самая большая проблема с недорогими устройствами будет размером с кучей. Ваши растровые изображения занимают память 1024 × 600 * 4 * 5 = 12 МБ (ARGB_8888). В устройствах с кучей 16 МБ это довольно большой кусок. Это предполагает, что изображения также имеют разрешение 1024x600. Если ваши значения являются динамическими, они могут вообще не вписываться в кучу. – Geobits

+0

@Geobits То, что меня беспокоило. Итак, как избежать этого, сохраняя при этом производительность гладкой? – CodingIntrigue

ответ

0

ОК, так что я взял на борт комментарии Geobits' на размер кучи и придумал решение проблемы:

  1. Go с одним видом, который динамически будет нарисовать данные на одном внутреннейBitmap в соответствии с требованиями
  2. изменить тип растрового изображения RGB_565 для того, чтобы растровое изображение немного меньше
  3. Удаление/рециркулировать растрового изображения, где это возможно

После этого мне удалось сократить требуемую оперативную память до 25 Мб для всего приложения, которое я более чем доволен.

0

Я не уверен, почему вы помещаете LinearLayout с видами внутри, которые имеют размер устройства, а затем скрываются соответственно. Вам будет лучше использовать ViewFlipper или даже лучше ViewPager.

Лучшим из них будет ViewPager, с тех пор вы можете освободить растровые изображения из памяти, если они не видны.

Кроме того, если вы загружаете изображение из Интернета или SD-карты, вы можете использовать Universal Image Loader, что упрощает кеширование и управление памятью для вас.нет необходимости изобретать колесо :)

+0

Обертка 'LinearLayout' является лишь примером. На самом деле, компоновка XML намного сложнее, однако это только часть раздела View, о котором я беспокоюсь, и в основном о влиянии сохранения таких больших растровых изображений в памяти. Какая польза от «ViewFlipper» или «ViewPager» предоставит мой текущий метод, учитывая, что я не требую никакой анимации или взаимодействия с пользователем - все это уже обработано в моем представлении. – CodingIntrigue

+0

Если я правильно понял ваш вопрос, ViewPager имеет преимущество настройки ограниченный размер страницы. http://developer.android.com/reference/android/support/v4/view/ViewPager.html#setOffscreenPageLimit(int) –

+0

'ViewFlipper' будет обрабатывать все видимость, делая ваш код более читаемым. «ViewPager», как уже упоминалось, предоставит вам более простой способ перекодировать представления. Но я думаю, что самым важным из них будет UIL, поскольку он сделает загрузку изображений очень простой и безопасной задачей, поскольку это довольно хорошо протестированная библиотека. «Стоя на плече гигантов»;) – pablisco

Смежные вопросы