01. 静止時の描画停止(オンデマンド・レンダリング)による負荷削減
WebGLやThree.jsで3Dゲームを作るときって、思考停止で requestAnimationFrame を回して毎秒60fps(あるいはディスプレイ上限の120fps)で常時ループさせがちですよね。アクションゲームならそれでいいわけですが、これパズルゲームなわけですよ。
プレイヤーが「次、どこ動かそうかな…」と長考している間、画面のキューブは1ミリも動いていません。それなのに裏では全力で毎秒60回も頂点計算とシェーダー描画をぶん回している。(シンプルに電気とGPUの無駄遣いやん…と)。
特にスマホでプレイしていると、手元がどんどん熱くなってバッテリー残量が目に見えて削られていくわけです。電車の中で無駄にバッテリーを削られるのは学生にとって死活問題ですからね。
そこでv1.2.0では、必要なときだけ描画する「オンデマンド・レンダリング」機構へと改修しました。タイルのスライド移動、合体(マージ)時の拡縮アニメーション、そして指でカメラをドラッグして回している期間中だけ描画ループを能動化し、動きが止まった瞬間に即座にスリープ(待機)状態に入る設計です。
これを入れた結果、思考中のCPU・GPU負荷は80%以上カットされ、スマホがカイロ化することもなくなりました。仕組みで無駄を削ぎ落とすのはやっぱり気持ちがいいですね。長時間の思考プレイでも安心です。
02. ゲームオーバー画面への攻略フィードバックUIの実装
もうひとつの改善点が、負けたときの導線設計です。
テストプレイや周囲の様子を見ていて気になったのが、「盤面が詰まってゲームオーバーになった瞬間、悔しさのあまり即座にリトライボタンを連打し、また同じパターンで自滅して閉じる」という負のループでした。
立体版の2048って、平面版と違って「奥や手前、中心マス」という死角があるため、2Dの感覚のまま雑にガチャガチャ動かしていると一瞬で内部から目詰まりを起こす構造的な罠があります。
そこで、ゲームオーバー画面のオーバーレイ内に「スコアアップのための攻略ヒント」枠を新設しました。人間、一番攻略法を読みたくなるのってシンプルに「負けた直後」なんですよね。
悔しい瞬間に「3D角固定セオリー」や「緊急リカバリー戦術」の解説記事へワンタップで飛べるようにしたことで、感情的にならず「あ、角から飛び出させちゃダメだったのか」と冷静に振り返ってリベンジできる学習ループを整えました。ちなみにゲームクリアしたときはドヤ顔したいはずなので、このヒント枠はあえて非表示にしています。
03. サイト構造の継続的メンテナンスと保守
機能面の改修と並行して、サイト全体の地味なメンテナンスもコツコツ進めています。公開済みの全攻略記事(4本)について、直近のゲーム動作検証に基づく加筆を行うとともに、読者や検索エンジンに向けて最終更新日メタデータを明記しました。
さらに、記事の最後から迷わずゲーム本編を試せるようにコール・トゥ・アクション(プレイボタン)を繋ぎ直しました。せっかく攻略テクニックを読んでもらっても、ゲームを遊ぶのに別タブを探すようでは離脱されてしまいますからね。回遊しやすく内部リンクを整え、更新されたURLは sitemap.xml に登録して適正な検索インデックスを維持しています。
今後の予定として、自分がどれくらい上達したかが可視化できるスコア推移グラフや、特定の難関タイルを作ったときの実績バッジ機能なんかもぼちぼち実装していきたいなと考えています。