对GDI的感觉感到困惑[关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对GDI的感觉感到困惑[关闭]相关的知识,希望对你有一定的参考价值。

几年前我开始学习Windows编程,而且我总是只使用“本机”环境来满足我的需求。我的意思是,我只使用Winapi编写代码,而不是DirectX Draw 2D etc用于图形,而不是用于音乐或其他任何外部库,只有Winapi。我正在研究上次到期的图形渲染的下一个演变步骤。以前的算法很好,它们只重绘应该重绘的部分窗口,并且它适用于不是全屏幕的窗口。但是当我使用全屏幕时,我的fps非常小。

所以,很少有几个月前,我明白,我可以制作一个全新的算法:而不是在WM_PAINT中绘制,每次重新创建dc'c,位图,我都可以运行一个并行线程,在永久循环中重绘, dc'c和bitmaps只创建一次+我甚至不能使用Gaz或Gdi +函数,如RectangleGraphics::FillRect,但写我自己的更快的函数。所以我做到了。我得到了什么:

62 fps,1920 1080,没有任何图形负载

为什么?

这只是这段代码

void render()
{
COLORREF *matrix;

matrix = re->GetMatrix();

while (1)
{
    Sleep(1000 / 120);

    re->Render();

    //below goes fps counter, that counts in another thread
    while (!mu.try_lock())
    {

    }

    frames++;
    mu.unlock();
}
}

re->渲染功能

inline void Card::Render()
{
//SetDIBits(hdcc, bm, 0, bi.bmiHeader.biHeight, matrix, &bi, DIB_RGB_COLORS);
//StretchBlt(hdc, 0, 0, width, height, hdcc, 0, 0, width, height, SRCCOPY);
//method above with Stretch or just BitBlt is awfull at all

SetDIBitsToDevice(hdc, 0, 0, width, height, 0, 0, 0, bi.bmiHeader.biHeight, matrix, &bi, DIB_RGB_COLORS);//hdc is a surface dc, not memory
}

因此,如果我理解得很好,那就是最大的,可以从Gdi中获取。如果我是对的,问题是 - Gdi的意义是什么?计算机游戏是在Direct 2D上开发的,然后是DirectX OpenGL,用户界面,在NT 8不是窗口之前,并且(或)使用DirectDraw。我很困惑,是不是真的要写好的软件渲染不使用任何库,只是你自己?

答案

部分问题在于:

Sleep(1000 / 120);

出现8毫秒(整数除法后)。但睡眠并不是一种非常精确的计时机制。它将至少睡眠指定的时间。并且,使用默认时钟滴答速率,在大多数配置中它将至少休眠15.6 ms。 15.6 ms的帧持续时间非常接近每秒62帧,因此这可能是根本问题。

除此之外,您将遇到GDI问题,因为图形操作主要在系统内存中执行,然后必须将其传输到图形内存。在更高的分辨率下,根据所使用的硬件,以高帧速率执行此操作可能很困难。

另一答案

我不确定我理解你的问题,但这是我最好的猜测。

我可以运行并行线程

GDI不是一个好主意。 WinAPI可以进行多线程处理,但使用正确很棘手,请参阅此文章:https://msdn.microsoft.com/en-us/library/ms810439.aspx

62 fps,1920 1080,没有任何图形负载。为什么?

GDI不是为您想要的高FPS用例而设计的。它被设计用于在发生变化时重绘东西。它是在现代GPU之前设计的。

在现代硬件上,获得高FPS和/或低延迟渲染的方法是使用以GPU为中心的技术。在C ++中,这是Direct3D和Direct2D。

是不是真的要写好的软件渲染不使用任何库

当然有可能。只是不是你试图用SetDIBitsToDevice做的方式。

在现代硬件+操作系统上,您的API调用(无论API是什么)将成为发送到3D GPU的命令。这就是为什么像D3D和D2D这样的以GPU为中心的新API经常提供更好的性能。

如果你想实现一个很好的软件渲染,请记住你必须将结果上传到GPU纹理。在现代Windows上,WinAPI就是这样做的。

旧版Windows(即Vista之前的任何东西)都没有依赖GPU。但游戏也没有使用GDI,他们使用DirectX 9,DirectDraw等...

以上是关于对GDI的感觉感到困惑[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

对代码中的类结构感到困惑[关闭]

对为啥我的 PHP 包含不起作用感到困惑 [关闭]

对同步适配器、服务、加载程序、提供程序和异步任务感到困惑? [关闭]

基于时间复杂度的这些片段真的很困惑

当我编写诸如 short a = 1;a=a (short)1; 之类的代码时,我对错误感到困惑[关闭]

对启动模式感到困惑