Двойно буфериране - J2Me платформа
Терминът двойно буфериране се отнася до техниката за буфериране на графичен контекст, преди да бъде показан. Този идиом изисква да използвате два графични контекста - или буфери - оттук и името му.
Първо рисувате графики във вторичен графичен контекст и след това копирате съдържанието му в графичния контекст, представен от дисплея на устройството. Този вторичен графичен контекст се нарича буфер извън екрана. Буферът извън екрана не се показва на дисплея.
Смисълът на тази технология е ограничената производителност. Операциите по рисуване могат да доведат до бързи актуализации на дисплея, което кара потребителя да усеща трептене. За да избегнете трептене, първо трябва да изпълните своя чертеж в графична среда извън екрана и след това да копирате целия графичен контекст извън екрана в оригиналната графика на устройството. Операцията по копиране обикновено е по-бърза от многото операции по рисуване, изисквани дори от относително сложни платна, така че ще бъде извършена с малко или никакво забележимо трептене.
Листинг 6.9 демонстрира използването на двойно буфериране. Кодът изпълнява няколко прости функции за рисуване върху буфер извън екрана, след което копира съдържанието на този буфер в самата графична среда, която представлява дисплея на устройството. Въпреки че процедурите за рисуване в този пример са сравнително прости, истинско приложение може да направи много по-сложно чертане, което наистина доказва необходимостта от двойно буфериране.
Списък 6.9. Двойното буфериране използва два графични контекста. Единственият начин да получите втори графичен контекст в MUR е чрез класа Image
Демонстрира двойно буфериране на графичен контекст за показване в Canvas.
обществен класDoubleBufferDerao разширява Canvas
// Константа, която представлява бяло.
private static final int WHITE = OxFF "16 I OxFF "8 OxFF;
частна статична команда назад = нова команда ("Назад", Command.BACK, 1);
GraphicsDemo gDemo = GraphicsDemo.getlnstance();
частен дисплей дисплей = Display.getDisplay(gDemo);
// Изображение обект, използван за получаване
// Графичен обект извън екрана, частен Iraage извън екрана;
// Променлива, използвана за определяне дали
// дали прилагането на автоматично двойно буфериране.
// Съхранява true, ако внедряването автоматично
// изпълнява двойно буфериране, в противен случай става
невярно. private boolean autoDoubleBuffered = true;
addCoramand(назад); setCommandListener(това); display.setCurrent(this);
// Ако изпълнението не използва двойно буфериране
// автоматично, извличане на изображението, за да можем
// вземете графика извън екрана от него. Това изображение е променливо!
// Неговите размери са височината и ширината на даденото платно.
защитен празен paintdipRect(Графика g)
int clipX = g.getClipX();
ir.t clipY = g.getClipY();
int clipH = g.getClipHeight();
int clipW = g.getClipWidth();
int цвят = g.getColor();
ж. setcolor(WHITE);
ж. fillRect(clipX, clipY, clipW, clipH);
public void paint (Graphics g)
Оригинална графикаG = нула;
// Запазете оригиналния графичен контекст и вземете
// нова графика извън екрана от помощната програма за изображения.
// Изчистване на изрязващия правоъгълник с нов обект
// графики. Така че използваме двойно буфериране
// Започистване на платното, като по този начин се избягва трептенето.
// Изчистването на платното е рисуване като всичко останало
// операции по чертане. paintdipRect(g);
// Изчистете платно с оригинална графика, защото
// изпълнението не удвоява буфера автоматично.
за (int x = 0, y = 0; (x
ж. drawRect(x, y, (ширина - x) - x, (височина - y) - y);
// Когато рисувате изображение, съдържанието извън екрана
// графичният контекст на изображението всъщност се копира
// към графичния контекст на устройството. ако (!autoDoubleBuffered)
originalG.drawlmage(извън екрана, 0, 0,
public void commandAction(Command c, Displayable d)
Конструкторът съдържа първия код, свързан с двойното буфериране. Следният оператор, взет от конструктора DoubleBufferDemo без аргументи, определя дали изпълнението поддържа автоматично двойно буфериране.
извън екрана = Image.createlmage(getWidth(), getHeight());
Ако изпълнението не поддържа двойно буфериране, приложението не трябва да го прави. Методът Canvas.IsDoubleBuffered() ви казва дали имплементацията прави двойно буфериране имплицитно. Обърнете внимание на конструкцията на обекта Image. Това извикване на Image, create Image() създава променлив обект Image. Приложението се нуждае от променливо изображение, защото рисува в графичния контекст на обекта Image, който е буферът извън екрана, от който се нуждаете. Това е единственият начин да получите допълнителна графика в MIDP.
Методът paint() съдържа останалата част от кода за двойно буфериране. Ако не се извърши автоматично двойно буфериране, приложението трябва да го направи. Това изисква втори графичен контекст. Следващият фрагмент от метода paint() демонстрира този идиом
public void paint (Graphics g)
Временната променлива съдържа препратка към оригиналния графичен обект, който представлява контекста на графичното устройство. Новият графичен контекст се получава чрез създадения по-рано обект Image. Тази графика е свързана с изображение. Последователността на събитията е показана схематично на фигура 6.11.
Методът paint(Graphics g) вече изпълнява своите операции по рисуване в графичен контекст извън екрана. Когато се изпълни, той копира съдържанието на извънекранната графика в оригиналния графичен контекст, което води до изображение на дисплея. Операцията по копиране се извършва чрез извикване на метода Graphics.drawlmage(). Този метод казва по същество „Копирайте съдържанието на графичния контекст на този аргумент на изображението в мен“.
Механизмът за двойно буфериране в MIDP е различен от двойното буфериране в Swing. В Swing можете да буферирате двойно операциите за рисуване на всеки компонент, а не само на Canvas обекти. Swing приложенията извикват Java. авт. Component.getGraphics(), за да получите графичния контекст извън екрана. Приложението може да рисува в този контекст. След това свързва този графичен контекст извън екрана със самото устройство.
Фигура 6.11. Лявата половина представлява състоянието по време на първото въвеждане на метода за рисуване. Дясната страна представлява състоянието след получаване на графичния контекст извън екрана. Препратката запазва оригиналния графичен контекст. Цветното кодиране показва, че графичен контекст извън екрана е свързан с обект на изображение
MIDP няма такова повикване. Единствената препратка към обекта Graphics, който е свързан с действителното устройство, е тази, предадена на метода за рисуване (Graphics g) на Canvas.