Steam版「The Callisto Protocol」が配信開始、おま国だけど日本語ローカライズ済み、でもカクカクフリーズ地獄

Dead Space」の元開発者などが手掛けるサバイバルホラー「The Callisto Protocol」がSteamで配信が開始された。日本でも発売が予定されており予約も受け付けていたものの、ゴア表現の問題でCEROのレーティング審査に通らず日本発売中止というアナウンスがあり、その数日後には日本からの予約が中止され現在も購入不可能となっている。

自分は発売中止というアナウンスがあった後おま国になる前にSteamストアで予約購入したが、特に返金対応といった処置はなされず、海外アンロックと同時刻に日本リージョンでもインストール&プレイ可能となった。

おま国タイトルではあるが、元々日本で発売予定だったタイトルだけあって日本語音声・字幕までしっかり(?)収録されており、更にインゲームのホログラムや看板といったものまで日本語表記になっているという徹底っぷり。中華フォント、音声と字幕の内容が異なっていたり、看板の表記に疑問符が付く記述があるがここまでローカライズされているというのに発売中止は勿体なさ過ぎ。

現在からSteam経由で入手するならギフト経由のものはリージョン規制が無いという話もあったので海外フレンドがいる人ならトレードしてもらう(現に自分はリメイク版Dead Spaceをトレードで入手済み)ことも可能だが、どうしても遊びたいなら入手難易度も考えて現状PS5版しかない。

というのもリリース時点のPC版の最適化具合は同じくリリース時のバットマンアーカムナイトを思い起こさせるような出来だ(Xbox版もパフォーマンスに難を抱えている模様)。

Core i5 12600、メモリ32GB、GeForce RTX 3060 Ti、PCIE 4.0 SSDにインストールという環境で遊んでみたものの1080p・レイトレーシングのみ無効にして他は最高設定・アップスケーリングはなしだと平均56fpsくらいで60fpsに満たないシーンが見受けられ、マップを移動していると0.2~0.3秒ほどゲームが停止するスタッターが何度も発生する。

パフォーマンスが悪いのはまだしも致命的なのはゲームを開始してから20~30分ほどするとエラーを吐いてクラッシュする頻度が高すぎる。

もちろんおま環っていう現象ではなく、RTX 3060 Tiよりも圧倒的に性能の高い3080・4090でもスタッターや低フレームレートが発生しているという報告が数多く寄せられている状態。

もしやCEROのレーティング審査は、表現内容ではなくフレームレートの計測を行って売り物になる代物だったか確認していた可能性が・・・(ない)

ふゆ、'言論弾圧'って感じ!(「暗号学園のいろは」の東州斎享楽が「シャニマス」の黛冬優子にしか見えない)

これの1コマ目の元ネタがわからなかったので調べたら

少年ジャンプ+ 『暗号学園のいろは』 第1号】より引用

 

やばい、シャニマスの黛冬優子じゃないはずなのに見れば見るほど冬優子にしか見えなくなってきた。

やっぱ同一人物だよな・・・(錯乱)

 

Steamオータムセール 2022が開催。恒例の「Steam アワード」はVR部門が任意投票となる。

アメリカの大型安売期間ブラックフライデーに合わせて、PCゲーム配信サイト「Steam」でも恒例の「Steamオータムセール」が日本時間11月23日午前3時から同月30日午前3時までの1週間の間開催中となっている。

今年配信が開始(早期アクセスから抜けたタイトルも含む)されたタイトルに限って一例を挙げると、ちょっと病みあがりなインターネット配信者の女の子を立派に育てるアドベンチャー「NEEDY GIRL OVERDOSE」が20%オフ木村拓哉や豪華キャストが出演するサスペンスアクション「JUDGE EYES」及びその続編「LOST JUDGMENT」が他機種版では別売りだったDLC(追加シナリオの「海藤正治の事件簿」のみ有料)を収録した状態で25%~30%オフ、アメコミ原作で80~90年代にアーケードや各ゲーム機向けに発売されたベルトスクロールアクションゲームを意識したTeenage Mutant Ninja Turtles: Shredder's Revenge」が20%オフ、迷い猫となりロボット達のいるサイバーシティを冒険してこの街の秘密を解き明かすアドベンチャー「Stray」が20%オフ、悪人の認知世界に潜入し心を盗んで改心させる怪盗団を名乗る高校生たちのジュブナイル物語を描いたRPGペルソナ5 ザ・ロイヤル」がPS4版で別売りだったDLCを収録して30%オフ、四方八方から迫りくるモンスターたちを倒しながら経験値を稼ぎレベルアップして制限時間内まで生き残る360度シューティングアクション「Vampire Survivors」が15%オフ、米粒サイズになってしまった少年少女たちが昆虫たちの巣くう裏庭でサバイバルを行うアクション「Grounded」が25%オフなど。

 

