Как люди указали, если CalculateMyPixel() стоит дорого, то, что называется 150 000 (HVGA) или 384,00 раз (WVGA), просто убьет вас.
Кроме того, пытаясь нарисовать ваш пользовательский интерфейс как отдельные пиксели через canvas.drawPoint(), каждый раз, когда есть обновление, это всего лишь наименее эффективный способ сделать это.
Если вы рисуете отдельные пиксели, вы почти наверняка хотите иметь какой-то экранный растровый рисунок, содержащий пиксели, которые вы рисуете с помощью простого Canvas.drawBitmap().
Тогда вы можете выбрать лучший способ управлять этим растровым изображением. Простейшим является просто создать объект Bitmap нужного размера и использовать там API-интерфейсы для его заполнения.
В качестве альтернативы существует версия drawBitmap(), которая берет массив целых чисел, поэтому вы можете заполнить его в непосредственно с любыми значениями, которые вы хотите, избегая вызова метода для каждого пикселя.
Теперь вы можете перенести вычисление пикселей из метода onDraw(), который должен быть быстрым, чтобы иметь гибкий пользовательский интерфейс и заполнить ваши пиксели в другом месте. Возможно, вы вычислите их один раз во время инициализации. Возможно, вы их вычисляете и выполняете выборочные обновления только тех частей, которые были изменены до вызова invalidate() (например, пиксели из (0,0) - (10, 10) изменились, поэтому возьмите текущее растровое изображение и просто измените эту область). Если вычислительные пиксели на самом деле просто слишком медленны, вы, вероятно, захотите создать отдельный поток для выполнения этой работы (обновление растрового изображения с новыми пикселями, затем postInvalidate() в пользовательском интерфейсе, чтобы получить их рисование).
Кроме того, теперь, когда у вас есть пиксели в растровом изображении, вы можете делать трюки, например, уменьшать размер растрового изображения и масштабировать его при рисовании на экране, что позволяет значительно сократить время обновления этих пикселей, сохраняя при этом весь пользовательский интерфейс (хотя и с меньшим разрешением).
Что делает CalculateMyPoint так долго работать? – Adam
У меня есть разумно вовлеченный расчет, чтобы рассчитать цвет, который будет использоваться для любого заданного пикселя. Мне просто интересно, лучше ли вычислять цвет для каждого пикселя else, а не в событии onDraw в представлении. – Mattl
Нужно ли рисовать каждый пиксель отдельно? Поскольку это более 400 тыс. Пикселей на Droid или nexus, и я чувствую, что есть больше возможностей для оптимизации количества вызовов CalculateMyPoint, чем во время выполнения. – jqpubliq