Холст манипуляции против элементов
Я разрабатываю небольшую библиотеку в качестве основы для некоторых приложений. Когда я собираюсь создать сценограф (2D), мне интересно, какой из следующих подходов выглядит более перспективным с точки зрения производительности, удобства обслуживания, простоты использования и т. Д.
- Я мог бы дать каждому рисуемому элементу матрицу, где я выполняю перевод, вращение и многое другое.
- Я мог бы сделать все на холсте вместо элементов.
Первое решение имеет недостатки: для примитивных элементов, таких как круги, где я не могу передать матрицу в вызове отрисовки, я должен получить доступ к переведенным значениям из матрицы следующим образом:
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. То же самое относится, конечно, к холсту. Негативное мышление было полной ерундой для меня.
Объединенный результат будет следующим:
- Каждый элемент, который будет нарисован, имеет свою собственную Матрицу, которая содержит вращение, перемещение и масштаб.
- Холст будет сохранен через
save()
с предоставленным методомconcat(Matrix matrix)
матрица элемента может быть применена. Рисунок будет сделан, и холст будет восстановлен сrestore()
, - Каждый нарисованный Элемент, который является родителем других рисуемых элементов, будет зацикливаться на дочерних элементах и сохранять, объединять и восстанавливать таким же образом.
Это позволяет реализовать двумерный граф сцены без какой-либо большой работы по реализации.
По соображениям производительности, использование метода внутренних матриц, вероятно, быстрее, поскольку он позволяет аппаратно ускорять библиотеки, если вы этим занимаетесь. Опять же, я не совсем уверен, будет ли аппаратное ускорение.
# 2 это забавный способ. Это определенно даст вам больше мощности и гибкости в долгосрочной перспективе. Кроме того, вы могли бы объединить оба.
Также есть #3: когда вы говорите drawable element и используете Android Drawables, вы можете создать собственный класс Drawable.
Я не думаю, что есть идеальный способ сделать это