mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-26 11:48:55 +01:00
internal/clock: Simplify the logic to calculate tick per frame
Updates #1444 Updates #1597
This commit is contained in:
parent
2e6ecc766d
commit
2534b78755
@ -29,8 +29,6 @@ var (
|
|||||||
|
|
||||||
currentFPS float64
|
currentFPS float64
|
||||||
currentTPS float64
|
currentTPS float64
|
||||||
lastTPS int64
|
|
||||||
tpsCalcErr int64
|
|
||||||
lastUpdated int64
|
lastUpdated int64
|
||||||
fpsCount = 0
|
fpsCount = 0
|
||||||
tpsCount = 0
|
tpsCount = 0
|
||||||
@ -59,35 +57,11 @@ func CurrentTPS() float64 {
|
|||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
func min(a, b int64) int64 {
|
func max(a, b int64) int64 {
|
||||||
if a < b {
|
if a < b {
|
||||||
return a
|
|
||||||
}
|
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
return a
|
||||||
// calcTPSFactor calculates the TPS that is used for the timer and the factor for the count.
|
|
||||||
// newTPS × factor should be equal to tps on average.
|
|
||||||
// If tps is equal to or lower than the baseTPS, newTPS equals to tps. The factor is 1.
|
|
||||||
// This means that the timer precision should be already enough.
|
|
||||||
// Otherwise, newTPS is euqal to baseTPS. The factor can be more than 1.
|
|
||||||
func calcTPSFactor(tps, baseTPS int64) (newTPS int64, factor int) {
|
|
||||||
if tps <= baseTPS {
|
|
||||||
return tps, 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if lastTPS != tps {
|
|
||||||
tpsCalcErr = 0
|
|
||||||
}
|
|
||||||
lastTPS = tps
|
|
||||||
|
|
||||||
factor = int(tps / baseTPS)
|
|
||||||
tpsCalcErr += tps - baseTPS*int64(factor)
|
|
||||||
|
|
||||||
factor += int(tpsCalcErr / baseTPS)
|
|
||||||
tpsCalcErr %= baseTPS
|
|
||||||
|
|
||||||
return baseTPS, factor
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func calcCountFromTPS(tps int64, now int64) int {
|
func calcCountFromTPS(tps int64, now int64) int {
|
||||||
@ -106,12 +80,9 @@ func calcCountFromTPS(tps int64, now int64) int {
|
|||||||
count := 0
|
count := 0
|
||||||
syncWithSystemClock := false
|
syncWithSystemClock := false
|
||||||
|
|
||||||
// When TPS is big (e.g. 300), the timer precision is no longer reliable.
|
// Detect whether the previous time is too old.
|
||||||
// Multiply the factor later instead (#1444).
|
// Use either a 5 ticks or 5/60 sec in the case when TPS is too big like 300 (#1444).
|
||||||
var tpsFactor int
|
if diff > max(int64(time.Second)*5/tps, int64(time.Second)*5/60) {
|
||||||
tps, tpsFactor = calcTPSFactor(tps, 60) // TODO: 60 should be the current display's FPS.
|
|
||||||
|
|
||||||
if diff > int64(time.Second)*5/tps {
|
|
||||||
// The previous time is too old.
|
// The previous time is too old.
|
||||||
// Let's force to sync the game time with the system clock.
|
// Let's force to sync the game time with the system clock.
|
||||||
syncWithSystemClock = true
|
syncWithSystemClock = true
|
||||||
@ -135,7 +106,7 @@ func calcCountFromTPS(tps int64, now int64) int {
|
|||||||
lastSystemTime += int64(count) * int64(time.Second) / tps
|
lastSystemTime += int64(count) * int64(time.Second) / tps
|
||||||
}
|
}
|
||||||
|
|
||||||
return count * tpsFactor
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateFPSAndTPS(now int64, count int) {
|
func updateFPSAndTPS(now int64, count int) {
|
||||||
|
Loading…
Reference in New Issue
Block a user