コンパイルでターゲットx86とx86-64での最適化の違い

かつてのIntel(及び互換)CPU命令セットx86(32bit)と、それを64bitに拡張した現在一般的にPCで使われている命令セットx86-64で、同じC・C++ソースコードからそれぞれ最適化設定を有効にしてコンパイルをかけてもネイティブなlong long(64bit)型の演算、標準で定義されているSIMDの有効化、増加したレジスタ分に関連した最適化のみ行われると思っていたし、ググったりCopliotに聞いてもそのような回答が出てくるのだけど、実際に確認してみたら(コンパイラにもよるだろうが)インライン・ループ展開も積極的に行うようだった。

まあ今更、新規にPC向けのプログラムでx86にして組むことはかなり稀とも思うんで完全に無駄知識だとは思う。

でも今時のコンパイラはこういう最適化は普通にやっているので、古いTipsを参考にして、わざわざ人間がループ展開したり独自転送関数を作る必要性はないというという参考にはなるかも。

 

まずはテストに使うCコードはこれ

RGBAのビットマップに16*16サイズのアイコン画像をそのまま貼り付けるようなものだ。X一列分16ドット(*RGBAなので4)は(std::)memcpy関数で一気に貼り付け、それをfor文で16回ループするというもの。

 

これをx64、最適化オプション/O2でMSVCを使いコンパイルすると以下のようなアセンブラで出力される。(長すぎるのでアセンブラの最初と最後だけ)

アセンブラがわからない人に説明すると、転送が16バイト(128bit)の倍数ということでmovupsという128bit単位でメモリ転送を行うSSE命令を使ってメモリ→レジスタレジスタ→メモリで2命令を64回、計128命令並べて完全にループ展開されている。for文が消えてmemcpy・ポインタ更新を16回並べたコードと同一になっている。

 

 

そして上記の同じソースコード・同じコンパイラ・同じ最適化オプションでターゲットのみをx86に切り替えて出力されるアセンブラがこちら

こちらのコードではかなり短くなって一画像に収まる長さだが、memcpy・ポインタ更新の部分がmovupsを2*4命令使って(16バイト*4命令)いるものの、素直に16回ループ(レジスタedxの値をsub命令で1づつ減少させて0になっていなければjne命令で先頭に戻る)させている。SIMD命令を使ったり条件判定をソースコードから逆にしているとはいえ率直にソースコードアセンブラ化したというようなもの

 

何故にこのような差異が発生するのか推測になるが、x86-64のほうが扱えるCPUの世代が新しく大容量のキャッシュメモリを備えていたりプリフェッチも増強されているCPUの可能性が高いので、命令数が増えてプログラムサイズが増大したとしても積極的に展開したほうが高速になりやすい傾向があると判断されているのか、また今更x86を指定してコンパイルする環境ではその逆になっていると判断されているのか、x86向けのコンパイラへの保守が使用頻度の問題でおろそかになっているといったところなのかもしれない。

 

 

ちなみに、元のソースコードでmemcpyではなくfor文と配列参照で代入する形にしてx64・/O2でコンパイルすると

64バイト分展開されているとはいえSIMD命令は使われず単純にmov命令で1バイトづつ転送、しかも結局16回ループ処理が発生するという中途半端な最適化になっている。128回転送命令を並べるとして流石にそれ以上は長すぎるのだろう

他のサイトでも記載されている話ではあるが、標準関数のmemcpyは転送バイト数が16バイト単位であれば率直にSIMD命令に置き替えられる可能性が高くなるので、代用memcpyを自作するとか、char型をint(long long)型にして転送するとかややこしいことはせず、アライメントや転送バイト数だけ意識していったほうがいい。

X68000の同人縦スクロールシューティング「超連射68K」Ver 1.10のWindows版が公開される

ふぁみべのよっしん氏が1995年にX68000用に出した縦スクロールシューティング「超連射68K」Ver 1.10のWindows版が公式サイトにて遂に公開された。

超連射68K 公式サイト

今回のVer1.10では前バージョンから一部グラフィック・効果音の一新、背景がステージ・ボス毎に変化、エンディングの追加といった要素が変更点。

元々はX68000のミニ機「X68000Z」の付属としてリリース、その後X68000エミュレータ用にディスクイメージは公開されていたので、エミュレータ(BIOSは公式で公開されているので合法的に遊べる)を介して動かすことも可能ではあったが、やはりネイティブアプリでの起動の方が手間が少なく遊ぶ敷居が低くなるので手に取りやすくなる。

 

