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

opengl - 是否可以 vsync SDL_SetVideoMode?

我正在尝试通过以下方式更改我的应用程序窗口的大小:

虽然我正在使用 vsync 交换缓冲区(在驱动程序 xorg-video-ati 中),但当窗口大小发生变化时,我可以看到闪烁(我猜是一个或多个黑框):

所以请有人知道,如果...
SDL_SetVideoMode 没有像 SDL_GL_SwapBuffers() 那样垂直同步?
还是它破坏了窗口并创建了另一个窗口,同时缓冲区是黑色的?
有人知道这样做的工作代码吗?也许在freeglut?

0 投票
1 回答
442 浏览

c# - 面板的 C# 双缓冲

我到处都在寻找面板的双重缓冲,但它都使用了对我来说太混乱的术语。我正在绘制生物节律,并希望有一个移动功能来缓慢地向前移动生物节律。但是,它闪烁很多,所以我需要弄清楚如何阻止它。我试图穿线它,但无济于事,因为穿线仍然会导致闪烁。

以下内容进入计时器:您可以跳到底部查看它在哪里绘制图形。基本上,它会刷新、计算和绘制点。

0 投票
2 回答
1798 浏览

javascript - 使用双缓冲改进 Html5 画布?

我正在用 javascript canvas 编写游戏,有时我会遇到延迟。我认为这是因为我在画布上画了很多东西。

例如,我的背景不是静态的,它从右向左移动,所以每次我都必须清除整个画布。而且我不是只用一种颜色来清除,而是用一个移动游戏循环的每个循环的图像来清除。

我认为这是一个昂贵的操作,我在想是否有什么东西可以降低这个操作的成本,例如使用双缓冲来清除背景(不知道你是否可以使用双缓冲来清除背景?)。

还是应该在整个游戏中使用双缓冲?(我不这么认为,因为我已经读过浏览器已经为您做到了)

0 投票
1 回答
732 浏览

c++ - SDL 图像撕裂/卡顿

首先,让我澄清一些事情:

  1. 我的显示器是 60 赫兹
  2. 我将我的 FPS 限制为 60,它似乎工作正常
  3. 我激活了双缓冲标志
  4. 我自己做了一个后缓冲区,并确保绘制到它,然后绘制到屏幕上
  5. 这个问题在全屏和窗口模式下都会发生

这是我的主要功能(它包含所有代码):

我知道这段代码看起来不太好,这只是一个测试,看看为什么每当我在 SDL 中编写任何东西时都会发生这种情况。

请忽略丑陋的代码,如果您知道是什么可能导致黑色背景上移动的白色方块的图像出现奇怪的伪影并且似乎撕裂/口吃,请告诉我。

如果您需要更多信息,请告诉我,我会更新需要的信息。

编辑:

  • 如果我不限制我的 FPS,它会以 200-400 fps 运行,这可能意味着 SDL_Flip 不等待屏幕刷新。

  • 我不知道我写的标志是否真的被使用了。

  • 我检查了我的标志,似乎我无法获得 SDL_HWSURFACE 和 SDL_DOUBLEBUF 标志。可能会导致问题?

0 投票
1 回答
631 浏览

c++ - 双缓冲故障(2013 年 12 月 17 日更新)

简介及相关资料:

我在我的主窗口的 WM_PAINT 处理程序中实现了一个复杂的绘画。

我已经提交了一张图片来说明它:

在此处输入图像描述

主窗口具有静态控件,而不是具有样式的按钮SS_NOTIFY

当用户点击它们时,程序中会发生某些动作,这些动作现在无关紧要。

下图显示了主窗口中静态控件的位置:

在此处输入图像描述

橙色面板上的地图是一个EMF文件,左上角和右上的标志是PNG文件,其他图片是bitmaps。

Visual Styles通过#pragma指令启用。我也用GDI+, 连同GDI.

项目被创建为空项目,我从“零开始”编写了所有代码。

为了实现这个任务,我决定把整个图片都画进去WM_PAINT,并在图片上对应的图片上加上透明static control的s 。

