问题标签 [doublebuffered]

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 投票
4 回答
1488 浏览

.net - (.NET/C#/winforms) 在带有图形的表单上绘制时出现伪影

我的目标是移动使用 Graphics 对象的方法绘制的可视元素在没有闪烁或伪影的情况下(在 .NET 3.5 中)在 Form 上移动。我可以通过使用自动双缓冲(将 Form 的 DoubleBuffered 属性设置为 true)或自己实现后缓冲来成功实现无闪烁移动。然而,我正在努力寻找一种方法来使用这两种方法,而不会显示清晰可见的伪影。

使用自动双缓冲时,页面撕裂效果很明显。在我的 60Hz LCD 的多达 3 次刷新过程中,似乎后台缓冲区正在缓慢地、逐步地​​从上到下复制到表单中。

当我自己实现双缓冲时(有关详细信息,请参阅代码块),它看起来好像后台缓冲区被复制到表单的速度足够快,不会发生页面撕裂。然而,有时会出现另一种类型的伪影。下面的代码允许您使用箭头键在窗体上左右移动白色背景上的蓝色矩形,应该将效果再现为一系列水平的白色带,这些带有时会出现在矩形的左右边缘就像它被移动一样。

if(其他人能够重现效果){
    我做错了什么,可能
    在绘画代码中触发了某种竞争条件,或者
    这只是我必须
    忍受的运行时行为?
}
else {
    这可能是我的显卡的特性或
    显示驱动程序有问题吗?
}

0 投票
6 回答
44042 浏览

c# - 如何双缓冲面板?

我有一个面板,上面有一个轮盘,我需要对面板进行双重缓冲,使其停止闪烁。谁能帮我吗?

编辑:

是的,我已经尝试过了。

panel1.doublebuffered 不存在,只有 this.doublebuffered。而且我不需要缓冲表单,只需缓冲面板。

0 投票
10 回答
41666 浏览

c# - Winforms:SuspendLayout/ResumeLayout 不够用?

我有一个包含一些“自定义控件”的库。本质上,我们有自己的按钮、圆角面板和一些带有一些自定义油漆的组合框。尽管 OnPaint 方法中有“数学”,但控件是相当标准的。大多数时候,我们所做的只是绘制圆角并向背景添加渐变。我们使用 GDI+ 来完成这一切。

这些控件没问题(根据我们的客户看起来非常漂亮),但是尽管有 DoubleBuffer,您仍然可以看到一些重绘,尤其是当同一表单上有 20++ 个按钮(例如)时。在表单加载时,您会看到按钮绘制……这很烦人。

我很确定我们的按钮不是地球上最快的东西,但我的问题是:如果双缓冲区“打开”,所有重绘不应该在后台发生,Windows 子系统应该“立即”显示结果吗?

另一方面,如果存在将创建标签的“复杂”foreach 循环,则将它们添加到面板(双缓冲)并更改它们的属性,如果我们在循环之前暂停面板的布局并在循环时恢复面板的布局结束了,所有这些控件(标签和按钮)不应该“几乎立即”出现吗?这不会那样发生,您可以看到面板被填充。

知道为什么这没有发生吗?我知道没有示例代码很难评估,但这也很难复制。我可以用相机制作视频,但相信我,它并不快 :)

0 投票
2 回答
1549 浏览

c++ - 带有 Alpha 通道的闪烁子窗口

当绘制包含具有每像素 Alpha 通道的位图的子控件时,每当需要重绘它们时,我们就会得到相当多的闪烁。实际的混合工作正常。我找到了很多关于减少闪烁的信息(例如这个问题这个网站),但我似乎找不到任何特别适用于这种情况的信息。

例如,我有一个带有几个不同位图的按钮,这些位图根据按钮的状态进行了 alpha 混合和 blitted 到窗口。当它们的状态发生变化并且我需要绘制不同的位图时,我需要先重新绘制背景,否则它会与前一个状态位图留下的像素混合。这是我得到一些闪烁的地方,我偶尔会得到一些背景撕裂。

让顶级父窗口绘制位图背景而不是纯色,以及让子控件重叠的可能性使问题变得更加复杂;只是将基础颜色乘以孩子的位图是不可能的,就像使用WS_CLIPCHILDREN.

由于窗口有位图背景,我将返回trueWM_ERASEBKGND以避免绘制将被覆盖的颜色。

当然,双缓冲似乎可以解决所有这些问题,但我无法让它正常工作。我已经WS_COMPOSITED为顶级窗口和WS_TRANSPARENT子窗口设置了。当需要使用新位图重绘子窗口时,我遇到了一些问题(很可能是我不理解在这种情况下绘制顺序是如何工作的):

  • 如果我调用InvalidateRect()并传递子句柄,子窗口确实被重绘,但背景没有被重绘,因此像素相互叠加,混合在一起。
  • 如果我调用InvalidateRect()并传入句柄,矩形由子窗口的尺寸组成,则背景会被重绘,但子窗口不会。
  • 如果我同时执行上述两项操作,那么背景和子窗口都会被重绘,它看起来完全符合我的要求——除了这样做,我设法让它再次闪烁(这不是这并不令人惊讶,因为这样调用两次似乎非常骇人听闻InvalidateRect(),因为我猜每次调用都可能导致缓冲区翻转,这违背了目的)。

