先日の日記の続き。
『Parallel force - パラレル・フォース』を X-Window 環境へ移植しています。子供の相手をしながらなので休日の割に歩みが遅いですが、ぼちぼちやってます。
タイマー処理
やりたいことは ms 精度のスリープと、ms 精度の時間カウンタ取得だけですので、簡単に下記のようにまとめました。
inline void sleep(const std::uint32_t iTime) { const auto aSec = iTime / 1000; const auto aMsec = iTime - aSec * 1000; timeval aTime; aTime.tv_sec = aSec; aTime.tv_usec = aMsec * 1000; select(0, nullptr, nullptr, nullptr, &aTime); } inline const std::uint32_t getTime() { timeval aTime; gettimeofday(&aTime, nullptr); return aTime.tv_sec * 1000 + aTime.tv_usec / 1000; }
でもなんだろう。動かしてみると、Win32API の timeGetTime API と比べてちょっとタイマー精度があまりよろしくないような。んー。気のせいで済ませていいレベルか?後で詰めよう。
プロセッサ情報の取得
並列処理に際してプロセッサ数を取得する必要があり、下記のようにプロセッサ情報を標準出力するワンライナーをパイプでつなげることで対処しました。
inline const std::uint32_t getProcessors() { auto aProcessors = 0; // プロセッサ数取得 if (auto aPipe = popen("egrep -c \"^processor\\s:\\s[0-9]+$\" /proc/cpuinfo", "r")) { char aStr[512]; if (std::fgets(aStr, sizeof(aStr), aPipe)) { aProcessors = std::atoi(aStr); } pclose(aPipe); } // エラー処理 if (aProcessors == 0) { aProcessors = 1; } return aProcessors; }
ここまでの対応で Cygwin/X 環境であればとりあえず動いています。Linux 動作に向けた対応は、残すところフォント処理だけとなりました。ちょっとハードルがありそうな気がしていますが、んー。FreeType 2 を調べてみるか。
―――ソース公開も検討した方が良いかなぁ。と、ちょっと考えてます。一人でこつこつやるのも良いけれど、別の道を模索することも必要かな。とか。