这是这个问题的后续行动.我正在编写一个简单的游戏,我正在寻找在Win32窗口中(反复)显示RGB数据数组的最快方法,没有闪烁或其他工件.
在上一个问题的答案中建议采用几种不同的方法,但没有达成共识,哪种方法最快.所以,我把测试程序汇总在一起.代码只是在屏幕上反复显示帧缓冲,尽可能快.
这些是我获得的结果,对于在32位视频模式下运行的32位数据 - 他们可能会让一些人感到惊讶:
- Direct3D (1): 500 fps
- Direct3D (2): 650 fps
- DirectDraw (3): 1100 fps
- DirectDraw (4): 800 fps
- GDI (SetDIBitsToDevice): 2000 fps
Run Code Online (Sandbox Code Playgroud)
鉴于这些数字:
以下是每个Direct*代码路径调用的简短摘要.如果有人知道使用DirectDraw/Direct3D的更有效方法,请发表评论.
1. CreateTexture(D3DUSAGE_DYNAMIC, D3DPOOL_DEFAULT);
LockRect(); memcpy(); UnlockRect(); DrawPrimitive()
2. CreateTexture(0, D3DPOOL_SYSTEMMEM); CreateTexture(0, D3DPOOL_DEFAULT);
LockRect(); memcpy(); UnlockRect(); UpdateTexture(); DrawPrimitive()
3. CreateSurface(); SetSurfaceDesc(lpSurface = &frameBuffer[0]);
memcpy(); primarySurface->Blt();
4. CreateSurface();
Lock(); memcpy(); Unlock(); primarySurface->Blt();
Run Code Online (Sandbox Code Playgroud) 我正在修改一个旧的Windows DirectDraw游戏.我已经创建了一个DirectDraw代理.它记录每个IDirectDraw和IDirectDrawSurface调用.一次通话后,backbuffer看起来像这样BltFast:

而像这样之前的下一个BltFast呼叫:

通过在任何呼叫之前和之后Lock复制后备缓冲器Unlock来转储这些图像BltFast.这两个BltFast调用之间没有其他IDirectDraw(Surface)调用,尤其是没有Lock/ Unlock调用.这怎么可能?
我正在开发一个应用程序,我有一个问题,我似乎无法找到解决方案.该应用程序是用vc ++编写的.我需要做的是显示一个YUV视频源,其上面有文字.
现在,通过使用GDI和DirectDraw叠加层上的视频在OnPaint方法中绘制文本,它可以正常工作.我需要摆脱叠加层,因为它会导致许多问题.它不适用于某些视频卡,vista,7等.
我无法找到一种以更兼容的方式完成同样事情的方法.我可以使用带有后台缓冲区的DirectDraw绘制视频,并将其复制到主缓冲区就好了.这里的问题是,由于视频刷新的次数,在GDI中绘制的文本会闪烁.我真的希望保持代码尽可能完整地绘制文本,因为它运作良好.
有没有办法将文本直接绘制到DirectDraw缓冲区或内存缓冲区或其他东西,然后将其blt到后台缓冲区?我应该一起看另一种方法吗?两个重要的操作系统是XP和7.如果有任何想法让我知道,我会测试它们.谢谢.
有人可以提供使用Direct2D处理像素的有效方法的示例吗?
例如,如何在渲染目标上交换所有绿色像素(RGB = 0x00FF00)和红色像素(RGB = 0xFF0000)?标准方法是什么?有可能ID2D1HwndRenderTarget用于此吗?在这里,我假设使用某种硬件加速.我应该为直接像素操作创建不同的对象吗?
使用DirectDraw我会BltFast在IDirectDrawSurface7with逻辑操作上使用方法.Direct2D有类似的东西吗?
另一个任务是动态生成复杂图像,其中每个点位置和颜色是数学函数的结果.为了举个例子,让我们简化一切并画出Y = X ^ 2.如何用Direct2D做到这一点?最终我需要绘制复杂的函数,但如果有人能给我一个简单的例子Y = X ^ 2.
我们正在维护一个使用DirectDraw的全屏256色图形模式的旧视频游戏.问题是,在后台运行的某些应用程序有时会在游戏运行时尝试更改系统调色板,这会导致图形损坏.
我们可以(有时)通过处理WM_PALETTECHANGED消息来检测何时发生这种情况.在几个更新版本之前,我们添加了日志记录(只记录窗口标题/类/进程名称),这有助于用户识别有问题的应用程序并关闭它们.MSN Live Messenger是一个常见的罪魁祸首.
当我们发现Windows Vista(和7)"单独"完成它时,问题变得更糟.WM_PALETTECHANGED参数指向CSRSS和桌面窗口.在Vista中,经常使用的解决方法是打开任何文件夹(计算机,文档等)并在运行游戏时保持打开状态.听起来很荒谬,但在大多数情况下都有效.在Windows 7中,甚至这种解决方法都不再适用.用户发现停止某些服务(Windows Update和索引服务)也解决了某些配置上的问题.
前段时间我刚开始尝试随机的东西,希望能找到解决方案.我发现在设置DirectDraw调色板(使用IDirectDrawPalette :: SetEntries)之前设置GDI调色板(使用Create/SelectPalette)会在调色板损坏后恢复调色板(WM_PALETTECHANGED处理程序).SetSystemPaletteUse并在主表面上调用SetPalette帮助了更多.然而,当应用程序试图窃取调色板时,仍然可以感觉到闪烁,这在渐变期间尤其突出.
问题:有没有办法获得一个"真正的"独家调色板,只要我们的游戏保持关注,完全不允许其他应用程序更改Windows调色板?
CachedBitmaps在GDIPlus中使用时,如果Windows视频"硬件加速"降低太多,则会出现图形损坏 - 这样会禁用DirectDraw:
硬件加速有六个级别:
如果禁用DirectDraw,则DrawCachedBitmap在GDI +中使用将导致图形损坏.DrawImage()如果没有启用DirectDraw ,我很容易使用较慢的API - 但我必须能够检测到DirectDraw被禁用.
我如何以编程方式检查是否启用了DirectDraw?
问题是:dxdiag如何做到这一点:

我正在写一个简单的游戏.我的图形代码每帧运行一次(大约每秒30次),并将RGB数据写入640*480 = 307200个条目的数组.
我创建了一个Win32窗口,其客户区域大小为640 x 480像素.在其他空窗口中显示我的RGB数据的最快方法是什么?
窗口需要每帧更新,所以我需要避免闪烁.我应该使用GDI吗?或者是否有更快的方法使用不同的库 - 比如DirectDraw?
编辑:
感谢所有的答复.首先,让我排除Direct2D作为选项 - 我需要支持Windows XP.其次,我有3D背景,所以Yann Ramin和Ben Voigtto建议的方法 - 使用Direct3D/OpenGL和单个纹理四边形 - 是我过去总是这样做的.
但是,我有兴趣了解2D API是否是更好的解决方案.由于没有明确的答案,我把测试程序汇总在一起.代码只是在屏幕上反复显示帧缓冲,尽可能快.
我已将结果发布为此后续问题的一部分.
昨天我找到了多年前在C++,Win32 API和DirectDraw 7中开发的我的俄罗斯方块游戏的源代码.我尝试构建解决方案但没有任何成功,因为最近的DirectX SDK(2010年6月)不包括DDraw.h和DDraw.lib更多.
是否有任何推荐的方法(希望通过示例)将代码从DirectDraw升级到更新的API?或者我应该只安装旧的DirectX SDK?
我正在创建一个窗口,WS_EX_LAYERED并使用它设置一个颜色键SetLayeredWindowAttributes().我可以通过在窗口FillRect()内部绘制一个简单的rect来验证这个颜色键确实在窗口中创建了一个透明的补丁.但是,当我使用DirectDraw在窗口中绘图时,这不起作用.我正在IDirectDrawSurface7窗口上创建一个Blt()像素.一些像素用颜色键着色,但我不认为它们是透明的,它们只出现在颜色键中.
DirectDraw表面中是否存在与分层窗口颜色键控冲突的内容?
当我使用设置alpha值时SetLayeredWindowAttributes(),它似乎与DirectDraw表面一起工作,它确实显得半透明.
如何在C#中将.dds纹理文件加载为图像?我能找到的谷歌没什么用处.
你给我的样本信息越多,我就越能理解它.
directdraw ×10
gdi ×4
directx ×3
winapi ×3
windows ×2
c# ×1
c++ ×1
dds-format ×1
direct2d ×1
directshow ×1
gdi+ ×1
gpu ×1
image ×1
palette ×1
rgb ×1
transparency ×1
windows-7 ×1
windows-xp ×1