2014-02-12 2 views
1

Я рисую около 5000 строк на представлении через холст onDraw(). Я панорамирую и масштабируюсь в представлении, поэтому onDraw получает много имен, чтобы нарисовать 5000 строк. Я измерил миллисекунды с SystemClock.uptimeMillis();, а onDraw разговаривает 35 миллисекунд для звонка evey, который должен только замедляться. В то время как масштабирование я действительно вижу, что он прыгает ...Проблема с производительностью onDraw занимает до

Я уже установил hardwareAcceleration в true, но это ничего не изменило. Я думаю, что цикл for может замедлить получение значений.

Вот код, который требуется, чтобы долго:

// Plot all lines on the view 
    for (int i = 0; i < count; i++) { 
     canvas.drawLine(line[i].getPktStart().getX(), 
       line[i].getPktStart().getY(), line[i] 
         .getPktEnd().getX(), line[i] 
         .getPktEnd().getY(), lineColor); 
    } 

Значение «счетчик» составляет около 5000. Объект линии просто класс, который держит Й и Y от начальной точки и конечной точки линия.

У вас есть предложения, чтобы заставить его работать быстрее? Это потому, что массив слишком велик? Я думал, что 5000 значений не должно быть проблемой ...

Заранее спасибо.

ответ

0

Вы пытались использовать объект Path? Также вы пытались использовать поплавки в своем объекте, чтобы избежать преобразования типов при его рисовании?

У меня нет опыта рисования САПР на андроиде, но когда я использовал такие программы на настольном компьютере или Android, я заметил, что пока вы что-то перетаскиваете, изображение остается неподвижным. Поэтому вам нужно изучить код, который сохранит ваш чертеж в кеш (растровое изображение) на тот момент, и не использовать линию рисования 5K раз для каждого вызова onDraw. Также я думаю, что вы уже знаете, что при увеличении/уменьшении некоторых слоев некоторые слои не должны быть видимыми, если они не представляют значимую информацию для этого слоя. Вы искали AutoCAD для Android? Как они это делают? Я думаю, вам следует искать оптимизацию чертежа ...

+0

Мне нужно нарисовать фактические строки или путь быстрее и быстрее? Я мог бы попытаться избавиться от каста – GeoGecco

+0

. Хорошо, я изменил свой объект линии, чтобы иметь точки с плавающей точкой, и это похоже на 1-2 миллисекунды. Все еще есть около 33 миллисекунд в onDraw, который просто замедляется .... – GeoGecco

+0

Возможно, вы что-то не так? Типичный экран от 800x480 до 1920x1080, зачем вам нужно рисовать линии 5K, которые не будут вписываться в экран или будут выглядеть нарушенными ... –

0

35 миллисекунд переводит до ~ 30 кадров в секунду.

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

Этот способ, как представляется, краска быстро, даже если это не на самом деле. Это намного лучше, чем все, что мигает, если вы рисуете прямо в окно.

Вот как я это сделать в C#:

Graphics grToDrawOn = null; 
    Bitmap bmToDrawOn = null; 
    private void MyWin_Paint(object sender, PaintEventArgs _e){ 
     int w = ClientRectangle.Width; 
     int h = ClientRectangle.Height; 
     Graphics gr = _e.Graphics; 
     // if the bitmap needs to be made, do so 
     if (bmToDrawOn == null) bmToDrawOn = new Bitmap(w, h, gr); 
     // if the bitmap needs to be changed in size, do so 
     if (bmToDrawOn.Width != w || bmToDrawOn.Height != h){ 
      bmToDrawOn = new Bitmap(w, h, gr); 
     } 
     // hook the bitmap into the graphics object 
     grToDrawOn = Graphics.FromImage(bmToDrawOn); 
     // clear the graphics object before drawing 
     grToDrawOn.Clear(Color.White); 
     // paint everything on grToDrawOn 
     DoPainting(); 
     // copy the bitmap onto the real screen 
     _e.Graphics.DrawImage(bmToDrawOn, new Point(0,0)); 
    } 
+0

Эй, Майк, я только начинаю с этого материала .. Не могли бы вы дать ссылку с примерами какого-нибудь маленького примерного кода? В настоящее время я преобразовываю все с помощью объекта Matrix и должен следить за переводами и масштабированием, чтобы сохранить оригинальные координаты после перевода. это будет проблема с растровым изображением? – GeoGecco

+0

@GeoGecco: Я не Джависта, но я просто показал, как я это делаю на C#. –

0

Ну я добавил одну строку кода, и теперь его, по крайней мере работает штраф за 5k очков.

вот что я добавил: this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

Thats IT! =)

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