Long weekend

つい2-3週間前までCherryが$1.99/lbsという格安の値段で売られていたので毎週買っていた。昨日会社を出てから、買い物をしたときにそういえばもうCherryは終わりかなと、Fruitsのコーナーを覗いてみたらもう終わっているようで。かわりにPeachとAppleが山積みになっていたので、小さめのAppleが3lbs入ったものを買う。3lbsで$2.69なので結構安い。Peachも買おうかなと思ったんだけど、とりあえずAppleを全部消費してからにしよう。

この週末は7日がLabor DayでHolidayとなるのでLong Weekendとなる。今週は暑いのと忙しいので随分疲れた感じなので、ちょっと出かけてもいいかもとか思ったんだけど、Newsを見たらこのLabor Day Weekendはかなり車で外出する人が…ということなのでとりあえずパス。

昨夜は一通りすることを終えてから、Oblivionを起動して、Beta ModのTestを兼ねてNew GameからRunthrough。Leveled Listの確認が主なので、Levelを変えながらあちこち移動したり、あるいはMain Questを駆け足で進めてみたり。そんな事をしていると、KvatchでSavlian MatiusがPCをLeadするはずの場面で、AIがきちんと動作していないのに気づく。Berich InianもDialogueだけがAvailableできちんとPCをLeadしない。とりあえずCheatしつつ、再度同じようにQuestを進めてみると同じようにAIが正常に動作しなくなる感じ。

SavilanはOKだけどBerichは駄目とか、あるいは両方きちんと動作したりと中々不定な動作だ。Test環境なので、最小限の構成で…のはずなんだけど、どういうわけか2-3回に1回はどうにもならなくなるというか。しょうがないのでINIを戻したり、MODsをDisableにしてみたりとか…結局のところOblivion Stutter Removerを外したところ、5-6回繰り返しても問題は起きていないので、恐らくOblivion Stutter Removerによるものなんだろうと言うことに。全体的にかなり良い感じではあるんだけど、まだSide Effectが…ということで名残惜しいけど、暫く外して様子を見よう。

それから久々にMainのPCで1時間半ほど遊んでみると、なんというかSaveに時間がかかるように。OBSE co-saveファイルを調べるとOblivion XPのArrayの残骸か何かに見えるようなものが大量に見えるので、OBSE 0018とOblion XPの組み合わせはいまだにco saveファイルの問題が残っているようだ。AuthorはMain LogicをESPではなく、OBSEのPluginとしてC++で書き直すということなので、解決はそれまで待たないと、というところか。

OBSE 0016でString型が、OBSE 0017でArray型が導入されて、最近のMODsではこれらを使ったものも多いんだけど、なんというかこれって使わなくても…と思うような使い方をしているのが多い。Oblivion XPは、内部で巨大なArray Dataを保持していて、ar_Findでそこから探してくるという使い方をしているので、これはこれでArrayを使わないで書くのは大変だと思うけれど、ar_Findは処理のコストが結構大きい。SortされていないArrayなのでBinary Searchとかが使えるわけではなくて、単純に要素のLowからHighまでをLoopでまわして探しているわけで。この辺を考えればOblivion XPを入れてかなり負荷がかかる(我が家の環境だと4-7FPS位下がる)のも納得というところ。もっとも、それほど気にならないというか、V3からV4では大幅に最適化されているので、納得して使えるというところ。

ただ、一つ一つCheckしていくと、特にこれはArray/Stringは必要ないのにというMODはそれなりにあったり。OBSEの配列は、最初に要素数を宣言しているわけでもないので、Vectorな配列ということで、値を取り出すのも、あるいはArrayのSizeが変わるときのコストもそれなりにかかるし、Constructのコストはもちろん結構なものがあるだろう。もちろん全体の中で見ればそれほど、というところだけど、Array/StringをConstructしまくるMODがあると重くなるだろうなというところ。

Cusomisable HUDが、INIファイルを読むたびにsv_Contructしていたりするので、OBSE 0018で使った時にHudを6つとか設定していると、Loadのたびに400KBとかco saveファイルが増えて行ったりするので外しているけれど、他のOBSEを使うMODを調べてArray/Stringの使い方に問題のありそうなものを全部外してみたら、Gameがそれなりに軽くなって結構快適。そういえば0015まではこんな感じだったかなというところだ。

Stringは明示的にDestructしないとおもいっきりLeakする。その変数がMODがLoadされる限り使用されるなら、MODの一番最初の初期化の際に初期化してDestructしないとかは理解できるけれど、毎回LoadのたびにDestructせずにConstructとかは意味不明というか。そういう意味不明な処理が記述されているMODも結構あったり。ArrayはStringに比較すればまだ安全ではあるけれど、(Reference Counterが0になるとOBSE側で廃棄する。)必要が無くなったら明示的にDestructする習慣をつけたほうが良いかなという感じ。結構多いのは、co-saveファイルをLoadした時点でArray/Stringなどは、Saveからデータが読み出されているんだけど、毎回LoadのたびにConstructをCallするとか頭痛がしてくるようなMODもそれなりに。ArrayVar:create(OBSE内部の処理だ)では該当のar_varがすでに領域確保済みかどうかをCheckしている形跡は無いので、Loadするたびにar_Constructを呼び出せば、何が起きるんだろうというところ。恐らくは目立たないけれど(配列のSizeにも依存するだろう)、ごみと化してco saveファイル内に蓄積されていく(=Memory Leak)ということになるのかなという感じだ。Reference CountをCheckしようにも、すでにその領域の参照先はどの変数にもSetされていないということになるわけで。

Oblivion XPはScriptが結構大きいので、追いかけ切れていないけれど、StringではなくてArrayのごみに見えるものがco saveファイルに残っているのは、恐らく2重にConstructをしていることによるものかなという気がする。もっとも0017では何とかなっているような感じなので、save hook辺りの処理が変わっているのかもしれない。

結局のところ、毎回同じStringしか使わないなら文字列をそのままScriptに書いたほうが良いだろうし、あるいは要素数がせいぜい7-8個で配列というのもちょっとどうだろうという感じ。Scriptの可読性とか、そういう意味では意義があっても、Game ModとしてはCost的に疑問を感じるところだ。Oblivion自体がそれなりに重いわけなので、MODであえてさらに重くするMethodを選択しなくてもいいんじゃないかなと思う。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中