メインコンテンツへスキップ

TerrariaとCelesteをWebAssemblyに移植!技術力がすごすぎる

·2 分
2025/05 WebAssembly ゲーム開発 プログラミング Web開発 C#

TerrariaとCelesteをWebAssemblyに移植!技術力がすごすぎる

引用元:https://news.ycombinator.com/item?id=44101175

modeless 2025/05/29 14:04:46

ゲームをWebに移植するのって楽しい趣味なんだよね!Quake IIIとCave Storyを移植したことあるよ。この記事みたいに、マジで細かいところが勝負なんだ。ゲームが動くだけじゃなくて、スマホのタッチ操作とか、マルチプレイ、セーブ管理、今の画面サイズやフレームレート対応とか、最初の移植よりずっと時間かかるんだよね。詳しくはリンク見てね。

delusional 2025/05/29 07:28:54

>”ブラウザで動くべきじゃないものがブラウザで動いてる”っていう変なプロジェクトのジャンルが好きなんだ。お気に入りは… Minecraft 1.12の直接再コンパイルとかね。へえ、Minecraftって元々Javaアプレットだったから、ブラウザで動くのはまさにふさわしいと思ってたよ。言いたいことは分かるんだけど、ちょっと面白いなと思って。

voidUpdate 2025/05/29 10:24:19

初期Minecraftは独立したアプリになる前にブラウザで動いてたし、最近それが再現されたんだ。classic.minecraft.net

HelloUsername 2025/05/29 20:03:45

>最近だって?6年前のことじゃない?https://news.ycombinator.com/item?id=19861584

pjmlp 2025/05/29 07:54:15

もっと面白いのはね、サーバー側WebAssemblyをコンテナで動かして、それをオーケストレーションして、サンドボックス環境同士で通信させるっていうアイデアかな。なんか何かに似てる気がするんだけど、最近記憶が曖昧になってきてるな。/s

baq 2025/05/29 10:22:30

きっと1972年のVM/370のこと言ってるんでしょ?

pjc50 2025/05/29 12:47:51

WebSphereだ!

dwattttt 2025/05/29 02:15:23

C#のバイナリを逆コンパイルして、WASMっていう全然違うターゲット向けに再コンパイルしたのが、どれだけそのまま動いたかっていうのは、本当にすごいね。

underdeserver 2025/05/29 04:51:30

それから、最後にちゃんと完成させるために彼らがどんだけ頑張ったかも、本当にすごいと思うよ。

kkukshtel 2025/05/29 11:41:19

この記事、C#/WASMとかC#のネイティブコードリンクの知識がちょっと必要だね。前に、C#エンジンをWASMでウェブにコンパイルする可能性について、もっと基礎的な部分から説明した記事を書いたんだ。それも補足として読むといいかも。
So You Want To Compile Your C# Game Engine To The Web With WASM
https://kylekukshtel.com/csharp-wasm-game-engine-compile-web

jasonjmcghee 2025/05/29 03:19:38

デモ試そうとしたら、Firebaseで”bandwidth quota exceeded”エラー出たよ。ただの静的サイトなら、こういう心配しなくていいはずなのに。
CloudflareとかGithub PagesみたいなCDNでホストしたらいいのに(無料だよ!)。

coolelectronics 2025/05/29 03:25:24

あ、ごめん!
Github Pagesに切り替えたよ。Cloudflare PagesはWASMファイルが容量制限超えるし、Github PagesはSharedArrayBufferに必要なヘッダー送れないんだ。
どちらもservice workerで回避できるけど、不安定になるから避けたいんだよね。

truemotive 2025/05/29 04:15:43

重いアセットに関しては、Cloudflare R3の方が向いてるかもね。AWS S3みたいなもんだけど、データ転送料がかからないのがクールなところだよ(最後に確認した時だけどね!笑)。
あと何年も経ってTerraria買っちゃいそう。アセット手に入れて、これ試したいだけのために。すごいね :)

NortySpock 2025/05/29 11:40:08

ああ、Terrariaは絶対買う価値あるよ。友達と洞窟探検する時とか特にね。
個人的にはMinecraftより好きだな。

bakkoting 2025/05/29 20:04:24

service workerの“jank”って言われてるやつ、概念的にはハックっぽいけど実際は全然不安定じゃないしユーザーもほぼ気づかないよ!
他のservice workerと組み合わせたい時以外は使いっぱなしで大丈夫(組み合わせは全然できないけど)。
参考リンクはこちら:
https://github.com/gzuidhof/coi-serviceworker
https://github.com/WebReflection/mini-coi

tech234a 2025/05/29 04:18:05

ファイルがどれだけうまく圧縮できるかにもよるけど、これ試してみるのもいいかも:
https://developer.mozilla.org/en-US/docs/Web/API/Compression

hoten 2025/05/29 03:38:29

そうそう:これ、最初にロードした時にservice workerがまだ読み込まれてないから、手動でリロードするまで真っ白なページになっちゃうよ。
service workerのインストールイベントでページを強制リロードすると直せるかも。
あとね:これめちゃくちゃクールだよ。書いてシェアしてくれてありがとう!

James_K 2025/05/29 09:16:39

最近WASM+OpenGL+SDLでウェブ向けゲーム開発始めたんだけど、簡単にできてびっくり!
コードをウェブで動かすよりCMakeファイルいじってる時間の方が長かったくらい。
ウェブプラットフォームにはまだ粗い部分もあるけど、WindowsやMacOS向けにコンパイルするよりWASMの方がずっと楽だったよ。

Fraterkes 2025/05/29 10:25:32

バカな質問なんだけどさ:Wasm使う時ってブラウザの便利なテキスト描画機能とか使えるの?それとも結局canvasに描画するだけ?

