見出し画像

【0068】アイテム画面を作る⑧

前回はアイテム画面の性能問題にぶつかりました。

解決策として、
現在の持ち物リストにアイテムIDだけをもたせるのではなく
すべての(あるいはアクセス頻度の高い)情報を保持することにしてみます。

アイテムマスタを舐めるという行為が
アイテムを拾う(未実装)などの限られた処理に限定されるはずです
アイテムを拾う場合は、
アイテムマスタを舐めることには代わりありませんが、
ほとんどの場合、1件のみの処理になるだろうことを考えると
まあ許容できる範囲に収まるのではないかなと。

というわけで、持ち物画面もとい持ち物リストの非正規化と
それを盛り込んだアイテム画面表示への改修を行っていきます。

アイテム画面表示関数「joinFrameOnItem」のなかです。

 #テスト持ち物リスト 。アイテムIDのみ保持するのが厳しいためid以外にも情報を持つ
psnItemList=(
	'9001 +01宝塔 おでん'
	'9002 +02宝塔 おでん'
	'9003 +03宝塔 おでん'
	'9004 +04宝塔 おでん'
	'9005 +05宝塔 おでん'
	'9006 +06宝塔 おでん'
	'9007 +07宝塔 おでん'
	'9008 +08宝塔 おでん'
	'9009 +09宝塔 おでん'
	'9010 +10宝塔 おでん'
	'9011 +11宝塔 おでん'
	'9012 +12宝塔 おでん'
	'9013 +13宝塔 おでん'
	'9014 +14宝塔 おでん'
	'9015 +15宝塔 おでん'
	'9016 +16宝塔 おでん'
	'9017 +17宝塔 おでん'
	'9018 +18宝塔 おでん'
	'9019 +19宝塔 おでん'
	'9020 +20宝塔 おでん'
	'9021 +21宝塔 おでん'
)

テスト用の持ち物リストをこのように変更します。
これの以前は、一番左の9001〜9021までの番号だけを持った配列でしたが
今回からはスペースで区切られた各種情報を持った文字列の配列です。

当初はアイテムマスタと同じレイアウトかなと思っていたんですが
仮に拾う昨日を実装した場合、
アイテム情報を取得した後その内容を格納するので
修正値+修飾子+名称は結合した形になると思われますし
一旦持ち物として確定・格納された以上は、その方が都合がいいので
このような形に寄せていくことにします。

……略……
#上記で設定した反復数だけ、アイテム情報のはめ込みを行う
for ((i=0; i<$maxItemLine; i++)) {

     #アイテムリストのみ保持していた頃     #itemName="$(getItemDisp 0 $itemID)"
    #itemExplain="$(getItemDisp 1 $itemID)"
	
    #新しい方。
    #持ち物リストから転記
	args=($(echo ${psnItemList[$(( i + ( 16 * ($selPageID-1) ) ))]}|xargs))
	itemName="${args[1]}"
	itemExplain="${args[2]}"

	spCnt1=$(( (24-${#itemName})*2 ))
	spCnt2=$(( (23-${#itemExplain})*2 ))
	
	eval 'lnSeed[i+3]="${lnSeed[i+3]:0:4}$itemName`printf %${spCnt1}s`|$itemExplain`printf %${spCnt2}s`|`printf "%2s" '$((i+1))'`|"'
}

 #カーソル設置 lnSeed[$(($selCrsrID+2))]="${lnSeed[$(($selCrsrID+2))]:0:2}>${lnSeed[$(($selCrsrID+2))]:3}"
……略……

そんで、

     #アイテムリストのみ保持していた頃     #itemName="$(getItemDisp 0 $itemID)"
    #itemExplain="$(getItemDisp 1 $itemID)"
	
    #新しい方。
    #持ち物リストから転記
	args=($(echo ${psnItemList[$(( i + ( 16 * ($selPageID-1) ) ))]}|xargs))
	itemName="${args[1]}"
	itemExplain="${args[2]}"

こう変更しています。

以前は持ち物リストの中にあるアイテムIDを使用して
アイテムの表示情報を取得していたのですが
持ち物リストが非正規化されたので持ち物リストを直接xargsでパースして
はめ込むだけで住むようになりました。
この場に書いてあるコードで見ると減っていないように見えますが、
getItemDispはその向こうで更に関数を呼んでいるので結構重たいのですね。

さて、非正規化自体はさほど大変でもなかったです、案外すぐに出来ました。
問題はこの結果実際に早くなったかどうかです。
実行してみます。

画像1

(まあ恒例の改修前と同じ画面が出るだけで意味のないエビデンスですね、時間計測とかするの面倒で……)

実際には圧倒的に早くなっています。
これなら実用レベルでしょうっていう応答時間に収まっています。

これは改修の甲斐がありましたね。
持ち物リストは非正規化することにします。

全情報を非正規化するか、
アクセス頻度の高い情報のみ非正規化し余り使わない情報は従来通りに取得させるかは、
今後アイテムマスタの拡大やその多機能の実装に伴って変更していくことになると思います。
なんせまだアイテムの名前とくだらない説明を表示することしか出来ていませんから。


この記事が気に入ったらサポートをしてみませんか?