プログラミング

データ軽量化編 β版へ向けて PHPポケモン 90

PHP PHPポケモン ポケモン
データ軽量化編 β版へ向けて  PHPポケモン 90

β版の実装に向けて

大型アップデートにより、ある程度機能改善や実装箇所も増えてきましたが、それと同時に次の段階への移行が本格的に見えてきました。それがβ版です。

 

PHPポケモンは2020年12月現在α版となっており、完全な試作段階のWEBアプリケーションです。セーブ機能はなく、セッションの有効期限や破棄により最初からやり直さなければいけなくなるという点が最大の難点となっており、β版の実現に要求されている項目でもあります。

 

では、そのセーブ機能を実現するためにもいくつか課題となっている項目を取り上げていきましょう。

 

セーブデータの軽量化

まずは、データを記録するためにはデータの軽量化が求められます。PHPポケモンではDBを使用せずにセッションによるデータの受け渡しをしているため、セッションに格納しているデータ自体を軽量化することが、この実現に繋がります。

そして、セッション容量の大半を占めているのはインスタンスです。

 

ポケモン

ポケモン情報はインスタンスをシリアライズして格納するという方式が現段階では最善なので、形式はこのままで進めていきます。

定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向 定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向

PHPポケモンも順調に開発が進んでいると思いきや、ふとした気づきが自分の理解力を思い知らせることとなった今日このごろです。 プログラミングは奥が深く、しっかりと段階を追って理解を進めていけば、「これ・・・便利やんけ!」ってなることがかなり多いということがわかります。   それでは、かの有名な黄色い...

 

前回の記事で紹介したように、現在はほとんどの値をプロパティとして格納しているため、情報の追加やステータス・技の変更等によるアップデートも効きません。しかも、プロパティが多ければ多いほど、データ容量は膨れ上がるため、共通項目を定数または静的変数として、オブジェクト自体に持たせるといった仕様に変更します。

 