我得出的结论是,我真的不明白我需要如何修改我的程序来处理双缓冲,或者双缓冲是否有助于解决这种情况。我觉得它肯定会,但我不太明白我需要如何修改东西才能让所有东西再次正常播放。

0 投票
3 回答
9693 浏览

qt - Qt 和双缓冲 - 是否有任何巧妙的技巧来捕获像素或操作后台缓冲区?

我正在将应用程序从 MFC 迁移到 Qt。

MFC 应用程序将使用 GDI 调用来构建窗口(基本上是一个图表)。它将绘制到内存位图后台缓冲区,然后将 BitBlt 绘制到屏幕上。然而,Qt 已经做了双缓冲。

当用户在图表中单击并拖动时,我希望窗口的该部分被反转。

我想找到最好的方法来做到这一点。有没有办法做一些像从小部件的后台缓冲区而不是屏幕抓取的东西?...也许是 BitBlt(..., DST_INVERT) 等价物?

我在 QPainter 中看到了 setCompositionMode(),但文档说这只适用于在 QImage 上操作的画家。(否则,我可以使用精美的合成模式将实心矩形图像合成到我的小部件上,以获得类似反转效果的效果)

我可以做与 MFC 相同的事情,绘制到 QImage 后台缓冲区......但我读到硬件加速可能无法以这种方式工作。重新实现 Qt 中已经提供给您的双缓冲似乎是一种浪费。我也不太确定关闭小部件的双缓冲可能会产生什么副作用(以避免三重缓冲)。

有一次,我有一个令人费解的 QPixmap::grabWidget() 调用,并带有防止递归的标志来保护它,但这会将所有内容渲染两次,并且显然比仅绘制到 QImage 更糟糕。(并且在文档中特别警告过)

我是否应该放弃并将所有内容绘制到 QImage 上,就像我在 MFC 中所做的那样?

编辑:

好的,QPixmap 画家的运行速度与现在的直接运行速度大致相同。因此,使用 QPixmap 后台缓冲区似乎是最好的方法。

解决方案对我来说并不明显,但如果我查看更多示例(例如 Ariya 的 Monster 演示),我可能会按照预期的方式对其进行编码,并且效果会很好。

这就是区别。我看到了使用这个的帮助系统演示:

在paintEvent() 的开始。因此,我似乎很自然地认为,将缓冲区加倍到 QPixmap 然后在屏幕上绘制,您需要这样做:

实际上,您显然应该这样做:

我可以看到我的方式同时有两个活跃的画家。我不完全确定为什么它更快,但直觉上我更喜欢后者。它是一个单一的 QPainter 对象,一次只做一件事。也许有人可以解释为什么第一种方法不好?(就 Qt 渲染引擎中的错误假设而言)

0 投票
1 回答
3332 浏览

c# - WinForms - Form.DoubleBuffered 属性是否影响放置在该表单上的控件?

Form具有 DoubleBuffered 属性(bool,继承自 Control)。

如果设置为 true,是否所有控件都放置在窗体上,因为它们位于窗体上,所以以双缓冲方式绘制到屏幕上?还是您需要担心自己的 DoubleBuffered 属性?

0 投票
4 回答
7461 浏览

c# - 双缓冲列表框

我有一个 CheckedListBox (WinForms) 控件(它继承自 ListBox;谷歌搜索显示问题出在 ListBox 上),它锚定在其表单的所有四个侧面。调整窗体大小时,ListBox 会出现难看的闪烁。我尝试在 ctor 中继承 CheckedListBox 并设置DoubleBufferedtrue(此技术适用于其他控件,包括 ListView 和 DataGridView),但没有效果。

我尝试将WS_EX_COMPOSITED样式添加到CreateParams,这有所帮助,但会使表单调整大小变得更慢。

有没有其他方法可以防止这种闪烁?

0 投票
1 回答
433 浏览

graphics - 黑莓中的双缓冲?

在渲染我们的绘制代码时,我们是否需要在 BlackBerry 中进行双缓冲,或者 BlackBerry 是否会处理?如果我们需要自己做,我们该怎么做?

0 投票
4 回答
11537 浏览

delphi - 为什么 DoubleBuffered 默认禁用?

创建新表格后,我通常会执行以下仪式:

  1. 把名字改成有意义的;
  2. 输入一个Caption
  3. 更改位置属性(DefaultPosOnly 几乎不是用户期望的);
  4. 设置ShowHinttrue;
  5. 设置DoubleBufferedtrue;

我一直想知道为什么默认值为“False”。对我来说,它只是看起来技术含量低且蹩脚,在我的新机器上我没有注意到性能上有任何差异。

双缓冲在旧机器、VNC、远程桌面或虚拟机上是否存在问题?

你把它打开还是关闭?有什么建议吗?

0 投票
4 回答
1679 浏览

java - Java中的线程安全双缓冲缓存(不适用于图形)?

我最近在寻找一种为常规对象实现双缓冲线程安全缓存的方法。

之所以需要,是因为我们有一些缓存的数据结构,每个请求都会被多次命中,并且需要从一个非常大的文档(1s+ 解组时间)从缓存中重新加载,我们不能让所有请求都被延迟每分钟都长。

因为我找不到一个好的线程安全实现,所以我自己写了,现在我想知道它是否正确,是否可以做得更小......这里是: