@weather 晴時々曇 @title あさ〜 @category 生活 @s 0530充電開始、1230再起動。 @title 垂直・水平同期処理の話 @category PC @s ついったでの話の流れから、垂直・水平同期処理を語ることに。 @ul
  • togetter:垂直・水平同期処理の話 @s 自分の分は以下の通り。 @close

    今だと意識しなければいけないシーンはそうそうないが、CRTコントローラが扱うレジスタやメモリをCPUから触るときは「いまCRTが画面上のどこを走査しているか」を把握しなければならない時代があった

    最も基本的なこととして、CRTは「1つの点が左から右、上から下に動きながら輝度を変えることで面を表現する」ことを知っておく必要がある。画面制御系のレジスタやメモリ内容をCRTへの信号に変えるのがCRTコントローラの役目

    最初期は「画面走査中にCRT系のレジスタやメモリに触るとCRT制御に影響が出てノイズになる」ので「画面走査中はアクセスできないようにハード的に処理する」とか「CPUアクセス時は画面走査そのものを止める」とかだった

    少し進むと、「CRTが画面走査中でも適宜CPUが書き込めるように配慮する」ようになり、また「画面走査中でない」ことをCPUで監視できるようにすることで高速転送が可能に。「監視しなくてもいいようにCPU割り込みをかけられる」ものも

    「1つの点が左から右、上から下に動きながら面を描く」ということは、その点が右端へ到達したら左端へ戻す必要があり、下端に到達したら上端に戻す必要がある。これにかかる期間を帰線期間といい、それぞれ水平帰線期間・垂直帰線期間という

    ゲームは高速大量に画面処理を行う必要があるので、帰線期間、それも比較的長い「垂直帰線期間」にまとめてアクセスすることが重要になる。また監視にCPUを割くのがもったいないので割り込みが重宝される。これが垂直同期(VSYNC)処理

    もちろん、水平帰線期間も有効に使おうという考えはあり、同様に水平同期(HSYNC)処理といわれた。ただ、当時のCPUは性能が低くあまりできることがないと考えたのか実装はそれほど多くはなかった

    HSYNCが検出できるようになると、「任意の水平帰線期間でCRTコントローラが扱うレジスタやメモリを書き換える」ことで、静的な表示では不可能だった表現を行うようになる。これがラスター処理といわれるもの

    HSYNCを検出できないハードは珍しくなかったが、「CRTCがスプライトを描画するときに重なりがあったら割り込みを発する」機能を代替で使ったり、「VSYNCからの経過時間」をポーリングor割り込みで検出して代替することもあった

    HSYNC処理でできることは「スクロールレジスタの書き換え」だけに留まらず、スプライト座標やパレットカラーの書き換え、CGの書き換え、画面の色モードや解像度の書き換えなど多岐に渡る

    うねうね系のスクロールレジスタ変更は使いやすくてインパクトがあったのでよく使われ、ついにはラスター毎のスクロールレジスタまで持つに到ったと

    このへんまでがラインバッファ系の画面表示のしくみで、フレームバッファ系の画面表示になるとこの手の知識はほぼ不要、せいぜい「VSYNCでバッファのフリップを行う」ことくらいしか知らなくてよくなる

    ただ、フレームバッファ方式でも「1つのバッファをフリップさせず常に表示させ続け、垂直帰線期間に入ったらバッファの更新を始める」やり方もある

    更新が間に合わないと画面が崩れるが、間に合うなら「ラインバッファ方式と同等のレイテンシで描画できる」利点があり、昨日TLに出ていたダブルバッファ方式のレイテンシの欠点はなくなる話につながる、と

    @title かけん迎撃 @category イベント @s 夕方から新宿まさみやで、出張できていたかけんを迎撃。途中から塩兄も参戦。