问题标签 [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 回答
2042 浏览

c# - 什么可能导致双缓冲杀死我的应用程序?

我有一些使用 GDI+ 绘制到屏幕上的自定义(winforms)组件。

为了防止重绘时闪烁,我决定启用双缓冲,所以我在构造函数中添加了一行:

在这个组件(ColourWheel)上效果很好。当我将同一行添加到其他两个(结构相似的)组件中的任何一个的构造函数中时,我得到了一些奇怪的症状:

  1. 当我尝试在打开组件的情况下运行表单时,我得到一个 Argument Exception on Application.Run(new Form());
  2. 如果我切换到设计模式,我会收到一个错误,提示组件有一个与参数有关的未处理异常。

我是否在其中一个或全部上打开双缓冲似乎并不重要,它仍然适用于 ColourWheel,但不适用于其他。

作为记录,我还尝试了其他一些 缓冲技术。

什么可能导致双缓冲在一个组件上起作用,而在其他组件上不起作用?


编辑:这是运行时症状的异常详细信息:

System.ArgumentException 未处理 Message=Parameter 无效。Source=System.Drawing StackTrace:在 System.Drawing.Graphics.GetHdc() 在 System.Drawing.BufferedGraphics.RenderInternal(HandleRef refTargetDC, BufferedGraphics 缓冲区) 在 System.Drawing.BufferedGraphics.Render() 在 System.Windows.Forms.Control .WmPaint(Message& m) 在 System.Windows.Forms.Control.WndProc(Message& m) 在 System.Windows.Forms.ScrollableControl.WndProc(Message& m) 在 System.Windows.Forms.UserControl.WndProc(Message& m) 在 System .Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg,


编辑 2:来自导致问题的两个组件中的一个(更复杂的)的 OnPaint 处理程序:

0 投票
2 回答
11540 浏览

java - 双缓冲一个 JFrame

在开发 2D 游戏时,我阅读了很多有关双缓冲的信息。我遇到了许多不同的实施策略,但不确定双缓冲如何适应我创建游戏窗口的方式。例如,我遇到的一篇文章 (http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering) 建议使用单独的绘图方法;但是,我怀疑如果您正在绘制形状而不是向窗口添加组件,这将适用。

这是我的主要 GUI 代码(省略了 keylistener 方法)

你会建议我如何处理这个?请记住,Board 是由缩放图像网格组成的 JPanel,而 sprite 将是显示缩放图像的 JComponent。

问候,杰克。

0 投票
3 回答
8262 浏览

java - Java swing 双缓冲

我刚开始使用双缓冲,一切正常,直到我想在屏幕上添加一个 JScrollPane,这样我以后可以做一些相机移动。除了 JScrollPane 的 ScrollBars,一切都很好(我的精灵)。我希望他们被展示出来!

但是,如果我调整窗口大小,滚动条会闪烁,所以我知道它们在那里!如果我足够快,我什至可以使用它们。他们为什么不出现在渲染?:(

这是问题的SSCCE:

0 投票
0 回答
286 浏览

java - Java RepaintManager 和 JFileChooser

我正在使用 Java 编写模拟软件。我有一个框架,我在其中使用双缓冲进行绘制。以下是我在构造函数中的操作方式:

我想创建一个 JFileChooser:

文件选择器弹出,但我无法对其执行任何操作。当我尝试在构造函数中的 repaintManager 之前创建一个随机 JFileChooser 时,选择器按预期运行而没有问题。重绘管理器对文件选择器有什么影响?我该如何解决?提前致谢!!!

0 投票
2 回答
1069 浏览

java - 如何在打开的菜单下绘制图像

我正在为 JPanel 中的 BufferedImage 实现我自己的双缓冲,这样我就可以在 BufferedImage 中显示鼠标位置,而无需在 mousemovement 上将每个对象重新绘制到它上面。当父 JFrame 中的 JMenu 打开时,BufferedImage 会在 JMenu 之上重新绘制。

这个类不完整,只有必要的方法,

还有另一种方法可以做到这一点吗?

另一个可能的问题是,当 Foo JPanel 初始化时,它有一个黑色边框,但是当绘制图像以显示鼠标位置时,边框消失了。我假设在父母身上调用 repaint() 或其他东西会解决这两个问题,但它也会在孩子身上调用 repaint,这是我试图避免的。

编辑 1:这是请求的可运行代码。创建它时,我无法使双缓冲正常工作,因此我也遇到了移动鼠标时鼠标位置闪烁的问题。

谢谢!

0 投票
1 回答
2285 浏览

c# - 优化绘图应用程序 c#

我正在使用 c# 制作一个像 photoshop 这样的绘画项目。我使用 GDI+ 进行绘图。遗憾的是,我无法发布所需声誉点的屏幕截图。编辑:好的,我有足够的代表上传图片。 在此处输入图像描述

当画笔大小增加时,我使用鼠标进行的绘图会滞后。我有一个画布缓冲区,它被绘制到画布面板

这就是完成任何绘画时会发生的情况。

  1. 我存储鼠标拖动事件的点列表。
  2. 我从a点到b点画了一系列圆,以记录点为中心画一条平滑线
  3. 此绘制是在存储在图层类中的笔划列表中的位图上完成的。这个绘图也是用 CompositingMode.SourceCopy 来实现 alpha 值绘图
  4. 我有一个 layerBuffer 来存储图层的最终图像。我通过使用 SourceCopy 兼容模式使用透明颜色的绘图清除它来将受笔触影响的更改绘制到此 layerBuffer,然后使用 SourceOver 在笔触列表中绘制位图
  5. 由于我正在实施的分层系统,我将所有图层缓冲区绘制到一个图片缓冲区。这张图片Buffer最终通过缩放变换绘制到canvasBuffer中。

注意:画布缓冲区的受影响区域以与图层缓冲区相同的方式完成,即清除受影响的部分并重新绘制图片缓冲区的整个受影响部分。如果我不清除之前的绘图,则使用 alpha 值绘图将无法按预期工作。

请帮助我优化此代码或提出一些新方法来提高性能并减少使用鼠标绘制时的延迟。此外,将绘图代码和使用线程的缓冲区的点计算和绘图分开会有帮助吗?

这是代码。

0 投票
1 回答
3625 浏览

java - Java 图像闪烁

我可以从谷歌搜索中看到这个问题被问了很多,但我找到的解决方案都没有为我做这件事。你知道,我正在用 Java 制作一个带有图像的游戏,因为游戏通常都有这些东西。但是整个表格一直在闪烁,我无法让它停止。是的,我已经对其进行了双重缓冲并覆盖了 update() 方法,虽然这确实有帮助,但闪烁仍然存在。我不知道我是否对双缓冲做错了,或者我是否需要完全不同的东西。

起初我以为它可能与 clearRect() 行有关,但删除它后,游戏仍然闪烁,但当然不是每次都清除。所以这根本没有帮助。减慢计时器后,闪烁确实几乎完全消失了,但我需要将其减慢到 100 毫秒,即使那样我仍然会出现一些闪烁。此外,这对游戏来说太慢了。我尝试让一个计时器在 10 毫秒计时器上完成所有工作,另外一个计时器在 100 毫秒进行绘画,但它看起来很跳跃。我可以将绘画计时器减慢到大约 30 毫秒,并且它仍然很流畅,尽管闪烁仍然是一个问题。

必须有一种方法可以每 10-30 毫秒执行一次而不会闪烁。是否有其他类似于双缓冲但在这种情况下更好的方法,或者我可以使用的方法?提前感谢您的帮助。

0 投票
1 回答
204 浏览

c++ - WM_EX_COMPOSITED 没有双缓冲

我正在尝试在 Win32 应用程序中实现双缓冲,因此我需要将窗口的控件从最后面的控件绘制到最前面。据我了解,WM_EX_COMPOSITED这样做,但它也会对自身进行双重缓冲1。如何在WS_EX_COMPOSITED没有双缓冲的情况下让窗口从下到上绘制?


我没有使用WM_EX_COMPOSITED双缓冲,因为我认为我可以手动做得更好,并且不会出现 DWM 闪烁等问题。

0 投票
1 回答
1092 浏览

java - Java:如何在 Snake 游戏中使用双缓冲来实现流畅的动画效果?

我正在写蛇游戏。我被动画困住了,因为我想获得流畅的动画。我不知道如何加倍缓冲图像以获得双缓冲。必须做什么才能使其成为双缓冲?我使用扩展 JFrame 的主框架,在这里我添加了两个 JPanel - 一个用于状态栏,一个用于动画。以下是用于蛇动画的类:

播放器类

MainGamePanel.class

和 JFrame 的 Game.class

0 投票
2 回答
1047 浏览

c++ - WS_EX_COMPOSITED - 高 CPU

我在我的应用程序中使用 WS_EX_COMPOSITED 样式,但它运行 CPU 到 100%,有没有办法停止我的应用程序绘图一段时间并仅在我需要时恢复?有些人建议使用睡眠,但我究竟在 WndProc 中的哪个位置放置睡眠?

提前致谢。