最大128枚しかスプライトを表示させられないX68000でスプライトダブラーと言われる画面描画の途中で再度スプライトの表示設定を行うことで表示枚数を増加させるテクニックを使用し、ハードの限界を超え古臭さを感じさせないド派手な演出、東亜プランリスペクトなゲーム内容、耳に残る音楽やSE、そしてゲームタイトルからはボタン連打が必須かと思われるかもしれないが、実際はショットはセミオート入力仕様(このWindows版ではフルオート設定にも切り替え可)で、ボタンを1回押せば数発は自動連射が行われ一定間隔で押していけば常時連射がされるように調整されており、押しっぱなしによる味気無さや逆に連打で疲れるといった両極端なことが発生せず、適度に「自分でショットを放出させている」という感覚を味わえる超連射ならではの独自の気持ちよさ。90年中期の同人作品、現在ではフリーで公開されているとはいえ、今なお圧倒的なクオリティを誇っている。

 

 

 

もちろんSteam Deckでもプレイ可能だ。いつでも、どこでも超連射

ゲームアップデート容量のギネス記録

S.T.A.L.K.E.R. 2: Heart of Chornobyl」の今年最後となる1.1.3パッチが配信されたけど、

なんかSteamのアップデート容量だと110.6GB要求されたんだが。もうゲーム丸ごとやん。

流石に「嘘やろ・・・」って呟いてしまった。何かの間違いだろう、Steamクライアントのバグだよね?と思って一旦Steamを再起動してみたが、正常(?)に110GB分のダウンロードが始まりアップデートが完了したのは1時間後であった。

まあ、ちょっとバグが多かったのと「インディ・ジョーンズ 大いなる円環」と「風来のシレン6」がSteamで配信されたのでそちらを先に遊んでいて、積んでいたのもあって起動していなかったから適用していなかったアップデートが蓄積して適用されたのだろうけど、それにしてもどんだけだ。「ゲームアップデートの容量」としてギネス申請したら速攻で受理されそう。

Steamアカウントハック、ベータテスト参加招待を装う詐欺の事例。

チームへの投票をお願いするものや、誤ったチーター報告と称してDiscord経由でValve社員に連絡を取るように勧めるといったSteamアカウントハックの手口の数々。

ここ数日また別の手口が出てきているようなので事例を紹介しておく。

今度はベータテスト参加招待といって参加申請URLが貼られるチャットが飛んでくるが、もちろんこれも詐欺のようだ。

自分の場合は「DOOM: The Dark Ages」のベータテスト招待が送られてきて、いつもとは違う雰囲気だったことと、その時眠かったのでうっかりURLを踏んでしまったが、絶対に開かないように。公式情報を調べてもそのようなベータテストをやっている情報はないし、Steamコミュニティでも注意が呼びかけられている。

Steamコミュニティ DOOM The Dark Ages 掲示板 「Playtest scamlink. Becareful.」

 

上画像のように「steamcommunity.」と公式かのようなURLでも「playtestinvitedgame.」の部分はSteamとは無関係なサイトを表している。

 

念のため、確実に公式経由だとわかるSteamクライアントから左上の「Steam」メニュー→「設定」→「セキュリティ」タブ→パスワードの変更後に認証済みのデバイスをすべて解除したが、最悪の場合アカウントが乗っ取られた後にチート行為を行われアカウントがBAN対象になってしまうことも考えられる。

ニンジャなら無料 「Warframe」前日譚にあたるTPS「Dark Sector」がSteamで無料配布中。

ウィルスに侵された東欧の街ラスニアを舞台に、右腕が異形化しブーメランの様な武器「グレイヴ」を駆使して敵を切り刻むTPS「Dark Sector」のSteam版が12月1日午前2時までの期間限定で無料配布されている。一度Steamアカウントに登録すれば半永久的にプレイ&再ダウンロード可能。

日本ではPS3Xbox 360向けに日本語版が発売されていた2008年製のタイトルで、PC版は今までおま国になっていたが今回の無料配布に合わせて解除がなされた。ただし、解除されたのみで日本語には非対応、また日本語化Modなども現時点で存在しないようなので注意。

Dark Sector」の開発元「Digital Extremes」社は現在ではあの「Warframe」の運営元と知られている会社で、今作はそのWarframeの時代から遠い過去の話となっている。

Warframe Wiki ~物語と歴史~ ※ネタバレあり

 

元が2008年製ということで現在のPC環境だと若干問題が生じる挙動があるようなので注意。

アスペクト比が4:3のままだったり、ゲーム内オプションから解像度を変更しようとすると動作が固まるという問題があるが、該当する人はSteamライブラリから

