问题标签 [double-buffering]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1830 浏览

windows - 启用桌面合成是否需要双缓冲?

启用桌面合成后是否仍需要双缓冲?

在 Microsoft 的应用程序兼容性指南中:

图形设备接口 (GDI)

在 Windows Vista 和 Windows Server 2008 之前,窗口句柄 (HWND) 直接绘制到屏幕上,这有一定的好处,但限制了 Windows 显示和管理顶级窗口的方式。在 Windows Vista 和 Windows Server 2008 中,所有顶级窗口都被渲染为离屏位图(类似于 WS_EX_LAYERED),桌面窗口管理器将图像组合在一起以绘制桌面。

听起来现在所有的渲染都是在离屏位图上完成的:

窗口被渲染为离屏位图

它是否正确?

我问的原因是因为我在标准油漆周期中仍然看到闪烁:

  • WM_ERASEBKGND
  • WM_PAINT

启用桌面合成时:

替代文字

我会假设在调用之间

所有的绘画都会发生在后台缓冲区:

窗口被渲染为离屏位图

同时,前缓冲区将不受影响。

0 投票
12 回答
72385 浏览

javascript - HTML5/Canvas 是否支持双缓冲?

我想做的是在缓冲区上绘制我的图形,然后能够将其原样复制到画布上,这样我就可以制作动画并避免闪烁。但我找不到这个选项。有人知道我该怎么做吗?

0 投票
2 回答
6068 浏览

c++ - WinAPI 双缓冲

默认的 winAPI 应用程序没有双缓冲。相反,它在确保只绘制需要绘制的内容方面做得非常非常好,这给了它一个无缝的外观。但是,当您调整窗口大小时,需要重新绘制整个内容,这会导致控件、选项卡上的背景以及有时选项卡的白色之间闪烁。

所以我的问题是,在我的应用程序中支持双缓冲的最简单方法是什么?

0 投票
5 回答
4757 浏览

c++ - 双缓冲winAPI

好的,所以在我的应用程序中,有一堆 winAPI 和一些自定义控件。耶...

现在,通常情况下,他们会悄悄地为动画、状态改变等重新绘制自己……一切都很好。

但我有一个名为fix() 的类Window 方法。每当需要更新整个窗口时都会调用它。它调整控件的大小并使窗口无效。

发生这种情况时,将绘制背景,然后是选项卡控件,然后是顶部的所有其他控件。这会导致非常恼人的闪烁,尤其是在调整窗口大小时(因为不断调用 fix())。

我试过的:

  • WS_EX_COMPOSITED。这只会对各个控件进行双重缓冲。它是一种改进,但闪烁不可避免地仍然存在。
  • 关闭背景绘图。很难解决问题,实际上使事情变得更糟。

所以:我需要一种技术/方法/任何东西来让我对整个窗口进行双重缓冲。我认为自己处理 WM_PAINT 消息可能是一种解决方案,但我不知道从哪里开始。我有一种可怕的感觉,这甚至是不可能的……

请帮忙,这是一个关键问题。当这个愚蠢的小问题得到解决时,我会感到非常欣慰。

0 投票
1 回答
1828 浏览

java - Java 缓冲区策略:编译器不喜欢它

我正在尝试对画布使用双缓冲,这是我以前从未做过的。我利用了在线教程,并设置了以下代码来实例化画布并为其设置缓冲。我编写了包括渲染图形(此处未显示)在内的完整过程,编译器接受它。

但是程序在下面代码中的标记行爆炸了。运行时抛出一个非法状态异常,解释为“组件必须有一个有效的对等点”。

据我所知,源代码基本上就像我在几个示例中看到的那样,所以我不知道这里发生了什么。任何帮助将不胜感激。

谢谢,

约翰·多纳

0 投票
1 回答
2637 浏览

javascript - HTML画布双缓冲帧率问题

我有一个全屏画布,上面画了 3 张图像。当我调整窗口大小时,这些图像会改变位置;但是,它似乎非常有问题,在 Firefox 中更是如此。