flohofwoe 2025/05/31 07:52:39

この状況だとWASMとJSに違いはないんだ。
canvas使うことになったら自分でテキスト描画する必要があるよ。これはJSとかWASMのせいじゃなくて,壊れたweb APIスタックのせいなんだ(ちゃんとレイヤーになってないし,全体的に逆さまなんだ。例えばDOMの上にcanvasがあるべきなのに,canvasがDOMの上に座ってるんだ。)

James_K 2025/05/29 18:07:15

Emscriptenっていうライブラリがあってさ,色んなものをWASMにクロスコンパイルできるんだ。
つまりね,SDL_ttfみたいなフォント描画のための依存関係を普通に引っ張ってこれるってことだよ。

inlinestyle_it 2025/05/30 10:04:31

著作権について心配してるよ。個人的な利用だけだよね?
ちなみにWASMでクラウドゲームサービスをやってるんだ(https://gaming.inlinestyle.it)。よかったら見て,改善点教えてくれると嬉しいな!

71bw 2025/05/29 06:11:26

あなたの(?)ウェブサイト,リソース食いすぎてヤバすぎるんだけど。i5-7500Tでもまともに動かすのに苦労するよ。ブラウザ全体が崩壊する感じ。

doix 2025/05/29 07:47:09

そのサイトでjavascript無効にすると完璧に動くよ。
たぶんパフォーマンスを破壊してるのはこれだね:https://velzie.rip/static/background.js

midzer 2025/05/29 06:27:13

WASMで動くCeleste Classic:https://midzer.de/wasm/celeste/

badmintonbaseba 2025/05/29 08:34:17

なぜかゲームが倍速で動いてるみたい。めっちゃ難しいね。

flohofwoe 2025/05/29 08:46:28

たぶんゲームはフレームレートが60hz固定だけど、君は120hzのディスプレイ使ってるんじゃない? ChromeとFFはこういう場合requestAnimationFrameを120hzで動かすらしいよ(Safariは60hzのままだけど)。

badmintonbaseba 2025/05/29 09:38:24

ああ、たぶんそうかも。確かに120hzのディスプレイ使ってるわ。それでも1600mまで行けたよ、良い挑戦になった。追記:改めて見たら2000mになってた。クソ難しいな。

badmintonbaseba 2025/05/29 12:09:08

倍速で山頂まで登ったよ。🍓x14 3:17:46 deaths:1981

nottorp 2025/05/29 18:05:03

ゲームの状態更新をフレームレートに紐づけるのはやめてほしいな。 requestAnimationFrameがある場合でも、「AI」でさえ知ってるんだぜ。俺、聞いたことあるから分かる。でも、描画とゲームの更新を切り離すように具体的に指示しないと、ダメな答えを出すんだよね。

もっとコメントを表示(1)
flohofwoe 2025/05/31 07:46:23

これ、未だに意外と難しい問題なんだよね。単純にフレーム時間測るだけだと(rAFのタイムスタンプ使っても)タイミングの揺れ(ジッター)が大きくて、マイクロスタッターの原因になるんだ(あと別の問題として、SpecterとかMeltdownの影響で、一部ブラウザはタイマー精度をミリ秒単位に制限してる。でも、ここではランダムな揺れのおかげで、十分なフレーム数で平均すれば正確なフレーム時間、例えば16.667とか8.333msの値が、15<=>17とか7<=>9msみたいにぶれる代わりに得られるから役に立つんだけどね)。

nottorp 2025/05/31 20:21:31

俺に言わせれば、それは言い訳にならないね。ブラウザは固定ハードウェアのコンソールじゃないんだから。正直、今どきコンソールだって固定ハードウェアじゃないんだけどさ…。

flohofwoe 2025/06/01 06:15:13

言い訳じゃなくて、可変タイムステップを実装しようとすると起きるマイクロスタッターの問題を解決するための、もっと良い方法をウェブプラットフォームは提供すべきだってことだよ。だって、今は「ユーザー空間」でちゃんとした解決策を出すのが無理なんだからさ(例えば、どんなノイズ除去フィルターも、ブラウザウィンドウを別のリフレッシュレートのディスプレイに移すとかでリフレッシュレートが突然変わると問題が起きる)。

01HNNWZ0MV43FF 2025/05/29 04:23:47

これはめちゃくちゃクールだね。だけど、ブログ自体が俺のFirefoxだと60 FPS出てないんだ。たぶんあの背景エフェクトのせいかな?

dgb23 2025/05/29 08:08:34

あのエフェクト、邪魔だし集中できなくて嫌だったわ。インスペクターから消せるcanvas要素で描画されてるよ。

acheong08 2025/05/29 23:52:31

これ超いいね。Terrariaやったの2014年以来だわ。ちょっと不満なのは解像度高すぎて全部ちっちゃく表示されちゃうことかな。200%にスケールできたら文字とかアイコン見やすくていいんだけどなー。

Spunkie 2025/05/29 17:19:27

クールだと思うんだけど、まだ動かせないんだよね。SteamからのオプションでTerrariaのassetsダウンロードしてるんだけど、1時間経ってもまだ5%だよ。

rlmineing_dead 2025/05/26 21:27:33

FNA/XNAのプロジェクトがブラウザで動くの見れるのいいね

caminanteblanco 2025/05/29 04:52:45

これマジで最高!即行でChromebookで使うつもりだよ

parallax_error 2025/05/29 10:47:07

iosのSafariだとマジでダメみたい、デモ3つともロード中にクラッシュしちゃうわ笑

記事一覧へ

海外テックの反応まとめ
著者
海外テックの反応まとめ
暇つぶしがてらに読むだけで海外のテックニュースに詳しくなれるまとめサイトです。