Dark Sector」を右クリック→「管理」→「ローカルファイルを閲覧」→Configsフォルダ内のDS.cfgを任意のテキストエディタで開き

Graphics.DisplayAspectRatio=FullScreen4x3

という記述を追記

Graphics.FullScreenSizeX=1920
Graphics.FullScreenSizeY=1080

と画面解像度の数値を変更しよう。4K解像度になるかと3840・2160も試したが、自分の環境ではうまくいかなかったので1080p推奨。

 

また音声が出ない場合はゲーム内の「options」から「audio」を開き全てのバーを左側まで変更(バーが白い状態となるはず)、英語ではあるものの字幕表示が欲しい人は「display」内の「SUBTITLES」にチェックを入れよう。

 

名作FPS「Half-Life 2」が発売20周年を記念して無料配布中、EP1・EP2との統合、ワークショップ対応などのアップデートも

前作でブラックメサ研究所の実験事故により異世界Xenとのポータルが開き、Xenの生命体が地球を侵食した世界を舞台に、主人公ゴードン・フリーマンが管理社会を統括するブリーンを倒すためレジスタンスと共に戦いに身を投じていくFPS「Half-Lif 2」(HL2)がこの週末の間、日本時間19日午前3時までの期間限定で無料配布されている。日本語字幕対応、一度Steamアカウントに登録すれば半永久的に再ダウンロード&プレイ可能

入手方法はSteamアカウントにログインした状態でHalf-Life 2のストアページに行き、「Half-Life 2をもらう」の項目にある「アカウントに追加」ボタンを押せば完了。

 

日本語字幕を表示する場合は、メニューの「設定」→「オーディオ」タブより「キャプションあり」で「クローズドキャプション(効果音にも擬音表記が出る)」「字幕(会話のみ)」のどちらかを選べば表示される。

 

更にゲーム自体にも各種アップデートも行われ、

  • 続編となる「Episode 1」「Episode 2」(EP 1・2)も一緒に収録。タイトルメニューから切り替え可能
  • 開発者コメンタリーの追加。「EP 1・2」には既にあったが本編には今までなかった。
  • Steamワークショップへの対応。人気作、作成が容易ということでModが豊富にあるHL2だが、これで導入自体も容易となる。
  • 各種グラフィック調整やバグ修正など

などが適用されている。

 

またYoutube上では開発者ドキュメンタリーも公開中(英語のみ)。流出版でお馴染みだったり噂されていたものの開発中止となったバージョンの貴重なプレイ映像、G-MENのボイスアクターやそしてスチーマー達のアイドルであるあのお方の最新映像が確認できる、2時間にも及ぶボリューム満点の動画となっている。

FM TOWNS用フリー互換OSが登場。「パニックボール2」「VSGP」「Sky Duel」「ALLTYNEX」「VIPS」がそのまま遊べる。

1989年に富士通から発売されたパーソナルコンピュータ「FM TOWNS
完成度の高かったエミュレータ「うんづ」や、山川機長さんの開発したエミュレータ津軽」及び互換ROM(PCで言うBIOS)によってTOWNS実機がなくとも当時のTOWNSソフトウェアを実行させる術が確立できていたが、エミュレータやROMがあっても互換OS(TownsOS)が出来ていなかったため、今でも入手可能なフリーゲーム等をそのまま遊ぶことが面倒であった。
TownsOSは本体とは別売だった関係で流通数が多くはなく、機能の劣るV1.1系統でも数千円、大半のソフトを動かすために必要で実質的にこれを買うことになるV2.1系統でも3,000円以上が相場となっており、機能オミット版TownsOSが収録されたフリコレや天晴なら数百円で買える事もあるもののこれらもいつでも入手できるわけではなかったり環境を整えるのがやはり労力がかかるし、フリーゲームなのに遊ぶには出費がかかることに変わりない。
そんなTOWNSフリーゲーム環境が続いていたが、なんと前述の山川機長さんが今度はフリー互換TownsOS「津軽OS」を作成したことによって、エミュレータ・互換ROMを組み合わせて今度こそ真の意味でフリーな環境で遊べる状態となったのだ。
ただエミュレータ・互換ROM・OS・各ゲームと各自でファイルを取得していって設定したりイメージファイルを作ったりと環境を整えるのはかなり面倒でそこで挫折する人が大半だと思うので、それらをまとめたファイル一式を用意し、各ゲームがファイル名に書かれたバッチファイルを実行するだけでゲームが遊べる状態にしました。これで相当敷居という面も低くなったはず。

 

Googleドライブ - FM TOWNS フリーゲーム一式 ダウンロード先