我一直在阅读双缓冲应该解决这个问题,但我想知道当下一个位置未知时我将如何双缓冲。也就是说,我无法确定以后应该缓冲什么,那怎么可能呢?

这是一个似乎可行的来源,但我不完全理解 Fedor 试图解释的概念。

HTML5/Canvas 是否支持双缓冲?

到目前为止,我有,

0 投票
1 回答
6037 浏览

android - 提高 SurfaceView 派生的自定义视图的性能?

我编写了一个简单的 Android 应用程序,它使用从SurfaceView. 它遵循LunarLander 示例应用程序SurfaceHolder的模型,并使用后台线程直接在对象中执行所有计算和绘图。

一切都很好,它对于中小型迷宫运行良好,但是如果我将迷宫单元大小设置为 8 像素,那么应用程序会在迷宫中爬行很多单元。

代码正在做一些我不喜欢的事情,即使它没有改变,它也会绘制每个单元格,这是避免屏幕从SurfaceView双缓冲区闪烁所必需的(在应用程序的先前迭代中,我正在绘制改变的内容,并且导致混乱)。

我想要的是能够使用SurfaceView但对绘制的内容更具选择性。这可能吗?如果没有,有什么替代方案?保留一个离屏位图,然后有选择地先画进去怎么样?

编辑:我实现了一个屏幕外BitmapCanvas组合,由我的计时器驱动状态机写入,仅绘制在雕刻/解决方案期间受影响的那些区域。然后我简单地将整个屏幕外位图绘制到方法SurfaceViewrun(),这解决了我的问题;我能够将单元格大小降低到 5 像素并且性能很好。

0 投票
2 回答
2176 浏览

winapi - C++ win32项目双缓冲

我有一个 win32 应用程序,我想通过拖动鼠标来画一条线。我也使用双缓冲,但问题是它在鼠标路径中绘制了多条线。这是我的绘图代码:

我也尝试在画线之前不将背景复制到缓冲区中,它会正确地画线,但是当我画一条新线时,之前画的线会消失。那么如何使用双缓冲绘制多条线并保留先前绘制的线?

0 投票
1 回答
1223 浏览

iphone - iPhone opengl ES 将帧缓冲区复制到渲染缓冲区中

嘿伙计们,

我正在用opengl es制作动画。动画应该绘制正方形。这已经可以了,但是如何将帧缓冲区中的内容复制到渲染缓冲区中,问题是每一帧只有一个正方形在显示器上。

当我在模拟器中测试它并且它工作时。对于每个新帧,都会绘制一个已知的正方形,而其他已经绘制的正方形仍在屏幕上。但是当我在设备上测试它时它没有工作。屏幕只是在闪烁。

我认为发生这种情况是因为我的 Mac 和其他所有计算机一样使用双缓冲,而 iPhone 没有。

请帮我。

这就是我设置帧缓冲区的方式:

我还写了一个 setupView Methode:

这是我的 drawView 方法:

const GLfloat squareVertices[] = { -1.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, -1.0f, 0.0f, -1.0f, -1.0f, 0.0f };

0 投票
3 回答
1239 浏览

c# - C#双缓冲?

我正在使用 COSMOS 编译器用 C# 编写一个操作系统(对于那些不知道 COSMOS 将 IL 代码转换为 x86 程序集的人),我正在制作一个 GUI。
我以前制作过 GUI,但现在我正在尝试制作双缓冲区。
这听起来很简单,但以下是我的问题 -
我不能使用System.Drawing库中的任何方法或使用 p/ 调用的任何其他命名空间。另外,我不能使用多维数组(我可以使用常规数组)。所以我的问题是如何实现双缓冲?
我知道这是可能的,因为我知道有人这样做。

此外,我拥有的唯一图形功能SetPixelGetPixelClear。尽管我更喜欢一个答案,但如果有人知道一篇关于双缓冲等的好文章,请告诉我。
PS。我的操作系统是 320 x 200 Res LOL