合わせてこちらも恒例の年末にSteamタイトルの各カテゴリー優秀タイトルを決める「Steam アワード」のノミネート作品を決める投票も実施中。

1タイトルづつ11項目に投票し、各カテゴリーに投票・投票したタイトルをプレイ・投票したタイトルのレビューを投稿(もしくはアップデート)でSteamバッジがもらえるようになっている。

今までとは違いプレイ環境が整えられない人が多い&市場の変化が原因か「VRゲームオブザイヤー賞」は投票しなくてもスキップすることが可能となっていたり、Steam Deck発売に合わせてか「外出先でのベストゲーム賞」という項目が追加(こちらもスキップ可能)されている。

自分が投票したノミネートタイトル一覧のURLを作成する共有機能もあり、そのURLを貼って投票例を載せておく。

Steam アワード - BCCのノミネート作品

 

 

電子回路シミュレータ「CRUMB Circuit Simulator」Arduino付の回路もシミュレータ上で組み立てられる。

PCゲーム配信サイトSteamにて電子回路シミュレーター「CRUMB Circuit Simulator」が配信されている。価格は定価1.000円。この記事を書いている時点で英語版のみ(日本語非対応)。

電子回路の試作などに使うブレッドボード(無数の穴が開いており一列方向にのみ通電状態になっている基板)にジャンパ線・抵抗・コンデンサ・インダクタ・ダイオードトランジスタ・ICなどの部品を差し込んでいき回路を作っていく。ボタンやボリュームといった入力装置、LEDや電子スピーカーといった出力装置といった触ったり視覚的な変化が感じ取れる部品はもちろんのこと、IC類には74HCシリーズ汎用ロジックICだけでなく実際に作った回路からプログラマブル(シミュレータ上のエディタからも直接入力化)なEEPROM(28C16)や64bit SRAMまで用意されていたり

更にマイコンボードであるArduino Nano」も実装、プログラムを組むことも入出力ピンから回路を制御することも当たり前のように可能、液晶部品も用意されているので繋ぐことでArduino Nano上でプログラムされたソフトの映像をそこに映すことだってできるのだ。CRUMBに標準で入っているサンプル回路では古典的なテニスゲームのコードと実際に遊べる回路が収録されている。

 

CRUMB Circuit Simulatorの組み立て例として信号機回路(といっても切り替えが早すぎて装飾用の点灯回路か)を作ってみた動画を載せておく。配線や各部品に流れている電圧・電流まで色分けでリアルタイムに識別できる機能まであってテスターでチマチマ計測しなくともすぐ可視化できるのはシミュレータならでは。

 

現バージョンではローカライズされていないといった点はともかく、ファイル名を指定しないまま保存しようとするとフリーズしたり、部品を選択状態にしたまま新規プロジェクトを作ると部品の選択ハイライトが消えないままといったバグが多い問題、多足の電子部品を向きを変えて配置するといった操作方法がわかりにくい、当たり前だがまだまだIC中心に種類不足という欠点も目立つが、部品を購入する必要が無い、場所も取らない、後片付けも不要、電圧をかけすぎたり配線を間違えて壊すなんてことも無い、と実際に電子回路を組む際の煩わしさを感じることなくテストできるのは快適だ。

まずはこのシミュレータ上で組んでみて問題ないようであれば実回路を用意するといった使い方も考えられ、趣味で電子工作をする人も教育として電子回路を組む人にもお勧めなソフトだ。

「ソニック フロンティア」の釣り要素がカオスエメラルド

セガより2022年11月8日に発売されたソニックシリーズ最新作「ソニック フロンティア」

そのゲーム中の要素としてコインと交換に釣りが行え、釣った魚によってトークンが溜まりパワーアップアイテムやゲームの進行を早めるアンロックアイテムと交換できる釣り場という場所が用意されているのだが、何故か妙な違和感を覚える光景なのだ。

なぜかというと・・・

トゥーン調のソニック達のグラフィックに対して、魚は妙にリアルなグラフィック不気味の谷を引き起こしていたり

釣れるもの自体も相当イロモノ揃いで、ただでさえ「釣り」という単語から連想しないであろうハンマーヘッドシャークしかも何故か見たこともない水玉模様が、これまたとてもじゃないが常人には思いつきもしない星模様付きのチョウチンアンコウ、そもそも魚ですらないワニを釣りあげることができる。

 

