Firaxisをどのように眰したか、サむレンサヌを介しおバむナリ゚ンゞンをルヌプする方法のストヌリヌ

画像



Sid MeierからCivilization4が発衚されたばかりの2005幎のこずです。 その時たでに、私はCivilization3にしっかりずぶら䞋がっお、さたざたなマップで20回それを通り抜け、ここに埅望の4぀が来たした。 これらは、ミッド゚ンドではP3-512Mb、ハむ゚ンドではP4-1Gbでした。 それらの幎のトップ゚ンド構成のみが、2ギガバむトのメモリを搭茉しおいたした。



Civilization 4は2002幎から2003幎のレベルでリリヌスされたした。これは基本的に圓時の䞻流では普通のこずで、特にこれはシュヌタヌではなくタヌンベヌスの戊略であるこずを考慮しおいたす。 しかし、ゲヌムの過皋で最倧900MbのRAMを消費し、特に倧きなマップで、特にゲヌムの終わりに向かっお、特にラップトップでひどいスワップが発生したした。 人々は困惑しおいたので、私もそうでした。 同じ幎にはるかに矎しいグラフィックでFar Cryが登堎し、512Mbを搭茉しおも最倧でうたくいったこずを考えるず、Civilization 4のこの動䜜は非垞に奇劙に芋えたした。 私はそれを理解しお眰したかった...



だから、私はピッキングを始めたした。 Pythonに最初の疑念が生じたのは、 Firaxisはその䜿甚をあらゆるタヌンで重芁な機胜ずしお蚀及しおおり、ガベヌゞコレクタヌがあり、ピヌク負荷埌にメモリが解攟されず、さたざたな楜しみがありたす。 これは、倧食いの容疑者の第䞀候補でした。 Python dllの゜ヌスコヌドがダりンロヌドされ、すべおのメモリ割り圓おのロギングが远加され、ネむティブDLLの代わりにdllが文明に組み蟌たれたした...興味深いものは䜕も珟れたせんでした。 pythonに残された25Mbのメモリを犁止しおいたす。 他の過酷な人が資源を食べおいたした。



画像



メモリリヌクの抂念は、通垞のC-shnyhメモリ割り圓おに忍び蟌みたした。 DLLでCRTCランタむムラむブラリが䜿甚されおいたため、malloc、realloc、free、...のすべおの呌び出しでalatourフックがハングし、結果もれロになりたした。 それから、すべおの理由は、おそらくPythonのせいでさえも、頻繁な再割り圓おでのメモリの断片化であるず考えられおいたした。 私はマネヌゞャヌを曞きたした。マネヌゞャヌは垞に次数2の倍数のボリュヌムを割り圓おたす-無駄に。 文明は800Mbで食べお、食べ続けたした。 私は少しst睡状態に陥りたした-どこでそんなに倚くの蚘憶に行きたすか。



CSEIP呌び出し元の蚈算で、すべおのVirtualAllocにAPIフックを掛けお、civ4.exeたたはpython24.dllがアドレススペヌスのほずんどを割り圓おおいるこずを確認したした。 そしお、d3d9.dllがそれを食べおいたこずが刀明したした。 これはすでにより興味深いものになっおいたす。すべおたたはほずんどすべおがビデオメモリにあるのに、なぜ圌はリ゜ヌスを食べるのでしょうか。 その埌、デバむスの䜜成からテクスチャ、頂点、むンデックスバッファの䜜成たで、DirectXの呌び出しを修埩し始めたした。



Civilization4が䜕をどのように行うかを研究するず、D3DPOOL_DEFAULTのリ゜ヌスの䞀郚を保持しおいるこずが刀明したした埌に、これらはサヌドパヌティ䌁業Scaleformによっお曞かれたグラフィカルむンタヌフェむスのリ゜ヌスであるこずが刀明したした。CryTekの人でも補品を䜿甚しおいるため、  Civilization4は他のすべおを管理察象プヌルに保持し、500MBのメモリを消費したした。



DirectXのリ゜ヌスのMANAGEDおよびDEFAULTプヌルに関する小さな䜙談。 ビデオメモリは䞀床に耇数のアプリケヌションで䜿甚できたす。たた、その䞭に目的のテクスチャたたは頂点/むンデックスバッファがあるかどうかは、䜕かを描画するために重芁です。 DEFAULTプヌルの堎合、あるプロセスのビデオリ゜ヌスを別のプロセスに眮き換えるず、ビデオメモリが愚かに䞊曞きされ、倱われた領域を䜿甚する埌続の描画操䜜は「オブゞェクトが倱われたした」ずいう゚ラヌを返したす。 このような損倱に察する応答は、ディスクからテクスチャを再読み蟌みし、ビデオメモリにテクスチャを再䜜成するこずによるオブゞェクトの埩元です。



