【发布时间】:2018-08-11 20:05:00
【问题描述】:
几年前我开始学习 Windows 编程,我总是只使用“本机”环境来满足我的需要。我的意思是,我只使用 Winapi 编写代码,而不是 DirectX\Draw\2D\etc 用于图形,没有任何用于音乐或其他东西的外部库,仅使用 Winapi。我正在处理我的图形渲染的下一个演变步骤,这是上次到期的。以前的算法很好,它们只重绘应该重绘的部分窗口,并且它适用于非全屏窗口。但是当我使用全屏案例时,我的 fps 非常小。
所以,几个月前,我明白,我可以创建一个全新的算法:每次重新创建 dc'c、位图时,我都可以运行一个并行线程,而不是在 WM_PAINT 中绘制,我可以运行一个并行线程,其中永恒循环重绘,dc'c 和位图只创建一次 + 我什至不能使用 Gdi 或 Gdi+ 函数,如 Rectangle、Graphics::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 的强大要求。也是视频硬件发展非常迅速的时候。