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

c# - PictureBox双缓冲按键滞后?

有时,如果我按住左箭头键,pictureBox 将停止绘制我的角色的坐标。一个典型的例子是红圈中的黄点。通过按住左箭头键,pictureBox 并没有不断地绘制我的角色位置,直到我按下另一个键/放开箭头键,然后picturebox 再次开始更新(如您所见以紫色包围)。

此外,我遇到的另一个错误是它应该只在每个位置绘制一个黄点和一个“蓝色漩涡”;虽然它正在绘制多个(如您所见)。

下面的代码是我用来复制图片结果的代码。

0 投票
1 回答
222 浏览

java - 如何双缓冲 awt 对象

到目前为止,我正在尝试制作一个可以绘制(如油漆)的java程序,我有笔大小和不同的颜色。唯一的问题是矩形(它们就在那里,因此您可以看到单击的位置)在您绘制时闪烁。这是我的代码:

0 投票
0 回答
255 浏览

opengl - 导致屏幕撕裂或卡顿最可靠的效果是什么?

我正在尝试研究减少或消除屏幕撕裂的各种策略,例如各种 vsync 实现、手动帧速率计时、双缓冲等。我计划创建一个教程或论文来解释我的发现。

但是,首先,我需要创建一个简单的 opengl 程序来演示效果,这样我就会知道各种策略的效果如何。哪些类型的动画和效果最容易产生撕裂?我知道快速移动通常会触发它,但我假设我可以使用某种方程式或经验法则。

我试过用谷歌搜索,但我只能找到关于如何停止撕裂的无穷无尽的线索,没有有条不紊的方法来创建它。

0 投票
3 回答
10253 浏览

c++ - C ++中具有双缓冲区的单生产者,单消费者数据结构

我在 $work 有一个应用程序,我必须在两个以不同频率调度的实时线程之间移动。(实际的调度超出了我的控制。)应用程序是硬实时的(其中一个线程必须驱动硬件接口),所以线程之间的数据传输应该是无锁和无等待的可能的程度。

需要注意的是,只需要传输一个数据块:因为两个线程运行的速率不同,所以在较慢线程的两次唤醒之间会有两次较快线程的迭代完成的时候;在这种情况下,可以覆盖写入缓冲区中的数据,以便较慢的线程仅获取最新数据。

换句话说,代替队列,双缓冲解决方案就足够了。这两个缓冲区是在初始化期间分配的,读写线程可以调用类的方法来获取指向这些缓冲区之一的指针。

C++ 代码:

为了避免读取器线程中的数据过时,有效负载结构是版本化的。为了促进线程之间的双向数据传输,使用了上述怪物的两个实例,方向相反。

问题:

  • 这个方案是线程安全的吗?如果坏了,在哪里?
  • 可以在没有互斥锁的情况下完成吗?也许只有内存屏障或 CAS 指令?
  • 可以做得更好吗?
0 投票
1 回答
3771 浏览

android - 在 eglSwapBuffers 之后保留后台缓冲区内容

我正在 Android 和原生 C++ 中使用egl 1.1. 当前使用android的glSurfaceView-它允许我绘制到显示在“onDrawFrame”末尾的后缓冲区-当后缓冲区和前缓冲区被交换时。

我的问题是 - 我需要能够显示后台缓冲区并继续写入,就好像我没有交换一样。这种需求背后的原因是场景非常大,不可能每帧都构建它,也不可能等待绘图结束——因为用户将不得不等待太长时间。

换句话说 - 我需要逐步构建场景。在渲染过程中的某个时刻,我决定是时候了,我调用eglSwapBuffers它来显示来自后台缓冲区的绘制内容,但是当我继续写入时,显然我正在写入不同步的“前前缓冲区”。 .(不包含我到目前为止画的东西)。

据我所知,我唯一的选择是在交换之前复制后台缓冲区。伪:

  1. 绘制到后台缓冲区
  2. 缓冲区复制到临时缓冲区
  3. 交换
  4. 临时缓冲区复制到(新的)后台缓冲区
  5. 绘制更多的东西到后台缓冲区
  6. 等等...

我的问题 - 有没有办法执行步骤 2,4?

  • glCopyPixels在这种情况下有用吗?例子?
  • glBlitFramebuffer吗?

还是我接近这一切都错了?

我已经做过的事情:

  • 我尝试设置EGL_SWAP_BEHAVIOR为,EGL_BUFFER_PRESERVED但它似乎只适用于某些设备(如khronos 注释中所述):

某些表面允许应用程序控制是否保留颜色缓冲区内容

  • 在每一帧中重新渲染场景 - 不可能。我读过很多次,这是推荐的。
0 投票
0 回答
370 浏览

delphi - 更可控的双缓冲

