Двойная буферизация в Java на Android с холстом и представлением поверхности

Как это сделать? Может ли кто-нибудь дать мне схему?

Из того, что я нашел в Интернете, похоже, что в моей функции run():

  1. создать растровое изображение
  2. создать холст и прикрепить его к растровому изображению
  3. замокКанвас()
  4. вызовите draw(canvas) и отрисуйте растровое изображение в задний буфер (как??)
  5. разблокироватьCanvasAndPost()

Это правильно? Если да, могу ли я получить небольшое объяснение; что означают эти шаги и как их реализовать? Я никогда раньше не программировал для Android, так что я настоящий нуб. И если это не правильно, как мне это сделать?


person Kalina    schedule 30.06.2011    source источник


Ответы (2)


Это уже двойная буферизация, это то, что делает вызов unlockCanvasAndPost(). Нет необходимости создавать растровое изображение.

person Romain Guy    schedule 30.06.2011
comment
Я не совсем понимаю. Итак, я просто рисую все, что мне нужно между блокировкой и разблокировкой, и... двойная буферизация происходит сама по себе? Разве мне не нужно также рисовать ДО того, как я заблокирую? Извините, мне нужно объяснить это самым простым способом... - person Kalina; 30.06.2011
comment
@TheBeatlemaniac: Когда вы рисуете Canvas после вызова lockCanvas(), вы на самом деле рисуете материал в следующем кадре, пока отображается текущий кадр. Вызов unlockCanvasAndPost() переключит буфер следующего кадра на текущий буфер кадра, чтобы отобразить обновленный Canvas. - person Wroclai; 30.06.2011
comment
Растровая часть пригодится, если вы хотите иметь возможность увеличивать/уменьшать масштаб и перемещать рабочее пространство. - person TheRealChx101; 08.01.2016

В инструкциях Android Developers Group сказано, что вам нужен буфер- холст, на который наносятся все рендеры.

Bitmap buffCanvasBitmap;
Canvas buffCanvas;

// Creating bitmap with attaching it to the buffer-canvas, it means that all the changes // done with the canvas are captured into the attached bitmap
tempCanvasBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
tempCanvas = new Canvas();
tempCanvas.setBitmap(tempCanvasBitmap);

// and then you lock main canvas
canvas = getHolder().lockCanvas();              
// draw everything you need into the buffer
tempCanvas.drawRect.... // and etc
// then you draw the attached bitmap into the main canvas
canvas.drawBitmap(tempCanvasBitmap, 0, 0, drawView.getPaint());
// then unlocking canvas to let it be drawn with main mechanisms
getHolder().unlockCanvasAndPost(canvas);

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

person Rustem Galiullin    schedule 04.03.2013
comment
Я думаю, что имена переменных здесь совершенно неуместны? - person netpoetica; 03.10.2019