0

私の問題はかなり複雑で、潜在的に不可能ですが、ここに行きます:

C++ を使用して、現在、私のゲーム プロジェクト用のユニバーサル サーバー エンジンに取り組んでいます。エンジンのすべての部分が起動後に動的にロードされるため、ユニバーサル。これで、ゲーム オブジェクトもベース オブジェクトから継承され、「シミュレート」関数がオーバーロードされます。そうすれば、すべてのオブジェクトが固有の動作を持ち、解釈された lua スクリプト ファイルよりもはるかに高速な「C++ スクリプト」と呼ばれる処理を実行できます。また、よりダイナミックです。(「動的リンクを忘れてください、それは正気ではありません」のように、C++の「スクリプト」部分を殺すような解決策はしないでください。私は大きなボクセルマップを扱っているので、このパフォーマンスの向上は完全に必要です)

私の問題:

それは確かにたくさんの.dll / .soファイルであり、それらを単純なアーカイブにパックしたかったので、上記のソースコードでzlibを使用し、おそらくすべてをテクスチャとサウンドとともに小さな「オブジェクトパッケージ」にパックできます。現在、Windows DLL API と Linux SO API では、メモリ アドレスから dll/so ファイルを読み込むことができません。それらのファイルは数百から数千あり、ロード時間が大幅に増加するため、これらのファイルをファイルシステムに解凍して一時的に保存する必要はありません。また、ブーストのような外部依存関係には興味がありません。

だからここに私の質問があります:

実際のパスを使用してメモリ内に仮想ファイルを作成するためのクロスプラットフォームの方法はありますか? そうすれば、HDD の遅い IO 速度を回避できます。

それとも、最新のオペレーティング システムのファイル バッファは、これらのファイルをすべてディスクに書き込めないほど高速でインテリジェントであるため、一時ファイルを使用することはそれほど大したことではないのでしょうか? (実際、Linux は仮想ファイル システムをサポートしていますが、Windows はサポートしていません...)

皆さんが私を助けてくれることを願っています:)

4

1 に答える 1

1

確かにwinapiではありませんが、手動で行うことができます。それをメモリにロードし、インポート テーブルに入力し、エクスポートされた関数を呼び出すことができます (DllMain を呼び出した後)。誰かが実際にその方法で新しいプロセスを作成したプログラムを見ました...詳細についてはPEのドキュメントを参照してくださいが、機能します。

また、PE インポート テーブルを見つけて、ダイナミック リンカと同じようにジャンプとアドレスを入力するだけでよいため、比較的簡単に実行できます。DLL には位置に依存しないコードが含まれているため、再配置は必要ありません。

Linuxでも同じはずです(elf構造のみを使用)が、仮想ファイルシステムを使用したより良いソリューションがある場合は、それを使用する必要があります。

于 2012-08-11T02:30:44.793 に答える