为了保持我的代码简洁明了,我制作了实现上述内容的函数,因此我的WM_PAINT处理程序可以尽可能小。

更新 #1(2013 年 12 月 17 日更新):

为了实施从成员arx获得的建议,我发布了一个可以编译并且可以重现问题的源代码:

我工作Windows XP,使用MS Visual Studio C++ 2008 Express Editionpure Win32 API

注意:由于 VS 的 Express 版本没有资源编辑器,因此资源文件和资源头是使用ResEdit从此处创建的:http ://www.resedit.net/ 。

问题:

为了避免闪烁,我使用了双缓冲,这是我从 *Paul Watt 的CodeProject文章、Charles Petzold 的 Programming Windows 5th editionForger 的 WIN32 教程中学到的。

从理论上讲,一切正常,我的代码编译没有任何错误。

我在这里粘贴了代码:http: //pastebin.com/zSYT1i8L

我的英语不够好,无法准确描述我面临的问题(我只能说主窗口的边缘和静态控件的重绘“缓慢”并且它们闪烁)所以我创建了一个演示应用程序来演示它们:http: //www.filedropper.com/geotermistgrafika

我为解决问题所做的努力:

我已经处理了WM_ERASEBKGND(返回(LRESULT)1),并且我已经从我的窗口类中排除了样式CS_VREDRAWCS_HREDRAW因此不应该因此而导致闪烁。

我的窗口没有WS_CLIPCHILDREN样式,因为在静态控件所在的位置可以看到部分桌面图片。

在我的WM_SIZE处理程序中,我有:

  1. 使用 API 重新定位静态控件并通过添加标志SetWindowPos(...)减少闪烁。SWP_NOCOPYBITS

  2. 用 使整个窗口无效InvalidateRect( hWnd, NULL, FALSE ),所以这个API在无效时不发送WM_ERASEBKGND(第3个参数是FALSE),但即使我尝试用TRUE效果也是一样的。

我已经为WM_PAINT处理程序实现了双缓冲,如上述书籍/文章/教程中的示例(通过在内存 DC 中执行所有操作并BitBlt(...)在屏幕 DC 上执行以避免闪烁)。

我没有处理WM_SIZING, 也WM_WINDOWPOSCHANGING, 或WM_MOVING消息。

