私は基本的に1/60秒ごとに更新されるJavaでゲームを開発しています。このような更新の間に、多くのデータが作成され、渡され、次に参照されずに残され、このデータをDTOと呼ぶことができます。私の理解では、JVMとOSはこのデータをプログラムのヒープに格納します。 JAVA GCが実行されるまでヒープが構築されます。これは、参照されていないすべてのデータを空きとしてマークし、再利用できる状態にします。一時的なヒープを作成して使用する
今、私はそれを見て、これは不必要であり、時々遅れがちです。私が問題を解決したいのは、一時的なヒープとして使用するメモリの割り当てられたチャンクを持つことです。このヒープは、更新間隔中に作成して渡すすべての一時的なものを保存するために使用されます。更新が終わったら、分析は必要ありませんが、チャンク全体がフリーであり、更新後に同じヒープスペースアップデートを再利用するという単純なことができます。テール再帰的スタックフレームのようなもの。
もう1つの解決策は、変更可能なDTOオブジェクトのみを使用し、それらの束を割り当てて再利用することですが、私は可能な限り不変なものを作る利点を利用したいと思います。
は、これは私がコードで何を意味するかを説明するための努力です:
void start(){
Data data = System.allocateDatainMb(500); //allocate 500Mb of virtual memory
MagicHeap() mh = System.createAMagicHeap(data); //make a heap of it
mh.use(); //set all constructors to allocate on this heap
while(true){
update();
mh.clear();
}
}
void update(){
TmpData dto = Gamesystem.createALargePieceOfTemporaryData();
someClass.doUpdateStuff(dto);
}
私はJavaはメモリを管理する方法とあまり慣れていないんだけど、私はあなたが私の意味を取得願っています。
ある程度可能ですか?
いいえ。 Javaはこれらの技法に適した言語ではありません。 C++に切り替えるか、オブジェクトを再利用してください。 – RealSkeptic
なぜこれが問題だと思うのですか?あなたは実際にGCがあなたのプログラムを遅く停止することに気づいたことがありますか?そうでなければ理由がないと心配しているかもしれません。 – puhlen
私は特に心配していませんし、本当の問題もありません。しかし、GCは目立つが、私は主に好奇心から尋ねた。 – Jake