http-equiv="refresh" content="1;URL=//tktk1.net/skyrim/blog-category-.html"> http-equiv="refresh" content="1;URL=//tktk1.net/skyrim"> クラッシュを回避できるmod Crash Fixes - MOD紹介
Crash Fixes
Crash fixesダウンロード: LE版

(2018.8.14 設定項目すべてに解説付けました。)

その名のとおりクラッシュを回避できるmodの紹介です。ユーザー側で対策取りにくい、ぬるぽ(null pointer)などのメモリ周りのクラッシュ回避や、間違うと即CTDにつながりやすいnifのノードやスケルトン、あとはHavok領域などのクラッシュ回避です。スクリプト関連の修正はありません。


LE版はCrash Fixesを使ってください。

基本的には問題をスキップするmodです。これとは別に負荷対策やメモリ設定とはしっかりやっておきましょう。以下の記事を参考にしてください。

必須

Skyrim 1.9.32

CrashFixPlugin.ini

Skyrim\Data\SKSE\Plugins\CrashFixPlugin.iniにて設定ができます。 
=1でオン。=0にすればオフにできます。

デフォルトのままで問題ないと思いますが、UseOSAllocatorsは安定化や高速化に貢献するかもしれないのでチェックしておいてください。


UseOSAllocators=1

メモリー割り当てをOS標準に切り替えます。無限ロードやフリーズに効果的で、ロードを高速化します。SKSE等のメモリ設定は不要になります。しかし、環境によっては不安定になります。バックグラウンドアプリが多いと落ちやすいかも?

この機能を使うにはSKSE Plugin Preloaderが別途必要です。

  1. SKSE Plugin Preloaderをダウンロードします。
  2. SKSE Plugin Preloaderを展開し、d3dx9_42.dllをスカイリムのフォルダ(TESV.exeのあるフォルダ)に導入します。
  3. Crash fixesの三つのファイル(CrashFixPlugin.dll, -.ini, -.txt)をData\SKSE\Pluginsフォルダに導入します。
  4. CrashFixPlugin.iniUseOSAllocatorsの部分=1にして保存します。

RecordCrashInfo=1

ゲームが予期せずクラッシュした場合、関連する情報をクラッシュからData/SKSE/Plugins/CrashLog/crash_time.txtに書き込みます。SKSEプラグインが原因のクラッシュは記録されません。
パラメータが設定できます。
=1 この機能を有効にします。
=2 ファイル名にタイムスタンプを書き込まず、常にcrash_last.txtに書き込みます(デフォルトで上書きされます)
=4 メッセージボックスを表示する既知のクラッシュを無視しない
=8 ログを置き換えずにファイルがすでに存在する場合は追加する
=16 - ゲームが応答を停止したというメッセージボックスを表示しない

LogMessageToFile=1

エラーボックスに表示されるメッセージを「Data/SKSE/Plugins/CrashFixPluginLog.txt」ファイルに書き込む

WarnBadENB=1

ENB設定が正しくない場合、起動時にユーザーに警告します。

AlignHeapAllocate=0

用途不明の構造体(TESObjectLAND::unk_24 object)をmovaps命令で読み込むには16バイトのアライメントでなけれなばならないのですが、そうはなってないことでクラッシュします。この構造体のアライメントを揃えておくことで解決します。

環境によってはメモリ使用量が増えたり、ロードが長くなる問題があるのでデフォルトではオフになってます。また、環境によりますがENBのENBLocal.iniのReduceSystemMemoryを有効にしている場合は、この項目はオフしたほうがいい場合もあります。
ちなみに私の環境ではどちらも有効にしてますが、特に問題はないです。

StrCmp=1

モーション制御系で別スレッドでスケルトンが削除されてたときのクラッシュを回避します。非常に一般的な修正で広く効くそうなので特にオフにする理由はありません。

StrLen=1

NiNodeの名前を比較して片方がNullだとクラッシュするのを回避します。
これもオンでOK。

UnkUniqueId=1

セーブをロードするときのクラッシュを回避します。原因は不明。
Render650=1
セーブをロードするときのクラッシュを回避します。原因は不明ですが、おそらくレンダリングまわりとのこと。

UnkObjRef4D4EB0=1

コレも原因不明。何かのオブジェクト参照時?

NullSeenData=1

ゲームがロケーションのシーンデータを保存する時にそのデータがNullの時のクラッシュを回避します。

