【问题标题】:Confused about the sense of GDI at all [closed]完全对GDI的感觉感到困惑[关闭]
【发布时间】:2018-08-11 20:05:00
【问题描述】:

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

所以,几个月前,我明白,我可以创建一个全新的算法:每次重新创建 dc'c、位图时,我都可以运行一个并行线程,而不是在 WM_PAINT 中绘制,我可以运行一个并行线程,其中永恒循环重绘,dc'c 和位图只创建一次 + 我什至不能使用 Gdi 或 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。我很迷茫,真的是自己写好的软件渲染不使用任何库吗?

【问题讨论】:

  • GDI 用于应用程序,而不是游戏。
  • @LightnessRacesinOrbit,哈哈,不,我只是想自己创造一些东西。而且我注意到,很多人也遇到过这个问题
  • @Anders,我认为它是用于图形的..
  • 你在拖钓吗?你肯定知道 GDI 早于 DirectX/opengl
  • GDI 只是微软为 Windows 创建的第一个图形库。追溯到 1987 年和 Windows 版本 2。DirectX 于 1995 年发布,其目的是让游戏作者从 DOS 切换并避免 OpenGL 的强大要求。也是视频硬件发展非常迅速的时候。

标签: c++ winapi graphics gdi


【解决方案1】:

部分问题出在这里:

Sleep(1000 / 120);

为 8 毫秒(整数除法后)。但是 Sleep 并不是一个非常精确的计时机制。它将休眠至少指定的时间。并且,在默认时钟滴答率下,在大多数配置下它将休眠至少 15.6 毫秒。 15.6 毫秒的帧持续时间非常接近每秒 62 帧,所以这可能是根本问题。

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

【讨论】:

    【解决方案2】:

    我不确定我是否理解您的问题,但这是我的最佳猜测。

    我可以运行并行线程

    对于 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 等……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-04
      • 2012-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多