2

私は最近ちょっとした curses ゲームを書きましたが、動作するために必要なのはタイマー メカニズムと curses の実装だけなので、DOS 用にビルドしてみるというアイデアは自然に思い浮かびます。curses はpdcursesfor DOS によって提供されます。

POSIX と Win32 では既にタイミングが異なるため、次のインターフェイスを定義しました。

#ifndef CSNAKE_TICKER_H
#define CSNAKE_TICKER_H

void ticker_init(void);
void ticker_done(void);

void ticker_start(int msec);
void ticker_stop(void);
void ticker_wait(void);

#endif

ゲームは、ティックが必要になるとすぐにミリ秒間隔でticker_init()and をticker_done()1 回呼び出し、メイン ループで次のティックを待機します。ticker_start()ticker_wait()

DOS で POSIX プラットフォームと同じ実装を使用するとsetitimer()、 が機能しませんでした。理由の 1 つは、djgpp に付属する C lib が を実装していないことwaitsig()です。そこで、DOS 用のインターフェースの新しい実装を作成しました。

#undef __STRICT_ANSI__
#include <time.h>

uclock_t tick;
uclock_t nextTick;
uclock_t tickTime;

void
ticker_init(void)
{
}

void
ticker_done(void)
{
}

void
ticker_start(int msec)
{
    tickTime = msec * UCLOCKS_PER_SEC / 1000;
    tick = uclock();
    nextTick = tick + tickTime;
}

void
ticker_stop()
{
}

void
ticker_wait(void)
{
    while ((tick = uclock()) < nextTick);
    nextTick = tick + tickTime;
}

これは魅力のように機能しdosboxます (私は現在、実際の DOS システムを持っていません)。しかし、私の懸念は次のとおりです。このプラットフォームでできる最善のことは本当に待っていることですか? CPUが少なくともいくらかのエネルギーを節約できるようにするソリューションが欲しいです。

参考までに全ソースを載せておきます

4

1 に答える 1