StringRefSetNull=1

BSFixedStringの引数がNullのときのクラッシュを回避します。Nullの時は無視してクラッシュするよりましとのこと。

SkipStrLenCrash=1

StrLen(文字列の長さ?)のクラッシュをスキップ。

bhvGraphUpdateLoad=1

ロード中のクラッシュを回避。おそらくモーション制御周りの何か。
一般的なクラッシュだそうです。

Unk11=1

ロード中のクラッシュ回避。おそらくレンダリング周り。

MissingNode=1

互換性のないskeletonを使用した時のエラー。直すのではなくメッセージが出るっぽい?

AlignHeapAllocate=1

地形に関するコンストラクタがちゃんと割り当てられてないクラッシュ?
uGridが高いと起きやすいクラッシュ。割り当てなのでこれだけちょっと別の機能のようです。

IndexError1=1

不明なアドレスの配列とインデックスのひも付けが行われたときに先にアドレスチェックしてクラッシュを回避します。

InitialAnimationLoad=1

iniのAnimation項目のbInitiallyLoadAllClipsと同じ効果のある設定。
こちらで設定した場合iniの設定は不要です。

MovementPlannerAgentWarp=1

エラー箇所の機能は謎ですがnull系。Nullの時は0返してスキップします。

UnallocatedMovaps=1

いくつかのHavokでのアニメーションオブジェクト(のvtable)で起こるクラッシュをスキップします。

CellNullCrash = 1

TESWorldSpace :: GetCellByCoordMask_4375D0がNull返したときのクラッシュをスキップします。

GetMainMagicEffect=1

MagicEffectでのNullをスキップします。

MountNodeCrash = 0

ゲームがノード "NPC COM [COM]"をアクターで検索してもノードが見つからなかった場合にクラッシュをスキップします。

MountNodeWarn = 1

人間型じゃないキャラが馬に乗った時にクラッシュします。そのような自体が発生した場合は警告メッセージを表示させます。非人間型を騎乗させるようなmodを外しましょう。

IKCrashWarn=1

起動してから初回のセーブのロード時(Foot IK設定中)にクラッシュする問題に対して警告メッセージを表示します。追加アニメーションが多すぎる場合に発生します。この警告が出た場合は、Load Game CTD Fixを導入しましょう。

RenderSave=1

セーブ用のサムネイル画像を作成するときにクラッシュをスキップします。

MoveControllerCast=1

呪文を放つときの移動コントロールでのNullクラッシュをスキップします。

SaveRenderCrash=1

セーブ用のサムネイル画像再度作成するときのNullクラッシュをスキップします。

NullLoadedNodeIgnore=0

破損したメッシュを無視します。なるべくそのようなメッシュは削除したほうがいいのでデフォルトはオフ。

NullLoadedNodeNotify=1

破損したメッシュがある場合は通知します。

NullActorBaseForm=1

ベースアクターの引数がNullのときにクラッシュするのを回避します。

AVSetCrash=1

ActorValueを変更しようとするActorが取得できない時にクラッシュします。スクリプトが遅延しているときよく起こります。

StringCount32 = 1

スクリプトが65535以上の文字列(Strings)を使用している場合、セーブゲームは壊れて読み込まれなくなります。文字列数が65520以上なら保存ファイル形式を少し変更することで回避します。
65520以下の場合はバニラの保存形式に戻ります。

WarnSKSEMemoryPatch = 1

SKSEメモリパッチが有効でない場合にメインメニューで警告します。警告は表示されますが、ゲームプレイはできます。

FixMovApsManuallyIfAlignedAllocateIsDisabled = 1

AlignHeapAllocateが無効になっている場合、その1つのmovapsによるクラッシュ修正します。これを有効にすることにデメリットはありません。

OverwriteArrayAllocator = 0

UseOSAllocatorsが1に設定されている場合は、配列アロケータを直接上書きします。テスト機能。

NullPlayerNode = 1

ワールドを描画中のプレーヤーのNiNodeがNullをスキップします。

NullBaseFormMove = 1

ObjectReferenceが移動可能かどうかのフラグでのNullクラッシュを回避。

NullRefNode = 1

ゲームはNiAVObjectの子ノードを反復しようとしますが、ターゲットがNiNodeでなく、子ノードを持つことができない場合のNullポインタークラッシュを回避。

NullOutf​​itEntry = 1