这个问题的上下文是我正在处理 WM_NCPAINT 和 WM_NCACTIVATE 以便我可以自定义绘制我的非客户区。关于我到底在做什么以及我面临的问题的更多信息可以在这里找到。出于这个问题的目的,不应该质疑我在非客户区域上绘图的方式。(你可以在我链接的问题中做到这一点)

我面临的一个问题是闪烁非常明显,经过一些代码步进后,我发现很大一部分问题源于这段代码:

问题是在继承调用之后,整个默认的非客户区都被绘制出来,只有在那之后,我自己的框架版本才会被绘制出来。我尝试打开双缓冲,但这并没有解决问题。

我试图解决这个问题的方法是实现我自己的双缓冲版本,你可以告诉你的表单在某个点开始缓冲(即将所有绘图重定向到位图)并在另一个点显示更改,也选择由你。这样做的典型方法当然是直接绘制到缓冲区,但由于我没有明确地完成某些绘制,所以这不是一个选项(我认为)

我决定尝试的是覆盖 Canvas 属性及其读取功能,并在缓冲开始时返回位图。这样(我认为)所有直接在我的表单画布上绘制的尝试最终都会出现在一个位图上,然后我可以在我认为合适的时候将其绘制到屏幕上。我试过的,没有用,不一定要阅读,但这是我拼凑的:

它编译并运行没有错误,但不幸的是没有工作。我尝试制作 SSCCE,但由于某种原因,它在尝试访问被黑 FCanvas 的句柄时抛出异常错误。你可以在这里找到完整的代码:

但我觉得我正在尝试做的基本想法还不错,应该是可能的。

所以我的问题是:我做错了什么?更重要的是:

创建我要创建的那种缓冲区的正确方法是什么?

编辑 Sertac 指出,当绘制非客户区时,不会对画布进行任何引用,所以在我的情况下,我的方法似乎是无用的。我不知道,也许我正在做的事情仍然有助于避免客户区的顽固闪烁。Peter 明确表示 SSCCE 不会运行,因为 TForm1 从不从 TCustomForm 继承,因此插入器类不起作用,而是需要类帮助器。

0 投票
1 回答
39 浏览

swing - Java Applet_Dubble 缓冲不起作用

我正在用 Java 编写 JApplet,但是双倍缓冲并不能消除闪烁!?

我应该怎么办?

我猜这是代码的重要部分(如果您需要了解更多信息,请告诉我):

我感谢我能得到的所有帮助!:)

0 投票
1 回答
115 浏览

java - 使用 JPanel 时何时创建手动后台缓冲区?

我读过它JPanel有一个双缓冲系统,但我也看到人们使用 手动创建自己的后台缓冲区BufferedImage,这允许用户在实际渲染之前添加到图像中。

JPanelJPanel 双缓冲是如何工作的,如果已经有双缓冲,为什么还要创建自己的后台缓冲区?BufferedImage什么是需要/推荐您的缓冲区的时间示例?

0 投票
1 回答
413 浏览

.net - 在基础控件上绘制时.NET CF 双缓冲

我已经为一些完全由用户绘制的 .NET Compact Framework 控件使用了双缓冲,但是我无法弄清楚如何将双缓冲用于从另一个控件继承并在其上绘制的控件。

我有一个基于 DataGrid 的控件,它在标题上绘制。

我的 OnPaint 方法是:

CustomPaintHeaders 只是使用一些自定义绘图在基本 DataGrid 标题之上进行绘制。有时,我会在看到基本 DataGrid 标题被绘制的地方闪烁,但顶部没有我自定义绘制的东西。

是否可以使用双缓冲,并将由 MyBase.OnPaint 完成的绘画应用于缓冲图像?

编辑:正如我在评论中提到的,我可以使用以下代码进行双缓冲:

这可以正常工作而不会闪烁,但我想避免必须实现 CustomPaintRows,而只需让 DataGrid 的 OnPaint 为我处理该部分,然后使用我的 CustomPaintHeaders 方法绘制它的标题。

0 投票
1 回答
1021 浏览

java - JPanel 游戏画面撕裂和双缓冲

我目前正在使用 JPanel 从我的游戏中绘制元素,但是,经过一些研究,我了解了屏幕撕裂和双缓冲,我相信这是解决我的问题的方法,但是,目前图形偶尔会卡顿我的代码我发现在不删除大量代码的情况下很难实现。

我想知道是否有人可以提供一种更简单的方法来修复基于小型 2D 瓷砖游戏的屏幕撕裂问题,或者如何使用我当前的代码进行双缓冲,非常感谢!

框架.java

游戏.java

如代码所示,Game 类包含 Game 循环,它会不断地重新绘制 Frame 类。如何调整此代码以允许双缓冲以消除屏幕撕裂?谢谢!