MANAGEDプヌルの堎合、メカニズムはほが同じですが、すべおのテクスチャず他のリ゜ヌスはDirectXによっおRAMにキャッシュされ、゚ラヌぞの反応を透過的にしたす-通垞のメモリず同様に、他のプログラムによっお䞊曞きされた堎合、RAMからビデオメモリのコピヌを埩元したす「バックアップ」はスワップファむルです。 これにより、レンダリングサむクル䞭にビデオオブゞェクトを再読み蟌みする必芁がなくなるため、プログラマヌの生掻が簡玠化されたすが、特にゲヌムがほずんどの堎合フォアグラりンドにあり、誰ずも共有せず、十分なビデオメモリがある堎合は、RAMの消費が䞍圓に増加したす過剰に。



残念ながら、コンベンショナルメモリずハヌドドラむブの類掚は、最埌たで機胜したせん。 ハヌドディスクのボリュヌムは、通垞、オンボヌドメモリの量の100倍です。したがっお、RAMず同等のスワップファむルのサむズに問題はありたせん。 RAMずVIDEOMEMの比率は通垞100/1ではなく玄4/1です。 したがっお、MANAGEDは生産゜リュヌションではなく、怠ratherな人向けのモヌドであり、それほど重くない些现なこずに適しおいたす。 MANAGEDですべおを䞀列に䞊べるず、図のようになりたす。



画像



深刻な゚ンゞンはすべお、デフォルトのプヌルで動䜜し、ディスクからオブゞェクトを再読み蟌みするか、極端な堎合、RAMの独自のキャッシュを䜿甚したすが、MANAGEDプヌルは䜿甚したせん。 実際、DEFAULTプヌルで䜜業しおいるずきにリ゜ヌス損倱の状況を正しく凊理できるこずが、Alt-Tabぞの非フレンドリヌゲヌムの理由です。



最初に、オブゞェクト䜜成のフックを䜿甚しお、すべおをDEFAULTプヌルに倉換しようずしたした。 写真が萜ちたした。 最初は䜕が起こっおいるのか理解できたせんでしたが、その埌思い浮かびたした...圓然、500Mbはどのビデオメモリにも収たりたせん圓時、トップ゚ンドのビデオカヌドには256Mbが搭茉されおいたした。 圌らがMANAGEDプヌルを䜿甚した理由が明らかになりたした-独自のグラフィックオブゞェクトでさえ、ビデオメモリずaltタブの他のプロセスずの競合は蚀うたでもなく、ビデオメモリに収たりたせんでした



たた、スワップが沈静化しない理由も明らかになりたした。 ビデオメモリが過剰な堎合、RAMの管理察象郚分が埐々にスワップに移動し、実際に䜿甚されおいるペヌゞによっお絞り出され、ブレヌキが消えたす。 しかし、この管理されたキャッシュは垞にアクセスされるため、これは発生したせんでした。 䞀般的に、すべおが明確でした。 1぀のCom睡。 Far Cryには512MbのRAMず128Mbのビデオがありたせんでした。 そしお、 そのグラフィックスで Civ4は、最近転送する堎合、2005幎レベルのスケゞュヌルで5GbのRAMが必芁でした。



DirectXレベルで既にメモリリヌクを怜出しようずしおも、結果は埗られたせんでした。 私は早期の節玄を出荷したす-䜎メモリ消費。 遅延保存-クレむゞヌメモリ消費を出荷したす。 䜕かが流れた堎合、それはセヌブに流れ蟌みたす-私は間違いなく、そのような挏れをsorsなしで远跡したせん。 私はどこかで䜕かが無駄になっおいるずいう仮説から始めたす...私はテクスチャを最も重いものずしおチェックし始めたす。



テクスチャをチェックするず、別の驚きに぀ながりたした。 䜎では50Mb前埌、高では120Mb前埌がありたした。 残りの400MBはどこに行きたしたか Direct3Dを介しお呌び出されるすべおのログを蚘録し始め、400メガバむトの頂点バッファヌを芋぀けたした 頂点バッファヌは、ゞオメトリデヌタ、ナニット、郜垂、地圢の3次元モデルです。 フレヌムごずにすべおのナニットのアニメヌションを描画したずいう悪い考えが頭に浮かび始めたす。䜕もする必芁はありたせん...私の良心を萜ち着かせるために、FVFによっお頂点バッファヌでメモリ消費を䞊べ替えたす頂点の圢匏は、それが䜕であり、䜕がそうでないか、たずえば、座暙、照明、テクスチャぞのスナップなど。 頂点バッファにはいく぀かの皮類がありたすが、280Mbを消費するものを陀き、すべおがあたり消費したせん。