我使用工具GDIView ( http://www.nirsoft.net/utils/gdi_handles.html ) 来追踪GDI leaks

每次我调整/最大化我的窗口时,GDIView在区域的列中显示 +4,这应该意味着我泄漏了区域,但我不知道这怎么可能,因为我不使用操作区域的 API,并且有仔细检查了一切。

在我看来,一切都应该没问题,也许这无关紧要,但我只是想提一下,也许这很重要。

如果我WS_EX_COMPOSITED向主窗口添加样式,性能不会提高。

我试图找到可以帮助我解决问题的在线示例,但是所有教程都很简单,并且不涵盖这种类型的复杂图片。

重要的提示:

在将我的WM_PAINT处理程序留空并使用通过 API获得的设备上下文调用onPaint函数后,闪烁消失了,但在调整大小期间,窗口的重绘是“尖峰”并且主窗口边缘的问题没有解决。WM_ERASEBKGNDGetDC(..)

尽管如此,这还是比原始代码更好的改进。

问题:

如何摆脱上面提供的我的演示应用程序中展示的问题?

我在此感谢任何投入时间和精力来帮助我的人。

最好的祝福。

0 投票
1 回答
962 浏览

c - 如何正确分配内存缓冲区以使用 turbo c 在 dosbox 中应用双缓冲?

好的,所以我在使用 IDE Turbo C++ 3.0 时尝试在模拟环境(DosBox)中应用双缓冲技术我正在运行 Windows 7 64 位(不确定这是否重要)并且我不知道如何正确执行缓冲例程在这种环境下。

我遇到的主要问题是我似乎无法执行以下赋值语句:

double_buffer = (byte_t far*)farmalloc((unsigned long)320*200);

(请注意,320 和 200 是屏幕尺寸)...我只是为分配获得 NULL。

我尝试将 DosBox 的默认 RAM 使用更改为 32 而不是 16,但这并没有做任何事情。我不确定是模拟器还是 Turbo C 的代码有问题。(请注意,它符合得很好)。

这是我在网上找到的一个示例程序:

0 投票
0 回答
789 浏览

c# - C# Windows 窗体慢速双缓冲

所以我有一个自定义的 WF 控件,里面有一些形状和文本。这些物体往往会经常移动。由于没有像 this.DoubleBuffered = true 或 "WS_EX_COMPOSITED" 这样的工作(至少对我而言)来消除闪烁,我设法自己创建了一个非常简单的双缓冲。问题是渲染非常慢。只有在小分辨率下它才足够快。

它是这样工作的:

如果我不使用“g”而是使用“e.Graphics”来绘制它,它就足够快了(但它会闪烁)。那么,是否有更快的方法来使用 WF 控件进行双缓冲?谢谢!

(如果我的英语不好也很抱歉)

0 投票
0 回答
931 浏览

opengl - SDL/OpenGL 应用程序中的屏幕撕裂效果

我正在开发一个使用 SDL (1.2.15) 和 OpenGL 的应用程序。在大多数情况下它工作正常。当它在具有相当旧的 nVidia 驱动程序(2008 年 2 月)的笔记本电脑上运行时,就会出现问题。有画面撕裂效果。看起来双缓冲无法正常工作(有一个水平条上下移动,有时,当一个精灵在另一个精灵上渲染时,我可以看到两者都在闪烁)我在这里找到的简单 SDL + OpenGL 示例也是如此:http: //users.soe.ucsc.edu/~pang/161/w06/prog3/SDL-docs/html/guidevideoopengl.html我尝试添加 SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1),但没有帮助。更新 nVidia 驱动程序可能会解决问题,但我想在旧机器上运行我的应用程序。有谁知道如何摆脱屏幕撕裂?我'

0 投票
0 回答
90 浏览

java - 如何双缓冲 JLayeredPane

我目前正在用 Java 制作路径铺设 Tile 游戏,我正在使用具有多层的 JLayeredPane。游戏运行良好,但每次调用 repaint 方法时,整个窗格都会闪烁。

现在我让游戏在计时器上运行,每个滴答声都会自动将角色沿着我布置的路径一次移动一个瓷砖。自然,我需要更新屏幕以将更改反映给用户,但问题是重绘方法会强制对 LayeredPane 的所有层进行重绘。每个滴答声都会导致屏幕地图区域闪烁。虽然它是可以忍受的,但我只想摆脱它,让它看起来更好。

我研究过双缓冲的使用,甚至将窗格的双缓冲选项设置为 true(例如 pane.setDoubleBuffered(true)),但对各种实现都没有运气。有没有一种方法可以为外部缓冲区中的每个刻度绘制带有所有图层的整个窗格,然后一次将其复制到主屏幕?

谢谢

0 投票
1 回答
410 浏览

c++ - 双缓冲在笔记本电脑上不起作用,在台式机上起作用

我最近遇到了一个奇怪的问题。我编写了一个应用程序类,它使用一个非常简单的渲染器在屏幕上绘制一些模型。相机是可移动的。

我在笔记本电脑上运行了这个程序。最初我注意到屏幕上没有绘制任何内容(但是,屏幕被正确的颜色清除了)。然后我注意到如果我点击装饰框并移动窗口,屏幕会自动更新:这样,模型变得可见,但除非我再次点击并移动装饰框,否则它们不会移动。

我在台式计算机上测试了我的程序,一切正常;相机平稳地移动。

最终,我让程序在我的笔记本电脑上运行,但我必须设置SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 0 );和禁用缓冲区交换。

下面是主要的应用程序类。在执行循环中,我调用应用程序状态堆栈来循环和渲染(应用程序状态实际上拥有渲染器)。

如果有任何后果,我的笔记本电脑有英特尔 HD 4000 显卡,台式机有 GTX 670。