マジでなんなんこれ?

この釣り場自体、広がる白い輪をタイミングよく赤い輪の中で押すだけ(本当にこれだけ)で特にこれといった操作もする必要性がないミニゲーム以下の内容なんだが、ここの開発を任された担当者が仕様通りに実装することができないまま納期が近づいてきて、うをぉぉぉぉぉ!!!パソナだけは嫌だぁ!!!とか社内で絶叫しながらなんとか完成させた痕跡なの?

 

なお、11月15日に配信が開始されたモンスターハンターコラボDLCで釣りと同じようにタイミングよくボタンを押すことでトークンがもらえる機能「肉焼き」が追加されたが、こちらの方はコインの消費をする必要が無いうえに一定のトークンがもらえるため釣りをするよりもトークン稼ぎの効率が良さそうな雰囲気。

マジでこの釣り要素を入れた意味ってなんなの・・・

www.youtube.com

Steam版バイオハザード ヴィレッジ DLC & バイオハザード RE4の海外キーがリージョンロック、海外版ヴィレッジ本体 + 日本版DLCを組み合わせた結果・・・

※追記:10月31日にDLCのキーに設定されていたリージョンロックが解除される。日本版のDLCを返金(プレイ時間30分)した後、海外版のDLCキーを購入して有効にしたところ問題なく登録でき、イーサンの腕なども正常になったことを確認。

 

以下は当時の記事

 

CERO Z版でも海外版に比べてマイルドな表現となるゴア規制が嫌だったので、Steam版バイオハザード ヴィレッジはSteamから直接買わず外部キー販売サイトGamesplanet(GP)にて海外バージョン(日本語音声・字幕両方完備)を購入して遊び、発売から1年経過して新たに登場したDLC「ウィンターズ エクスパンション」においても海外バージョンと日本バージョンで別IDがつけられてデータベース上に登録されていたので念のためDLCにおいてもGP経由で予約しておいた。・・・のだが、

発売前日になってなんと日本から有効化できないという理由で返金対応に。マジかー。

購入画面を開こうとしてもおま国となっていてもう予約はできない状態になってしまったので、イチかバチかで日本版DLCをSteamストアから直接予約、ゲーム本体は海外版 + DLCは日本版という組み合わせでゲームを起動したところ、

従来のFPSモード時におけるゴア表現(ライカンの頭部欠損、イーサンの腕が切断)はそのままなんだが、DLCにて追加されたTPSモードやシナリオ「Shadow of Rose」において

TPSモード時にイーサンの腕が一切表示されなくなったり(日本通常版はイーサンの腕が切断されないので整合性が取れていない?)、

「Shadow of Rose」においてゴアではないがややショッキングな光景なので別リンク

演出的に違和感はない(むしろ敵のデザイン的にはこちらのほうが近い)ものの、海外版では赤くケロイド状になっている顔の皮膚が白く荒れている状態になっている。

TPSモードは致命的な不具合が発生しているものの遊ぶ予定はない、「Shadow of Rose」は許容範囲ではあるものの、本当に問題なのはこのバイオハザード ヴィレッジ DLCはともかくとして、なんと来年3月発売予定のSteam版バイオハザード RE4も現時点で外部キーは日本からの登録が行えないことが告知されていて外部キーサイトでの予約が行えない状態となっている。今までバイオハザード7・RE2・RE3・ヴィレッジと海外版の外部購入を許容していたのに突如として規制したのはどういった理由なのか?そもそも日本版だろうが表現物の内容を規制して何かしら得があったことが今まであるのか?

C / C++ 言語のswitch文を最適化 (テーブルジャンプが使われるようにする)

先に概要を書くと

  • caseの値は連番かつ昇順(上から小さい数で下に行くほど増えていく)となるように心がける。ある程度caseが多ければあとは勝手にコンパイラがテーブルジャンプ最適化を行う。
  • goto文やreturn文などでswitch文途中から抜けないようにする。あるとテーブルジャンプ最適化が行われない。
  • MSVC(Visual Studio)でコンパイルする場合、default:の箇所に__assume(0);と記述すれば上記二つを無視して強制的にテーブルジャンプ最適化が行われる。ただし、goto・return等でのswitch抜けがあるまま実行すると例外エラーが発生する。
  • 追記:上記の__assume(0)はC++23から「std::unreachable()」で標準化

 