※セキュリティソフトによってはウイルスを検出と誤認される可能性もあるが問題ないファイルです(圧縮前に検査をかけても検出されずZIP形式だと検出されることを確認)。該当する場合はファイルのアクセスを許可して再ダウンロードし直して、心配であれば解凍後にスキャンしてください。

圧縮ファイルをダウンロードしたら適当な場所に「TOWNS_Free_Games」フォルダを展開し、フォルダ内に入っている各ゲーム名が書かれたBATを実行するだけでそのゲームが起動します。ゲームの説明文などは「DOC」フォルダに収録、「Tsugaru」フォルダはエミュレータ本体・互換ROM・各ゲームのデータファイルやブート用FDイメージが入っています。

 

以下は注意書き

  • 収録されているエミュレータ・互換ROM及びOS・互換OS内に含まれる外部提供ファイル・各ゲームファイルの著作権は各作者様に帰属します。
  • 津軽エミュレータ及び互換ROM(山川機長氏)・Sky Duel(Makken氏)・VIPS(M.J.KOZOU氏)・ALLTYNEX(じるるん氏)に関しては念のため再配布許可の確認を取っていますが、パニックボール2(ジュニア氏)及びVSGP(T'S氏)については連絡がまだ取れていない為に再配布許可をもらっていません。ただし、VSGPのドキュメントに転載可能という表記があること、パニックボール2は2次配付サイトが長年存続しているものの特に問題は生じておらず、また仮に収録しなくとも結局そこからファイルをダウンロードする形となって意味をなさないのでそのまま収録しています。問題があるようでしたら削除します。
  • 各ゲームの不具合や不明点を見つけた、対応して欲しいフリーゲームや市販ゲームがある場合はGithubのIssuesに送っておくか、FM TOWNS Wiki掲示板Discordのフリー互換OSの話題に記載するといいかもしれません。(Discordの方はどちらかというと直接的な開発そのものの話題になっているので、詳しくない人はGithub掲示板の方がいいかも)。
  • オリジナルTownsOSを使って動かした際に問題が発生していないことは確認済みのため、問題があるようでしたらエミュレータか互換OSの問題と思われます。各ゲーム作者様への技術的な質問はお控えください。

 

  • 「VSGP」「Sky Duel」でBGMが鳴らないのは元からの仕様です(音楽CDをBGM代わりとする)

 

TownsOS互換という性質上、オリジナルTownsOSと挙動が違う箇所があります。以下は現時点でわかっている範囲

  • 現時点ではCoCo(プロンプトモードで書かれたドライバの常駐・解除を行うソフト)・forRBIOS(プロテクトモードの割り込みを行う部分)が実装されていない。「VIPS 2」を収録しようと思っていたものの、この問題がまだ解決していないので代わりとして初代VIPSをファイルに入れている。
  • TBIOS(TOWNSハードを制御するAPI/ドライバにあたるもの)互換「TGBIOS」はまだ未実装な箇所が多く、デバッグのために未実装コールを読み出すとエミュレータが停止するようになっている(収録されているゲームを動かす分は実装済み)。
  • オリジナルTBIOSの挙動が完全に再現できておらず、FM音源・PCM音源の音量・音程設定が違うのでBGMがやや異なる。

 

  • 原因は不明だが、FM TOWNSエミュレータ「うんづ」では互換OSの動作が不安定です。VSGPでレースを開始しようとすると落ちる等。
  • エミュレータ津軽」が割とPCスペックを要求するので、Sky DuelやALLTYNEXを動かす場合は第8世代以上のIntel CPU・同等AMD CPU(Windows 11が動くCPUなら確実)を推奨します(実際にはそれ以前のCPUでもCore i7 4790Kとかの上位CPUなら問題なくフルフレームで動作するけど表記的にわかりやすいので)。
  • 「パニックボール2」「VSGP」「Sky Duel」「ALLTYNEX」のプレイにはゲームパッドが必要です(USB接続のXboxコントローラで動作確認)。「VIPS」はマウス操作。

 

 

以下、収録ゲームタイトルの簡単な説明

「パニックボール2」

ブロック状になっているマップのパイプを動かし、パイプ内を転がっていくボールを右下のゴールまで導いていくパズルゲーム


「VSGP」

対戦プレイも可能な見下ろし方レースゲーム。

 

「Sky Duel」

ボクセル表現で描画された地形を飛行しチェックポイントを通過してタイムを競う3Dフライトレース。

 

「ALLTYNEX」

通常ショット、ホーミングレーザー、ロボットに変形して近接でのサーベル攻撃、巨大レーザー、と4つの攻撃方法を切り替えながら進む縦スクロールシューティング。Windows用にアレンジ版も開発中。

 

「VIPS」

5*5になっているマスにカードを並べてポーカーの役を作って指定スコア越えを目指すカードゲーム

 

エミュレータという性質上遅延はどうしても発生しますが多少軽減する方法として、どれでもいいからBATファイルを実行して津軽エミュレータを起動、NVIDIAドライバから「3D 設定の管理」を開き「プログラム設定」タブ→「追加」ボタン→「Tsugaru_CUI.exe」を追加して

「Vulkan/OpenGLの既存の方法」を「DXGI Swapchainのレイヤーを優先する」
「垂直同期」を「オフ」
に設定して、「適用」ボタンを押してください。


AMD GPU及びIntel GPUでの同様の設定方法は自分はわかりません)。

 