NPCの装備で何かが行われたときに1つ以上の項目がNULLがある場合、ゲームがクラッシュします。

ActorDeleteNullBase = 1

アクターが削除されていて、ベースフォームがNULLのときにクラッシュします。

DebugStream = 1

ゲームが最後に開いたファイルを追跡します。バイナリデータストリーム(NIFファイルなど)を読み込んでいるときにゲームがクラッシュした場合は、メッセージボックスのリストを表示します。破損したNIFファイルを追跡するのに役立ちます。

WarnTextureFailure = 1

テクスチャが作成できない場合に警告を表示します。

NullParentNode = 1

何かがBSFaceGenNiNodeのface genアニメーションで行われますが、親ノードがNULLのときクラッシュします。

RunAllocatorBenchmark = 0

デバッグ目的でゲーム起動時にアロケータベンチマークを実行し、結果をSkyrimフォルダの "AllocatorBenchmark.txt"に書き込みます。これはバニラ、整列したバニラ、malloc、整列したmallocおよびカスタムメモリブロックを比較します。メインメニューでゲームがテストを開始し、テストが完了したことを伝えるメッセージボックスが表示されるのを待ちます。その後、ゲームを終了してこのオプションを無効にします。
CountAllocatorBenchmark = 1000000
各サイズ(8,12,16)に割り当てるオブジェクト数。
TimesAllocatorBenchmark = 2
各テストを何回実行するか。
ThreadsAllocatorBenchmark = 1
同時に実行するスレッドの数。最も正確なのは1つのスレッドだけですが、パフォーマンスを確認するために2回試すこともできます。

CustomMemoryBlock = 0

小さなサイズのためのカスタムブロックアロケータを有効にします。メモリ断片化の問題に役立つことがあります。この項目はUseOSAllocatorsが有効になっていないと無効です。

CustomMemoryBlockTotalSizeMb = 64

カスタムブロックアロケータに割り当てられた総メガバイトを設定します。この量は各ブロック間で分かれている。CustomMemoryBlockが有効でない場合、効果はありません。

MemoryInfoConsole = 1

コンソールを開くと、各メモリブロックの使用率をパーセントで表示します。 CustomMemoryBlockが有効でない場合、効果はありません。これはCustomMemoryBlockTotalSizeMbの値を微調整するのに役立ちます。

EnderalSpecific = 1

modのEndera特有のクラッシュを修正します。 havokと関係があるようです。

FixUnsafeEffectList = 1

アクターのアクティブエフェクトリストはスレッドセーフがなく、複数のスレッドからアクセスされたり変更されたりします。各アクターのエフェクトリストにミューテックス(保護機能)が追加されます。

WarnNullCombatStyle = 1

アクターのコンバットスタイルがNULLの場合、ゲームがクラッシュします。これをユーザーに警告し、アクターのリファレンスとベースIDを表示しようとします。

HighFrequencyOSTimer = 0

OSのタイマー更新頻度を1ミリ秒(通常は約16)に設定し、GetTickCountをtimeGetTimeに置き換えます。これはデバッグ専用です!使用しないでください。パフォーマンスが低下することがあります。

HighFrequencyGameTimer = 0

ゲームのアップデートタイマーをより正確にする。これはデバッグ専用です!使用しないでください。

関連記事
  • このエントリーをはてなブックマークに追加



質問はDiscordツイッターだとすばやく回答できます。
コメント
tktk2016.01.25 01:45

>Warriorさん
ありがとうございます。私もそこまで明るいわけではないので、若干怪しいところもありますが。

まさにそのとおりで、通例の負荷/クラッシュ対策はしたほうがいいですし、基本的にスキップするのが多くて根本的に直すわけではないので、万能ってわけではないですね。

Warrior2016.01.25 01:17

Crash fixesの解説をしていただきありがとうございます。プログラム・コード関係には充分な知識がなく、CrashFixPlugin.iniの中の記述をどう訳したものか手をこまねいていたので、本当にありがとうございます。

tktkさんのサイトは多くの方が見られると思います。そこで蛇足ながら申しますと、このmod(SKSEplugin)は、あらゆるクラッシュをたちどころに解消する魔法のpluginではなく、充分に安定した環境でも残存してしまう、iniの変更等の一般的な調整では解消が難しい、いくつかの特定のクラッシュ要因に対応するというものです。そもそも不安定な環境に入れても状況が改善するとは限りません。