Холст манипуляции против элементов

Я разрабатываю небольшую библиотеку в качестве основы для некоторых приложений. Когда я собираюсь создать сценограф (2D), мне интересно, какой из следующих подходов выглядит более перспективным с точки зрения производительности, удобства обслуживания, простоты использования и т. Д.

  1. Я мог бы дать каждому рисуемому элементу матрицу, где я выполняю перевод, вращение и многое другое.
  2. Я мог бы сделать все на холсте вместо элементов.

Первое решение имеет недостатки: для примитивных элементов, таких как круги, где я не могу передать матрицу в вызове отрисовки, я должен получить доступ к переведенным значениям из матрицы следующим образом:

private float get(int index) {
    final float[] values = new float[9];
    getValues(values);
    return values[index];
}

public float getX() {
    return get(Matrix.MTRANS_X);
}

public float getY() {
    return get(Matrix.MTRANS_Y);
}

Поэтому при каждом вызове отрисовки я создаю массив float для каждого вызова геттера (один для getX(), один для getY()). Предполагая, что у меня много элементов на экране, это может привести к снижению памяти и производительности.

Второй подход имеет недостаток "негативного" мышления. Если я хочу, чтобы элемент был нарисован в точке 100/100, я должен перевести холст на -100/-100, как я бы нарисовал на 0/0. Если я восстановлю холст после этого, результатом будет элемент, нарисованный на требуемом 100/100. Я не уверен, приведет ли это негативное мышление к серьезному влиянию на удобство сопровождения кода и ухудшению понимания (никогда даже не задумывался о появлении ошибок, просто забывая что-то отрицать...).

У кого-нибудь есть совет, какой путь предпочтительнее?

2 ответа

Решение

Кажется, что действительно оба решения должны быть объединены.

Мое предположение о втором подходе совершенно неверно. Если я переведу элемент на 100/100, точка отправления изменится на 100/100. То же самое относится, конечно, к холсту. Негативное мышление было полной ерундой для меня.

Объединенный результат будет следующим:

  1. Каждый элемент, который будет нарисован, имеет свою собственную Матрицу, которая содержит вращение, перемещение и масштаб.
  2. Холст будет сохранен через save()с предоставленным методом concat(Matrix matrix) матрица элемента может быть применена. Рисунок будет сделан, и холст будет восстановлен с restore(),
  3. Каждый нарисованный Элемент, который является родителем других рисуемых элементов, будет зацикливаться на дочерних элементах и ​​сохранять, объединять и восстанавливать таким же образом.

Это позволяет реализовать двумерный граф сцены без какой-либо большой работы по реализации.

По соображениям производительности, использование метода внутренних матриц, вероятно, быстрее, поскольку он позволяет аппаратно ускорять библиотеки, если вы этим занимаетесь. Опять же, я не совсем уверен, будет ли аппаратное ускорение.

# 2 это забавный способ. Это определенно даст вам больше мощности и гибкости в долгосрочной перспективе. Кроме того, вы могли бы объединить оба.

Также есть #3: когда вы говорите drawable element и используете Android Drawables, вы можете создать собственный класс Drawable.

Я не думаю, что есть идеальный способ сделать это

Другие вопросы по тегам