问题标签 [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 投票
2 回答
950 浏览

java - Linux 上的 Java 2D 页面翻转

我们的 Java 2D 应用程序在 Linux 上运行时会出现屏幕撕裂现象。在 Windows 上运行时,它不会出现任何撕裂。我们花了很多时间分析我们的代码,但还没有找到原因。虽然我从不认为这一定不是我的代码有错,但我也认为问题出在 Linux 上的 Java 2D 渲染管道的可能性。顺便说一句,请注意我们看到了 Java 6 和 Java 7 的撕裂。在 Java 7 上运行时,无论是否启用 XRender 管道,我们都会看到撕裂。

我们当然是通过 a 使用双缓冲BufferStrategyBufferStrategy我们调用时得到的实现Frame.createBufferStrategy(2)是一个java.awt.Component$FlipSubRegionBufferStrategy. 此外,调用isPageFlipping()'BufferStrategy返回BufferCapabilitiestrue,调用isFullScreenRequired()功能返回 false。我们没有在全屏独占模式下运行,尽管我们尝试过这样做,但并没有解决问题。 BufferCapabilities.getFlipContents()返回FlipContents.UNDEFINED(但我怀疑这不相关)。

由于据称支持页面翻转并且我们正在获得页面翻转BufferStrategy(而不是 blitting 策略),我不认为渲染管道会导致撕裂。然而,我发现 Chet Haase 在 2006 年写的邮件列表消息解决了屏幕撕裂问题,其中指出:“您特定平台上的 Flip 策略可能实际上是在幕后进行复制,这与BltBufferStrategy,它运行到刷新工件中。”

我如何确定我们得到的翻转策略是否实际上不是页面翻转?

Chet 还表示,“使用 BufferStrategy 运行全屏是解决此问题的一种不错的方法;根据平台和情况,我们通常会为您提供 Flip 策略,该策略(通常)与显示的垂直刷新同步以避免撕裂。”

如何确定策略是否与显示的垂直刷新同步?

(有关上述来自 Chet Haase 的完整信息,请参见http://www.mail-archive.com/java2d-interest@capra.eng.sun.com/msg03743.html )

0 投票
3 回答
15095 浏览

c# - 面板双缓冲

通过将“AllPaintingInWmPaint”、“UserPaint”和“DoubleBuffer”ControlStyles 的值设置为“true” ( this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true)),可以对整个表单进行双缓冲。

但是 System.Windows.Forms.Panel 不会发生这种情况,因为该类不允许我这样做。我找到了一种解决方案: http: //bytes.com/topic/c-sharp/answers/267635-double-buffering-panel-control。我也试过这个:Winforms Double Buffering。它很滞后,即使它用于小图纸,我也有一些自定义资源,我在表单和其他东西中使用这些资源,因此我不会将整个表单变成一张图纸。第二个似乎会引起问题。还有其他方法可以做到这一点吗?

我问这个是因为我不希望面板上的绘图在调整表单大小时一直闪烁。如果有办法在没有双缓冲的情况下摆脱闪烁,我会很高兴知道。

0 投票
1 回答
866 浏览

c++ - WM_TIMER 动画闪烁

好吧,我正在使用一个具有 50 毫秒运行时间的计时器来为一些移动的文本设置动画(从技术上讲,它在文本之间滚动)。
问题是,如果你仔细观察,你会看到文本在闪烁,并且我喜欢它不闪烁。

所以我对动画不是很好,但有什么办法可以减少闪烁吗?也许更快的经过时间?或者我什至应该为此使用计时器?

编辑:
所以我试图实现双缓冲,我显然在做一些事情。

这是没有双缓冲的代码,这工作正常但有点闪烁。

这是我的代码,带有双缓冲。

第一个文本打印得很好,但第二个看起来像这样:

这是没有双缓冲的完整代码:http
://dl.dropbox.com/u/35314071/ScrollingTextClass.zip这里是带有双缓冲的完整代码:http: //dl.dropbox.com/u /35314071/ScrollingTextClass2.zip

0 投票
5 回答
4637 浏览

c - 在单写多读线程中交换缓冲区

故事

有一个作家线程,定期从某个地方收集数据(实时,但这在问题中并不重要)。然后有很多读者从这些数据中阅读。通常的解决方案是使用两个读写器锁和两个缓冲区,如下所示:

或者

问题

在这两种方法中,如果获取其他锁操作失败,则不会进行任何交换,并且写入器将覆盖其先前的数据(因为写入器是实时的,它无法等待读取器)所以在这种情况下,所有读取器都会丢失该帧数据的。

不过这没什么大不了的,阅读器是我自己的代码,而且它们很短,所以使用双缓冲,这个问题就解决了,如果有问题,我可以让它成为三缓冲(或更多)。

问题是我想尽量减少延迟。想象案例1:

在**此时**,理论上其他读者可以读取数据,buffer0只要作者可以在读者完成后进行交换而不是等待下一个周期。在这种情况下发生的情况是,仅仅因为一个阅读器迟到了,所有阅读器都错过了一帧数据,而这个问题本来可以完全避免。

案例2类似:

我尝试混合解决方案,因此作者在写入后立即尝试交换缓冲区,如果不可能,则在下一个时期醒来后立即交换。所以是这样的:

现在延迟问题仍然存在:

同样在**此时**,所有读者都可以开始阅读buffer0,这是在写入后的短暂延迟buffer0,但他们必须等到写入器的下一个周期。

问题

问题是,我该如何处理?如果我希望编写器在所需的时间段精确执行,则需要使用 RTAI 函数等待该时间段,我不能这样做

这引入了抖动。因为“几次”可能碰巧比“等待下一个时期”更长,所以作者可能会错过其时期的开始。

为了更清楚,这就是我想要发生的事情:

我已经找到的

我发现read-copy-update据我了解,它一直为缓冲区分配内存并释放它们,直到读者完成它们,这对我来说是不可能的,原因有很多。一,线程在内核和用户空间之间共享。其次,使用 RTAI,您不能在实时线程中分配内存(因为那样您的线程将调用 Linux 的系统调用,从而破坏实时性!(更不用说使用 Linux 自己的 RCU 实现了,因为出于同样的原因)

我还考虑过有一个额外的线程以更高的频率尝试交换缓冲区,但这听起来不是一个好主意。首先,它本身需要与 writer 同步,其次,我有许多这样的 writer-readers 并行工作在不同的部分,每个 writer 一个额外的线程似乎太多了。在与每个作者同步方面,所有作者的一个线程似乎非常复杂。

0 投票
1 回答
1690 浏览

java - Java SWT GC,如何强制刷新双缓冲图像?

有以下代码:

...执行底部指令后:shellGC.drawImage(offScreenImage, 0, 0);有时我会在 shellGC 组件上看到图像,有时 - 不是。只有当我“减慢”程序的执行速度时,我才会看到它,例如当我处于调试模式时。但是当它运行得很快时 - 它不会显示。我希望它强制显示,刷新或任何你的名字,这可能吗?

让我澄清一下,我想要实现的是实现一个基于帧的动画,但还不能播放它双缓冲,能够停止它,只显示暂停的特定单帧,等等......

谢谢你。

0 投票
2 回答
1113 浏览

animation - 流畅的 PostScript 动画

我想在 PostScript 中顺利运行动画。要看看我想要什么,让我直接切换到 PostScript。调用 ghostscript,然后

我们现在有一个灰色的正方形。

里面有一条黑线。我们现在将填充该条纹,一次是白色和黑色:

您现在将看到一些比原始黑色条纹更小的黑白矩形闪烁。理想情况下,我们会看到原始的灰色方块。或者差不多。我今天在哪里可以获得这样的功能?

要查看搜索大小为 5 的幻方的更有趣的动画序列:

几年前,我确实试图解决这些问题。但它从未进入 ghostscript 或 Xfree。请参阅 此页面。也许现在有一些更好的想法?

编辑:在阅读了到目前为止的回复之后,让我在这里澄清一个问题。本质上,这个问题有两个独立的问题:

  • 应该如何从语言层面看动画?我相信,最好的方法是将每一帧视为一个页面。通过copypage增量更改可以轻松实现。可悲的是, 的语义copypage只存在于级别 1 和 2 中。在级别 3 中, 的含义copypage更改为showpage。多年前,我对 ghostscript 进行了一些修改,以将所有可见的更改延迟到copypageor showpage。这样,在服务器(即显示器)本地XCopyArea执行包含更改区域的单。

  • 应该如何同步视觉显示上的实际变化以避免在所描述的图形中不存在的伪影?您看到的不规则闪烁不是 PostScript 的特权,它似乎存在于我迄今为止看到的任何双缓冲系统中。只需尝试在您认为合适的任何系统中进行编程。

进一步编辑:

要获得正确的语言级别,即级别 1 或 2(对于 ghostscript):


编辑:我添加此评论可能会吸引一些新的贡献者。

0 投票
1 回答
8816 浏览

vb.net - VB.NET 双缓冲

我一直在尝试使用以下命令让双缓冲功能在 VB.NET GDI+ 中用于太空入侵者游戏

但是因为我使用的是附加到一个类的单独的绘图例程,所以它似乎不起作用:

我从主窗体上的计时器调用此例程:

外星人绘制正确,但图像非常卡顿,双缓冲似乎不起作用。

有任何想法吗

0 投票
2 回答
6179 浏览

multithreading - 如何在多线程应用程序中同步双缓冲

我有两个线程,一个用于数据采集,另一个用于显示。为了避免不必要的同步。我使用双缓冲(或翻页)如下:

  1. 数据线程正在写入缓冲区 1,而显示线程正在读取缓冲区 2
  2. 一旦对缓冲区完成写入,数据线程就会切换到另一个缓冲区(缓冲区 2)并开始写入新页面。
  3. 对于读取,如果一个缓冲区正在写入,则显示线程从另一个缓冲区读取。

它实际上运行良好,但有时(每 100 帧 1 个)我可以看到显示器撕裂,这意味着仍然存在竞争条件。

那么如何实现这种双缓冲的最小(有效)同步呢?一个伪算法对我来说就足够了。

0 投票
1 回答
429 浏览

performance - SDL_UpdateRect 在双缓冲屏幕上的精确时间和效果是什么?

使用带有Simple DirectMedia 层SDL_UpdateRect的双缓冲屏幕,在 blitting 多个图像之后调用一次还是在调用之前在 blitting 每个单独的图像之后调用一次效率更高SDL_Flip?换句话说,会SDL_UpdateRect导致屏幕立即更新,还是只是简单地告诉 Simple DirectMedia Layer 在屏幕翻转时必须更新哪些区域?它通常应该如何与双缓冲屏幕一起使用?

作为参考,这里是 的描述SDL_UpdateRect

确保在给定屏幕上更新给定区域。矩形必须限制在屏幕边界内(不进行剪辑)。

如果' x '、' y '、' w '和' h '都为0,SDL_UpdateRect将更新整个屏幕。

0 投票
1 回答
2682 浏览

c++ - Win32双缓冲绘制黑色背景

在 c++ 中的 win32 中做一个项目,试图双缓冲正在绘制的图像,但我得到一个黑屏,上面绘制了正确的位图。这也导致了我的 WM_MOUSEMOVE 条件,它与光标一起拖动位图而不绘制位图。绘制代码如下:在WM_PAINT下的wndproc中调用paint(),scroll是滚动条的位置,目前未使用。