ピカチュウクラス(/Classes/Pokemon.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Pokemon.php');
 
/*
* ピカチュウ
*/
class Pikachu extends Pokemon
{
 
    //=====================================
    // オブジェクト定数
    //=====================================
 
    /**
    * ポケモンナンバー
    * @var integer
    */
    public const NUMBER = 25;
 
    /**
    * 正式名称
    * @var string
    */
    public const NAME = 'ピカチュウ';
 
    /**
    * 分類
    * @var string
    */
    public const SPECIES = 'ねずみポケモン';
 
    /**
    * 分類
    * @var string
    */
    public const DESCRIPTION = 'つくる 電気が 強力な ピカチュウほど ほっぺの 袋は 軟らかく よく 伸びるぞ。';
 
    /**
    * タイプ
    * @var array
    */
    public const TYPES = ['TypeElectric'];
 
    /**
    * 基礎経験値
    * @var integer
    */
    public const BASE_EXP = 112;
 
    /**
    * 捕捉率
    * @var integer
    */
    public const CAPTURE = 190;
 
    /**
    * 重さ
    * @var float
    */
    public const WEIGHT = 6.0;
 
    /**
    * レベルアップ技
    * @var array::[習得レベル:integer,技名称:string]
    */
    public const LEVEL_MOVE = [
        [1, 'MoveThunderShock'],
        [1, 'MoveGrowl'],
        [9, 'MoveThunderWave'],
        [16, 'MoveQuickAttack'],
        [26, 'MoveSwift'],
        [33, 'MoveAgility'],
        [43, 'MoveThunder'],
    ];
 
    /**
    * 種族値
    * @var array
    */
    public const BASE_STATS = [
        'H' => 35,
        'A' => 55,
        'B' => 40,
        'C' => 50,
        'D' => 50,
        'S' => 90,
    ];
 
    /**
    * 獲得努力値
    * @var array
    */
    public const REWARD_EV = [
        'S' => 2,
    ];
 
    //=====================================
    // 静的変数
    //=====================================
 
    /**
    * 進化先
    * @var string
    */
    public static $after_class = 'Raichu';
 
}

 

ポケモンそれぞれのクラスに記述するものは、定数・静的変数で解決ができました。これで、ピカチュウのインスタンスを作成しても、これらの情報は含まれず、呼び出す際はオブジェクトそのものを参照してくれることになります。

進化先を静的変数にしたのは、イーブイなどの進化先不定のポケモンがいるためです。こちらについては、前回の記事で細かくまとめているので、ぜひ参考にしてください。

定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向 定数と静的変数 ピカチュウとイーブイで学ぶオブジェクト指向

PHPポケモンも順調に開発が進んでいると思いきや、ふとした気づきが自分の理解力を思い知らせることとなった今日このごろです。 プログラミングは奥が深く、しっかりと段階を追って理解を進めていけば、「これ・・・便利やんけ!」ってなることがかなり多いということがわかります。   それでは、かの有名な黄色い...

 

アイテム

次にアイテムについてです。こちらはプレイヤー情報に含まれていますが、既にクラス名と所有数だけを格納した配列をプレイヤーに持たせることで、すでにある程度の軽量化はされています

ただ、毎回アイテムを参照する際にインスタンス化するとなればメモリ負担は多くなってしまうため、こちらも定数を使って実装していきましょう。

 

モンスターボール(/Classes/Item/PokeBall.php
<?php
$root_path = __DIR__.'/../..';
require_once($root_path.'/Classes/Item.php');
 
/**
* モンスターボール
*/
class ItemPokeBall extends Item
{
 
    /**
    * 正式名称
    * @var string
    */
    public const NAME = 'モンスターボール';
 
    /**
    * 説明文
    * @var string
    */
    public const DESCRIPTION = '野生のポケモンに投げて捕まえるためのボール。カプセル式になっている。';
 
    /**
    * カテゴリ
    * @var string::general|health|ball|important|machine
    */
    public const CATEGORY = 'ball';
 
    /**
    * 最大所有数
    * @var integer
    */
    public const MAX = 99;
 
    /**
    * 買値
    * @var integer
    */
    public const BID_PRICE = 200;
 
    /**
    * 売値
    * @var integer
    */
    public const SELL_PRICE = 100;
 
    /**
    * 対象
    * @var string::friend|player|enemy
    */
    public const TARGET = 'enemy';
 
    /**
    * 使用できるタイミング
    * @var array
    */
    public const TIMING = ['battle'];
 
    /**
    * 捕獲補正率
    * @var float
    */
    public const PERFORMANCE = 1.0;
 
}

 

これで、全ての値をインスタンス化せずに取り出すことができます。しかし、現状のままではメソッドを呼び出すためにはインスタンス化が必要です。こちらも解決するために、アイテムで使用しているメソッドはすべて静的メソッドへ変更しましょう。

 

どうぐクラス(/Classes/Item.php
<?php
/**
* どうぐ
*/
abstract class Item
{
 
    /**
    * 性能値(捕獲補正率※ボールのみ個別で設定)
    * @var float
    */
    public const PERFORMANCE = 0;
 
    /**
    * 現在のページで使用できるかどうかの判定
    * @param page:string
    * @return boolean
    */
    public static function allowUsed($page): bool
    {
        return in_array($page, static::TIMING, true);
    }
 
    /**
    * 削除できるかどうかの判定
    * @return boolean
    */
    public static function allowTrashed(): bool
    {
        // 最大所有数が設定されていれば削除可
        if(is_null(static::MAX)){
            return false;
        }
        return true;
    }
 
}

 

静的変数と同じく、静的メソッドもstaticを付与することでインスタンス化せずに呼び出すことができます

これにより、アイテム自体は現状インスタンスが不要なオブジェクトとなりました。他のアイテムなども踏まえてインスタンス化の必要性がなさそうであれば、子クラス自体もabstractを付与してインスタンス化できないようにしても良さそうです。

 

処理の見直し

セーブデータの軽量化については、ある程度定まってきたので次に全体の処理見直しをしましょう。こちらは、現段階での予定となるので本格実装するかどうかは未定のものも含まれています

 

クラスの抽象化

ポケモン・アイテムクラスでも説明しましたが、ほとんどのクラスは抽象化することで解決ができそうです。アイテムですら現状インスタンス化が不要な段階まで見えてきたので、おそらく他のクラスは抽象化が可能になります。

現在実装されているものであれば、以下のクラスが該当します。 

  • タイプ
  • 状態異常
  • 状態変化
  • フィールド

 

以上の5クラスについてはほぼ抽象化が可能です。抽象化することにより、毎回インスタンスを作成していた手間が省けるため、現在の仕様と比較すればメモリ消費を大幅に削減できる見込みです。

こちらは、ほぼ確定で実装予定となります。

 

base64の画像処理

こちらは軽量化とは逆の内容になります。現在は公開ディレクトリに保管した画像へパスでアクセスをしています。画像自体はPHPポケモンオリジナルのものではないため、パスを指定することで他の画像へのアクセスができること自体はそこまで大きな問題ではありませんが、システム上大きな問題点が上がってきました。それがアクセスエラーです。

 

エラー等の関係上、一部レスポンスコードによる管理を行なっている処理があるため、もし404が返ってくるとレスポンスが上書きされてしまい、データ消失につながる可能性があります。セーブ機能が実装できれば、保険としてオートセーブを取り入れるなどして対応できるかも知れませんが、プレイの進行に支障が出ることは間違いありません。

なので、画像不定などのリスクを少しでも軽減するために、画像へのアクセスはPHPを使ってサーバー処理で行いbase64を生成、フロントでは生成されたデータを使うというのが候補として上がりました。

gifや画像数の関係上、処理速度にも不安が残るため、この方法が有効かどうかはわかりませんが、一部の画像についてはbase64で管理したほうが良さそうです

 

TypeScriptの導入

処理自体はPHPで行なっているため、jsそのもののエラーによりデータが消失してしまうというケースはまずありません。ただ、画面入力などの操作機能全般はjsに頼っているため、エラーにより読み込みが上手く行かないなどが発生すれば、実質フリーズ状態に陥ってしまい強制リセットを余儀なくされます

こういったリスクを軽減するためにも、TypeScriptを使ったjsファイルの作成・管理を視野に入れています。

ただ、jQueryとの共存やTypeScript自体を使ったことがないという現段階では悩みどころです。

もし導入するのであれば、記述量が少ないうちに判断したほうが良いのですが、一気に対応することで粗がでそうな気がしており躊躇しています。こちらはβ版では導入せず、γ版で本格的な画面の作り込みが入った時点でも良いかも知れません。

 

まとめ

いかがだったでしょうか。

今回のPHPポケモンでは「β版の実装へ向けたデータの軽量化」についてご紹介しました。

WEBアプリケーションづくりに興味がある方や、ゲーム好きな人は、ぜひ参考にしてみてくださいね。

 

注目の記事

記事を書いてもブログが伸びないのは何故?SEOの評価を下げてしまう絶対にダメな3つのこと【知らない内に損してます】
SEO対策
SEO,ブログ
記事を書いてもブログが伸びないのは何故?SEOの評価を下げてしまう絶対にダメな3つのこと【知らない内に損してます】

  1年ブログを継続したけど、全くPVが伸びない・・・   ブログを育てるためには、毎日または定期的な更新が必ず必要ですが、それでも思うように伸びないという人は、実は他に致命的にな原因があることがほとんどです。 今回はそういった「努力しても結果が出ない」と悩んでいるブロガーやブログ運営者に...

プレイヤーのグローバル化編 PHPポケモン 78
プログラミング
PHP,PHPポケモン,ポケモン
プレイヤーのグローバル化編 PHPポケモン 78

2日ほどwiki作成にいそいそと励んでいましたが、開発をお休みしていたわけではありません。追加機能を実装するに辺り、色々と改善点が挙がってきたので、このタイミングでしっかりと見直しをしました。   本格的なシステム開発では、最初に仕様書や設計書が作成され、それに沿って作成していくことになります...

プログラミングを優しく解説!学んで得する3つの理由
プログラミング
プログラミング教育
プログラミングを優しく解説!学んで得する3つの理由

  プログラミング教育が始まるけど、そもそもよくわかっていない   2020年からは小学校がプログラミング学習が必修化され、翌年には中学校でも導入予定です。 しかし、保護者からすると全くわからず困惑していたり、教える先生たち教師陣からしてもよくわかっていないケースは少なくありません。   今回...

PHPポケモン「コントローラー編」〜POSTとSESSIONの活用〜 10
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「コントローラー編」〜POSTとSESSIONの活用〜 10

  今回のPHPポケモンでは、今まで作った機能用のコントローラーになるインターフェースを作成します。ポケモンやメソッドを選択できるようにして、よりゲーム性の高いアプリケーションを実装しましょう。   第1回から学習したい方はコチラ     コントローラーの実装   それでは実装したアクション...

PHPポケモン「状態異常編〜まひ〜」23
プログラミング
PHP,PHPポケモン,ポケモン
PHPポケモン「状態異常編〜まひ〜」23

  今回のPHPポケモンでは「状態異常」を導入します。バトルシステムにも関係してくる部分ですが、それ以外にも影響を与える部分が多く、且つ非常に判定がややこしく、作り込む必要があったため1つずつ片付けていきます。   状態異常の実装  ポケモンの除隊異常に該当するものは以下の7通りです。 ...

ゆびをふる編 PHPポケモン 69
プログラミング
PHP,PHPポケモン,ポケモン
ゆびをふる編 PHPポケモン 69

ゆびをふるとは 今回PHPポケモンで実装する技は「ゆびをふる」です。  ゆびをふる(ポケモンwiki) https://wiki.ポケモン.com/wiki/ゆびをふる   「ゆびをふる大会」というゆびをふるのみを使った大会なども開催されているということもあり、ポケモンの技の中でも初代から長く愛されてきた1つです。で...

フリーランスのための値段交渉術!案件はこうやって見極めろ
フリーランス
フリーランスのための値段交渉術!案件はこうやって見極めろ

  「これもっと安くならない?」 「他の人はこれぐらいの金額でやってくれるよ」   こういった値切り交渉を受けたことがある人もいるのではないでしょうか?技術を提供するフリーランスであれば、金額を落とすということは自分の価値を下げているということを理解しておかなければなりません。 値段交渉...

【PHP】可変長引数とは「点(ドット)3つ」 多次元連想配列の検索
プログラミング
PHP
【PHP】可変長引数とは「点(ドット)3つ」 多次元連想配列の検索

可変長引数とは  引数の数が決まっていない、状況に応じて複数の引数を指定したいときに、関数の引数で指定する点(ドット)3つのことです。PHP5.6以降で使用することができます。  PHPマニュアル 可変長引数リスト https://www.php.net/manual/ja/functions.arguments.php#functions.variable-arg-list ...

カテゴリ

SEO対策 イベント デザイン ネットワーク ビジネスモデル フリーランス プログラミング マーケティング ライティング 動画編集 雑記

タグ

5G Adobe AfterEffects AI ajax amazon Animate api artisan atom Automator AWS Bluetooth CSS CVR description EC-CUBE4 ECショップ ESLint Facebook feedly foreach function Google Google AdSense Honeycode htaccess HTML IEEE 802.11ax Illustrator Instagram IoT JavaScript jQuery jQuery UI keyword LAN Laravel Linux MacBook MAMP meta MLM MySQL NoCode note OS OSI参照モデル Paypal Photoshop PHP phpMyAdmin PHPポケモン PremierePro rss SEO SEO対策 Sequel Pro Skype SNS SSH Symfony TCP/IP title Toastr Trait Twig Twitter UCC V系 WAN WebSub Wi-Fi wiki Windows WordPress XAMPP xml Xserver YouTube YouTuber Zoom アーティスト アウトプット アクセス層 アニメーション アフィリエイト イーブイ インターネット インプット エンジニア オブジェクト指向 お金配り クリック単価 クリック数 コミュニケーション能力 コロナ コンサルティング サムネイル システムエンジニア スタートアップ スタイルシート スパム データベース ディープフェイク デザイナー デザイン テレワーク ナンパ ニュース ネットワークモデル ノマドワーク バナー ピカチュウ ビジネス フィード フリーランス ブロガー ブログ プログラマー プログラミング プログラミング学習 プログラミング教育 プロトコル ホームページ制作 ポケモン マークアップ マーケティング メール リモートワーク レンダリング 三井住友 三宮 仕事依頼 児童デイ 児童デイサービス 児童発達支援 公開鍵 初心者 助成金 勉強法 営業 広告 広告収入 必勝マニュアル 放課後等デイサービス 朝活 楽天 深層学習 無線LAN 独立 神戸 福祉 秘密鍵 翻訳 自己啓発 英語 見積書 計算機 読書 起業 迷惑メール 配列 銀の弾丸 集客 雑学力