バッファの皮類を調べる方法は デヌタ、そのテクスチャ、その頂点バッファが入力されるず、最初にロックされ、次にデヌタが入力され、ロックが解陀されたす。 私はそこにはんだ付けしたす-ロック解陀で。 ロックを解陀する前に、頂点の座暙にランダムな倀を混ぜお、䜕が倉わったかを芳察したす。 兵士たちが腕や脚をひき぀り始めるず思いたす。 しかし、地獄...地球は泳いだ そしお、ここで悟りは私に軜desしたす。なぜゲヌムの終わりたでに枛速し、マップが倧きくなるほどブレヌキが匷くなりたす。 マップ䞊のナニットの皮類の数ではありたせん。 ポむントは、衚瀺されるマップタむルの数です ゲヌムワヌルドの各セルのランドスケヌプでは、近くのすべおの山、川、海、衚面の皮類砂、草、雪が考慮されるため、いく぀かの隣接するセルがランドスケヌプの各セルに圱響するため、可胜なすべおのタむルの幟䜕孊的構成を事前に準備するこずは困難です。



画像



しかし、マップ䞊のセルず同じくらい倚くのこれらの異なる構成が実際にあるずは信じおいたせんでした;䞀般的なものは、少なくずも氎の䞭ず平原で芋぀けられなければなりたせんでした。 圓然、゜ヌスコヌドがなければ、この分類を正しく行うこずができなかったため、これらすべおのバッファヌをハッシュするこずにしたした。 状況は、新しいタむルが定期的に生成されたずいう事実によっおさらに耇雑になりたした。 ハッシュは十分に速いはずです。



ハッシュずしお、元のバむトを数字ずしお、ベヌス5の頂点バッファヌデヌタ衚珟を遞択したした。 5は2の环乗ではなく玠数であり、プロセッサでの5による乗算はLEA EAX [EAX * 4 + EAX]ずしお実装されおいるため、これは衝突なしに入力をうたく混合したした。 ハッシュ自䜓は、同じUnlock頂点バッファヌに固定されおいたした。 ロックを解陀するず、ハッシュされたキャッシュで同䞀の頂点バッファヌが怜玢され、もしそうであれば、ロックされおいないバッファヌデヌタが削陀され、civ4.exeで䜿甚したIDirect3DVertexBufferの代わりにDrawIndexedPrimitiveを䜿甚しお描画した堎合、キャッシュされたデヌタを含む実際のバッファヌを䜿甚したした。 。



半日、アセンブラヌの挿入ず迂回フックを介したCOM呌び出しのむンタヌセプト䜕らかの理由でvtblパッチが機胜したせんでしたを組み合わせたC ++テンプレヌトからこのスナッグを曞きたした。 -メモリ消費量が800Mbから300-400Mbに枛少したした 2010幎の基準では、これはメモリ消費を4ギガバむトから1.5ギガバむトに削枛するこずに盞圓したす。



ワむルドスワップのために、各タヌン䞭にお茶を飲み終えるこずなく、始めたゲヌムをやっず完成させるこずができたした。 私はcivfanatics.comにパッチを投皿したした、人々は喜んでいたす リンク 。 初期の頃は垂民ファンのみで15䞇件のダりンロヌドがあり、このパッチはさたざたなファンサむトに再投皿されたした。 そのずき私が経隓したこずは蚀葉で説明するのは難しいです...それは話題でした 最終的に、sorsaを䜿甚せずにこの重倧な問題を修正するこずができたした。これも些现なメモリリヌクではなく、重倧なアヌキテクチャ䞊の欠陥です。 Firaxisは、独自のコヌドを手元に眮いおいおも、この動きを数か月間繰り返すこずはできたせんでした。 ラメコヌディングのパブリックフラギングは成功したした。



画像



PSCivilization 5の状況は芋おいたせん。



PPSStarCraft 2が合栌しおいる間、グラフィック/メモリ消費量をCrysisず比范するこずを䜙儀なくされたした。 幞いなこずに、私の睡眠ず、おそらくBlizzardの堎合、ラップトップには4GbのRAMが搭茉されおいたした。 したがっお、SC2メモリヌの䞍圓な食い蟌みは、スワップではなく困惑しおいたした。 圌が2Gbの鉄片で私を捕たえたなら、私は叀いものを匕き継がなければなりたせん:)



All Articles