📜  计算机图形中的刷新 CRT 和隔行扫描(1)

📅  最后修改于: 2023-12-03 15:28:02.450000             🧑  作者: Mango

计算机图形中的刷新 CRT 和隔行扫描

CRT

CRT (Cathode Ray Tube)是一种经典的显示器技术,它的工作原理是使用一个电子枪发射一束电子束,通过磁场控制这束电子在屏幕上移动,从而显示出各种图像。

在计算机图形中,CRT 的刷新率(单位为 Hz)指的是屏幕上的图像在一秒钟内被刷新的次数。通常情况下,刷新率越高图像看起来越流畅,因为人眼有一个持续感,如果刷新率过低,会看起来像屏幕在闪烁。

隔行扫描

隔行扫描是一种 CRT 的工作模式,在这种模式下,电子束并不是从上到下每个像素都扫描一遍,而是先扫描奇数行,再扫描偶数行。由于人眼对于图像的持续感,因此在刷新率一定的情况下,隔行扫描看起来与普通扫描没有什么区别,但是它能够减少 CRT 的带宽占用,因此在早期的 CRT 技术中比较常见。

怎么处理 CRT 和隔行扫描

在计算机程序中,处理 CRT 和隔行扫描需要注意的是,我们需要根据屏幕的刷新率来计算出每帧的时间,进而计算出帧和帧之间的时间差,从而使得图像的流畅度得以保证。

在OpenGL中,处理 CRT 和隔行扫描可以使用以下代码片段:

// 设置屏幕的刷新率
const int refresh_rate = 60;

// 计算每帧的时间间隔
const double frame_time = 1.0 / refresh_rate;

// 每一帧的主渲染函数
void render_frame() {
    // 获取当前帧的时间戳
    const auto current_time = std::chrono::high_resolution_clock::now();

    // 计算与上一帧的时间差
    const double delta_time =
        std::chrono::duration_cast<std::chrono::duration<double>>(
            current_time - last_frame_time).count();

    // 渲染当前帧
    // ...

    // 判断是否需要等待下一帧
    while (delta_time < frame_time) {
        // 获取此时的时间戳
        const auto wait_start = std::chrono::high_resolution_clock::now();

        // 等待一段时间
        std::this_thread::sleep_until(wait_start + std::chrono::duration<double>(frame_time - delta_time));

        // 重新计算时间差
        delta_time =
            std::chrono::duration_cast<std::chrono::duration<double>>(
                std::chrono::high_resolution_clock::now() - last_frame_time).count();
    }

    last_frame_time = current_time;
}

上面的代码片段中,我们使用了一个主渲染循环来维护屏幕的刷新率。在每一帧开始的时候,我们获取当前帧的时间戳,然后计算与上一帧的时间差。如果这个时间差小于每帧应该用时的时间,我们就等待一段时间。这个时间的长度就是两帧之间的时间差减去当前帧已经用掉的时间。这样,我们就能够在一定程度上模拟 CRT 的刷新率和隔行扫描的效果了。

总结

本文我们介绍了计算机图形中的 CRT 和隔行扫描技术,着重介绍了如何在计算机程序中处理 CRT 和隔行扫描。虽然 CRT 已经不再是常见的显示器技术,但是它的工作原理仍然对于理解计算机图形有一定的帮助。