SDL-旧的CRT扫描线不浪费CPU时间

问题描述

我想模拟旧的CRT扫描线,但是我找不到一种方法可以只创建一次扫描线层,以避免浪费每个主循环周期的cpu时间。

基本上,在我的游戏中,我在主循环周期中有这段代码

createTExture();

SDL_RenderClear(windoWrenderer);

SDL_Rendercopy(windoWrenderer,gameFrameTexture,&sourceRectangle,&destinationRectangle);

// Scanlines
if (scanlines)
{
    for (i = 0; i < destinationRectangle.h; i += 3)
    {
        SDL_RenderDrawLine(windoWrenderer,destinationRectangle.x,destinationRectangle.y + i,destinationRectangle.x + destinationRectangle.w,destinationRectangle.y + i);
    }
}

SDL_RenderPresent(windoWrenderer);

使用for的{​​{1}}周期为每3条线创建一条扫描线,并且输出非常好,但是...在cpu性能低的硬件上它很慢。

因此,我尝试将SDL_RenderDrawLine()与2种纹理和透明度SDL_Setrendertarget()gameFrameTexture一起使用,直接在纹理上创建扫描线,并使用scanlinesTexture两种渲染框架时间以正确的顺序。但是通过这种方式,当SDL_Rendercopy()SDL_Rendercopy()sourceRectangle之间执行复制时,扫描线会被拉伸(因为纹理没有游戏窗口的尺寸),因此输出很大时非常难看(就高度而言)扫描线。

是否可以在认渲染器的窗口上仅一次创建扫描线?

解决方

正如我之前尝试的那样,正确的方法是使用2种纹理,一种用于扫描线,另一种用于游戏框架。 但是...扫描线纹理必须具有最终分辨率(窗口或全屏),以避免拉伸。

重要的是用destinationRectangle为纹理设置SDL_BLENDMODE_BLEND,并用alpha(透明度)值设置SDL_SetTextureBlendMode()。这样,所有绘制操作都将使用这种颜色(即扫描线将变为黑色,透明度很少)

解决方法

但是以这种方式延长了扫描线...(因为纹理没有游戏窗口的尺寸)

在知道分辨率后立即动态创建纹理,然后将其应用到建议的解决方案中(两次复制到渲染目标,但有些不透明)。