以下、この互換OSが誕生した小話とか。


キッカケとなったのはDiscordのコミュニティでPC-8801mkⅡSRのミニが発売されるという話になった時の事。一ミリもTOWNS関係ない話題だったが、この機種が許可されたファイル以外は任意のイメージファイルを読み込めない仕様だったんで「仮にTOWNSミニが出るならエミュレータ起動に必要なファイルだけ配って後は勝手に各自やってくれっていう方針の方がいい」と自分は発言する。それと同時に「富士通以外にマイクロソフトやPhal rapの許可も必要なんでハードル高すぎ」と考えてしまう。
というのもTownsOSの実態はマイクロソフトMS-DOSにPhalrap社製のDOS上で32bitプログラムを動かすDOSエクステンダ「RUN386」を組み合わせ、更に富士通が用意したIO.SYS(キーボード・時計・ディスク等の管理)とTOWNS固有のハードを管理するTBIOSというドライバを組み合わせたものがコアとなるのだ。

マイクロソフトはともかくとして、Phar lap社自体はIntervalZeroという会社に吸収されていたり、富士通もPC事業はレノボに吸収され中のスタッフもFM TOWNSをFMVファミリーとして扱うほどになっているので当時の権利許可をちゃんと把握出来ているかも未知数なのだ。
そんな発言をすると、今度は山川機長さんが「既に互換ROM(FM TOWNSのROMはMS-DOSが組まれている関係上、互換ROMには互換DOSが入っている)ができているし、DOSエクステンダは既にある互換ソフトのFree386で置き替えられそうだから、あとはIO.SYSやTBIOSだけなんとかすればできそうだけど、それらを書いたらどれだけ大変なんだろうかと時折発作が起きる」という旨の発言をする。
その発言からふと自分も考えていたことがあったので「TBIOSってC言語、TOWNS標準の開発環境であるHigh Cコンパイラで組めませんかね?」って質問を投げてみる。何故こんな質問をしたのかというと、IO.SYSはリアルモード(8086互換用の16bitコード)なのでアセンブラが必須になるとはいえ、TBIOSはプロテクトモード用のプログラムでやっていることを大雑把に言えば引数を元にしてI/OレジスタやVRAM・サウンドRAMの操作をしてるだけなのだ。High Cで組む通常のTOWNS用ソフトはプロテクトモードなので出力されるコードがそのまま使える、しかもI/O操作は内部関数で用意されていたりメモリ操作もセグメントポインタで指定すれば行えるので、普通にソフト作る感覚で出来てしまうのではないか、実際にFM TOWNS版CELESETEを移植したときにTBIOSのスプライト用関数を使わないでポインタで直接スプライトRAMを弄ってスプライト制御したんだから同じなんじゃないのかと思ったのだ。更にOh! FM TOWNSの連載記事でBASIC用のバイナリルーチン(REX)をHigh Cで作るという特集があって、これを参考にすればHigh Cが出すファイルを余分なヘッダー部を切り捨てて簡単に必要なバイナリ部分だけ抜き出せるんじゃないのかというのも根拠だった。
TBIOSは(アセンブラで書くには)そこそこ大きめなプログラムなのでこれがC言語で書けるようになるだけでも相当労力が減るだろう、という見積だったが、思い立った山川機長さんが互換OSの開発を進めていき検証の結果考えた通りTBIOSはC言語で作れることも確認。流石にDOS互換部分やIO.SYSそのもの、互換TBIOSのコール部分や最適化についてはアセンブラを頼ることとなっているが、TGBIOSのコード大半はC言語による記述となっている。
それと、自分がC言語で作れるかもと言った言い出しっぺだし、実際ちょっとでもいいからTBIOS相当をC言語で組んでみたいと思っていたのでスプライト部分の関数(SPR_###)と、一部サウンド周りの修正とかのコードも送っておいたりしました。