FM TOWNSエミュレータ津軽」を弄っていて、どうもエミュレーターの実行速度が既にあるTOWNSエミュレータの「うんづ」や同じようなx86 CPUを積んだPC(PC98・IBM PC)のエミュレータと比べても遅過ぎるのが謎だったのでちゃんと調べることにしたのが事の始まり。どのくらい遅いのかというと現在Core i5 12600を搭載したPCを使っているのだけど、486 66MHzくらいのCPU速度をエミュレートするのがギリギリといったところ。エミュレータには対象のマシンよりも何倍もの性能を持ったものが必要なのは仕方ないにしても、シングルコアで比較してもおそらく300倍差があるんだからもっと早くても良さそうだ。簡単に考えるとエミュレートするCPUの1命令を実行するために、ホスト側のCPUでは300命令も実行して再現しようとしているからここまで遅いんですね。

公開されている津軽ソースコードを見ても他のエミュレータと比べても大差ないようなCPUコアの実装でコードを見ただけでは全く原因がわからず、Visual Studioの診断ツールを実行(RelWithDebInfo設定でコンパイルし、「デバックの開始」ボタンを押してCPU時間の測定で記録)し、コードで時間がかかっている処理の場所を可視化したところ

CPUの一命令を実行するRunOneInstruction関数で、CPU命令を読み込むFetchInstruction関数内の処理を除くと、読み込まれたCPU命令を元に分岐して処理を実行するswitch文の一か所だけで、なんとプログラム全体の約16%もの処理時間がかかっている。

このswitch文を確認すると

switch

{

case 0:

break;

case 1:

break;

case 2:

break;

case 3:

break;

case 33:

break;

case 39:

break;

case 34:

break;

case 22:

break;

とCPU命令のオペコード数値順じゃなく、命令のオペランド(実行する命令の演算値の場所を指定するところ)順に並べているのか微妙に飛び飛びにcaseの値が指定されている。これだとジャンプテーブルという配列にジャンプ先のアドレスを入れてそこから読み込んですぐ分岐が行われるテーブルジャンプという実装方法での最適化がコンパイラで行われず、大量のif~else if~文に置き換えられてしまうのだろう。命令数を数えたところなんと308個。それが全部if文となり分岐するかどうか調べられるので、処理に時間がかかっていたのだ。

本来ならば、

case 0:

case1:

case 27:

case 34:

case 39:

とちゃんと整理すればいいのだろうが、可視化しやすいようにこの並び順にしていた可能性があるのと、そもそも308個のcase文を並び変えるのが面倒だし、並び替えに失敗していたら最適化が行われないとなるので何とかこのままの状態でテーブルジャンプ最適化が行われないかと調べたら、同じようにエミュレータのCPUコア実装でテーブルジャンプの考察を記載しているサイトにてMSVCのみではあるが、default:に__assume(0)と追記するとテーブルジャンプに展開されるとあったので藁にも縋る思いで、

default:
#if defined(_MSC_VER)
        __assume(0);
#endif

とこの3行(実質1行)のみ追記して他は手つかずのまま再度診断ツールを実行したところ、

なんということでしょう(ビフォーアフター風)

約16%もCPU時間を占めていたswitch文が約1.6%とほぼ十分の一まで負荷が下がってくれました。

津軽のエミュレート速度を図る方法、コマンド入力で「pri timebalance」で1ms毎のエミュレートの進行速度を示す値値平均でも、改良前はCore i5 12600環境でVM CPU速度 66MHz設定におけるTownsOS上の計測値は約170000だったのが、

テーブルジャンプ実装後は約220000まで向上。たった1行だけで1.3倍の高速化が実現できた。もう一か所テーブルジャンプ化されていないそこそこ長いswitch文があってこちらもテーブルジャンプ化(__assume(0)追記だけでなくcaseも整理)したが、こちらはRunOneInstruction内ほどの効果はなかった。このswitch文以外にもまだボトルネックになっているところはあるが、これだけでもだいぶ動作が軽くなった。絶大な効果があったのでGithubでpull requestを送信し、さっそくmerge(コードの変更を承認)される。まだGithub上のコードでのみ反映されていないが、次回のリリース版では前バージョンよりも軽くなっているはずだ。

 

なお、VCでは__assume(0);でまず間違いなくテーブルジャンプ化されるのだが、case内でgotoやreturnなどを使いswitch文途中で抜けるような処理を書きそこに到達すると例外エラーが発生してしまうので要注意。caseで処理が終わる場合はbreak;でswitch文下に続くようにする。