1

私のゲームではそれほどラグはありませんが、Timerの実行を減らすことでゲームのラグを大幅に減らすことができることを知っています。ゲームには複数Timerのがあります。これはTimer、プレイヤーの位置やすべての障害物などのすべてを更新するものがあるためです。次に、Timer取得できるパワーアップを削除するために使用する他の があります。

たとえば、Timer初期遅延が 5000 に設定されているものがあります。1 回実行すると (1 回だけ実行されます)、特定のパワーアップが削除され、Timer初期遅延が 20 000 に設定されている別のものがあります。各タイマーの異なる遅延を維持しながら、現在使用しているフィーバーを 1 つまたは少なくとも 1 つしか使用しないようにするにはどうすればよいですか?

これを使用PriorityQueueまたはScheduledThreadPoolExecutor達成するために使用できる方法はありますか? もしそうなら、どのように?

4

2 に答える 2

0

「すべてを更新する」タイマーがあるのはなぜですか? 更新は常にノンストップで実行する必要があります。(ゲームを一定の FPS に制限したい場合を除きます)
「ゲーム ループ」の悪用を検討する必要があります。

While Game Is Running
    Update() 
    Draw() 
End While

ゲームでラグを発生させたくない場合は、プレイヤーの位置などを常に更新することを検討する必要があります。とはいえ、位置などを更新するときは、経過時間に対してそれらを相対的に作成する必要があります。前回 Update() が実行されてから。

常に Update() を呼び出していない場合は、使用するスレッド パターンに関係なく遅延が発生します。

于 2013-05-18T20:49:48.113 に答える
0

scheduleでタスクをScheduledThreadPoolExecutor実行し、同じタスクを再度実行する場合は、別の遅延でスケジュールを再設定します。

もう 1 つのオプションはDelayQueue、実行したいタスクを保存するために a を使用し、別のスレッドを使用しtakeてキューから runnables を実行することです。と同様にScheduledThreadPoolExecutor、ランナブルを再度実行したい場合は、新しい遅延でキューに戻す必要があります。

ScheduledThreadPoolExecutorでは、タスクを一定の遅延後に継続的に実行するようにスケジュールできますが、 では、実行後にタスクDelayQueueをキューに戻し続ける必要があります。

于 2013-05-18T20:21:19.897 に答える