Articles of direct2d

如何将内存中加载的图像文件转换为C ++中的ID2D1Bitmap

我试图将一个图像文件(一个PNG,但可能是任何东西),我刚刚从一个压缩文件提取到内存中的一个ID2D1Bitmap使用Direct 2D进行绘制。 我试图寻找一些文档,但我只能find接收“const char *path”的方法,或者问我的图像的宽度和高度,以前我不知道。 在谷歌search它让我无处。 该文件在内存中是原始的,我想避免将图像提取到一个临时文件只是为了从那里读取他们的数据。 有任何想法吗?

Windows成像组件 – Direct2D C ++ – 绘图,保存

使用Windows映像组件(WIC),我想为我的Windows桌面应用程序(Direct2D / C ++与Windows 7 SP1 – Visual Studio 2013) select任何types的RenderTarget(Direct2D Hwnd / Bitmap / WICBitmap – 等)进行绘制 创build一个空的位图(D2D1Bitmap或IWICBitmap – 无论哪个适用) 开始绘制 – 填充颜色,绘制一些线条和椭圆 – 结束绘制==>(全部在位图中) 在某些时候,我需要将绘制的内容保存在位图中作为我的电脑中的图像 将位图放在渲染目标的x1,y1(左上angular的xy坐标)和x2,y2(右下angular的xy坐标)中。 因为窗口的其余部分将被工具栏使用。 我如何使用C ++ / Direct2D来实现这一目标? GDI +我的function代码: Bitmap* pBmp = NULL; //create null or empty bitmap Graphics* pGrBuf = NULL; //initialise graphics to null pBmp = new […]

什么是WIC位图处理最有效的像素格式?

我正在尝试使用Direct2D和WIC位图来制作简单的video播放器。 它需要YUV像素格式帧数据的快速和CPU经济绘图(带有拉伸)。 我已经用GDI进行了testing。 我希望切换到Direct2D至less提供10倍的性能增益(较小的CPU开销)。 我会做的基本上如下所示: 创build一个空的WIC位图A(用于绘制canvas) 用YUV帧数据(格式转换)创build另一个WIC位图B 将位图B绘制到A上,然后将A绘制到D2D渲染目标上 对于1,2步,我必须select一个像素格式。 WIC本机像素格式 有一个MSDN页面build议WICPixelFormat32bppPBGRA 。 http://msdn.microsoft.com/en-us/library/windows/desktop/hh780393(v=vs.85).aspx 有什么区别WICPixelFormat32bppPBGRA和WICPixelFormat32bppBGRA ? (前者有附加P) 如果WICPixelFormat32bppPBGRA是要走的路,情况总是如此吗? 无论硬件和/或configuration? 实际上WIC位图处理最有效的像素格式是什么?

Windows StretchBlt API性能

我定时了使用多个StretchBlt和StretchDIBits调用的DDB绘图操作。 而且我发现,完成的时间与目标窗口大小成比例地增加/减less。 900×600窗口大约需要5ms,但1920×1080需要55ms(源图像是1280×640)。 看起来Stretch .. APIs不使用任何硬件加速function。 源图像(实际上这是临时绘图canvas)是用CreateDIBSection创build的,因为我需要绘制每个帧的结果(拉伸和合并)位图的像素数据 。 我们假设,Windows GDI是无望的。 那么有希望的select是什么? 我用WIC方法考虑了D3D,D2D(写入WIC位图并用D2D绘制,然后从WIC位图读回像素数据)。 我计划用WIC方法尝试D2D,因为我很快就需要使用大量的文本绘图function。 但是WIC似乎并不那么有希望: WIC位图处理最有效的像素格式是什么?

在Windows中平滑调整窗口大小(使用Direct2D 1.1)?

它让我感到困扰,Windows中调整窗口的大小不像我想要的那样“顺利”(这是Windows程序的一般情况,不仅仅是我自己的情况,Visual Studio就是一个很好的例子)。 它使操作系统及其程序感觉“脆弱”和“便宜”(是的,我关心程序和用户界面的感受 ,同样关心关门的声音和感觉,这是构build质量),这在我看来影响了整体用户体验,最终影响了品牌。 重新调整窗口内容简直跟不上鼠标的移动。 无论何时调整窗口大小,都会产生“口吃”/“闪烁”效果,这是因为在新的resize的内容被绘制之前,窗口的先前大小的内容被重新绘制在新的resize的窗口框架中。 我正在构build一个使用Direct2D 1.1绘制其UI的Win32应用程序(x64),并且考虑到Direct2D的速度,我认为在2014年应该没有必要在操作系统中遭受这种工件。我自己在Windows 8.1上, Windows 7和这个应用程序。 当最大化一个小窗口时,“以前的大小”效果是特别明显的(因为窗口大小的差异足够大以便容易地将在较大窗口的左上angular闪烁的旧内容的图像与新内容随后被涂在它上面)。 这似乎正在发生: (比方说,屏幕上有一个完全呈现的窗口,大小为500 x 500像素)。 我最大化的窗口: 窗框被最大化 旧的500 x 500内容在新框架中绘制,之前.. ..最大化的窗口重新绘制与适当大小的内容。 我想知道是否有任何方法来缓解这个问题(例如,通过拦截Windows消息),并避免在最终重新呈现之前用新内容重新绘制窗口。新的内容发生。 这就像Windows重新绘制自己的窗口,使用任何已经可用的graphics,在使用WM_PAINT消息或类似消息来请求我提供更新的内容之前,麻烦了。 可以这样做吗? 编辑:似乎 WM_WINDOWPOSCHANGING / WM_SIZING 提供了“早期访问”新的大小数据,但我还没有设法抑制旧内容的绘画。 我的WndProc看起来像这样: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_ERASEBKGND: return 1; case WM_PAINT: PAINTSTRUCT ps; BeginPaint(hWnd, &ps); […]

Direct2D中的multithreading

我正在尝试创build一个简单的D2D游戏引擎(它至less必须能够在窗口中显示和移动图像),并且一切正常,直到决定切换到multithreading版本。 我阅读这篇 MSDN文章,并build议从多个线程使用一个multithreading工厂。 但是这篇文章声称,有几个单线程工厂会更有效率(尽pipe本文描述了服务器端渲染场景,原理与我的情况相同,我错了吗?)。 当我尝试使用单线程工厂的方法时,所有的图像都被显示和移动,但是有可怕的闪烁。 在我的WM_PAINT处理程序,我试图做这样的事情: for (CSingleThreadEngine *pElSingleThreadEngine : m_SingleThreadEngines) //each CSingleThreadEngine instance has its own D2D factory and an image collection pElSingleThreadEngine->Draw(); 和pElSingleThreadEngine-> Draw()是这样画的: m_pRenderTarget->BeginDraw(); m_pRenderTarget->SetTransform(D2D1::Matrix3x2F::Identity()); m_pRenderTarget->Clear(D2D1::ColorF(D2D1::ColorF::White)); for (CGameImage *pImage : m_GameImages) { if (FAILED(pImage->Draw())) throw runtime_error("An object cannot be drawn"); } m_pRenderTarget->EndDraw(); 我认为这里的错误是只有一个窗口有几个ID2D1HwndRenderTarget实例,因为如果我在单独的窗口中绘制每个线程,它就可以工作。 但是我只想在一个窗口中绘制,而且我无法避免为此使用多个ID2D1HwndRenderTarget实例。 所以我的问题是: 创buildmultithreadingDirect2D应用程序的最佳做法是什么? 如果我正在使用的方法是正确的,我在做什么错了,我该如何解决? 任何帮助将不胜感激。