[解決済み] Javaメインゲームループ
2022-02-20 03:04:27
質問内容
私はゲームのループを書いています。 こちら . 私はまた、ゲームループを行う他の方法、例えば、から見てきました。 この記事 . でも、どれもうまくいかなかったんだ。だから、最初のリンクのものを使い続けました。
知りたいこと
-
ゲームループの書き方はこれで良いのでしょうか?
- 何か提案はありますか?
-
を使用する必要があります。
Thread.sleep();
をゲームループで使用することはできますか?
以下は私の現在のコードです。
public void run(){
long lastLoopTime = System.nanoTime();
final int TARGET_FPS = 60;
final long OPTIMAL_TIME = 1000000000 / TARGET_FPS;
long lastFpsTime = 0;
while(true){
long now = System.nanoTime();
long updateLength = now - lastLoopTime;
lastLoopTime = now;
double delta = updateLength / ((double)OPTIMAL_TIME);
lastFpsTime += updateLength;
if(lastFpsTime >= 1000000000){
lastFpsTime = 0;
}
this.updateGame(delta);
this.repaint();
try{
Room.gameTime = (lastLoopTime - System.nanoTime() + OPTIMAL_TIME) / 1000000;
System.out.println(Room.gameTime);
Thread.sleep(Room.gameTime);
}catch(Exception e){
}
}
解決方法は?
最終的には、次のようなものに移行したいと思うでしょう。 LWJGL でも、今は今やっていることを続けてください。基礎的なことを学ぶことができます。
ループの作成、お疲れ様でした。いい感じですね!少しアドバイスをさせてください。
-
リペイントはすぐに画面をレンダリングするわけではありません。それは リペイントマネージャ が準備でき次第、レンダリングする。使用方法 <ストライク 無効化 paintImmediately の代わりに
paintImmediately
はコンポーネントが再描画されるまで実行をブロックするので、レンダリング時間を測定することができます。 -
Thread.sleep
通常、数ミリ秒のドリフトがあります。ループがCPUを使いすぎないようにするために使うべきですが、10ミリ秒スリープしたら5ミリ秒スリープするかもしれないし、20ミリ秒スリープするかもしれないことを理解しておいてください。 -
最後に
double delta = updateLength / ((double)OPTIMAL_TIME);
もし
updateLength
が OPTIMAL_TIME よりも小さい場合、update を呼び出さない。言い換えれば、デルタが1より小さい場合、アップデートを行わない。 このチュートリアル は、その理由を私よりもうまく説明してくれています。
関連
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】Android Studioでタスク :app:compileDebugJavaWithJavac の実行に失敗しました。
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】「java -cp」と「java -jar」の違い?
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】Eclipseで「JUnitテストが見つかりませんでした。
-
[解決済み】Ubuntu: OpenJDK 8 - パッケージを見つけることができません。
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない