#java #graphics #swt #doublebuffered #double-buffering
#java #графика #swt #с двойной буферизацией #двойная буферизация
Вопрос:
Есть следующий код:
image = new Image(display, imageData);
offScreenImageGC.drawImage(image, 0, 0, imageData.width, imageData.height, imageData.x, imageData.y, imageData.width, imageData.height);
/* Draw the off-screen image to the shell. */
shellGC.drawImage(offScreenImage, 0, 0);
… после выполнения нижней инструкции: shellGC.drawImage(offScreenImage, 0, 0);
иногда я получаю изображение, видимое на компоненте shellGC, иногда — нет. Я получаю его видимым только тогда, когда я «замедляю» выполнение программы, например, когда я нахожусь в режиме отладки. Но когда он работает быстро — он не отображается. Я хочу, чтобы оно было принудительно отображено, сброшено или как вы это называете, возможно ли это?
Позвольте мне пояснить, что я хочу добиться реализации анимации, основанной на кадре, но еще не имеющей возможности воспроизводить ее с двойной буферизацией, способной остановить ее, показывать только определенный отдельный приостановленный кадр и т. Д. Вещи…
Спасибо.
Комментарии:
1. Выполняется ли этот код при событии рисования?
2. Нет, он не работает на paintControl. На самом деле это именно ошибка. Он работает на windows7, но, скорее всего, будет иметь проблемы на других платформах. Я взял приведенный выше пример с форума, и это явно неправильно. Мне сказали, что единственный БЕЗОПАСНЫЙ способ — это рисовать в GC виджета из вызова PaintListener.paintControl (paintEvent). Это то, что я сделал сейчас. Я исправил свою проблему, теперь БОЛЬШЕ нет непредсказуемого поведения буферизации. Я жду, пока пройдет необходимое время, чтобы ответить на мой собственный вопрос.
Ответ №1:
Оказалось, что это ЕДИНСТВЕННЫЙ БЕЗОПАСНЫЙ способ удвоить буфер с помощью SWT:
canvas.addPaintListener(new PaintListener() {
public void paintControl(PaintEvent event) {
//Obtain the next frame
ImageData imageData = imageDataArray[iad.imageNumber];
Image imageFrame = new Image(display, imageData);
// Create the image to fill the canvas
Image image = new Image(display, canvas.getBounds());
// Set up the offscreen gc
GC gcImage = new GC(image);
//Draw the image offscreen
gcImage.setBackground(event.gc.getBackground());
gcImage.drawImage(imageFrame, 0, 0);
// Draw the offscreen buffer to the screen
event.gc.drawImage(image, 0, 0);
imageFrame.dispose();
image.dispose();
gcImage.dispose();
}
});
…. используя этот метод ТОЛЬКО для двойной буферизации, гарантируется равное поведение во время выполнения между платформами, и непредсказуемое поведение буфера также исчезает.