Optymalizacja wyświetlania
This commit is contained in:
@ -1,18 +1,43 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"flag"
|
||||
"gol/gol"
|
||||
"gol/term"
|
||||
"log"
|
||||
"os"
|
||||
"os/signal"
|
||||
"runtime/pprof"
|
||||
"syscall"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
cpuprofile := flag.String("cpuprofile", "", "write cpu profile to file")
|
||||
flag.Parse()
|
||||
|
||||
// Jeśli podano flagę cpuprofile, rozpocznij profilowanie
|
||||
if *cpuprofile != "" {
|
||||
f, err := os.Create(*cpuprofile)
|
||||
if err != nil {
|
||||
log.Fatal("could not create CPU profile: ", err)
|
||||
}
|
||||
defer f.Close()
|
||||
if err := pprof.StartCPUProfile(f); err != nil {
|
||||
log.Fatal("could not start CPU profile: ", err)
|
||||
}
|
||||
defer pprof.StopCPUProfile()
|
||||
}
|
||||
game()
|
||||
}
|
||||
|
||||
func game() {
|
||||
// arenas - front one is printent, then new state is calculated into back one
|
||||
// next front and back are switched
|
||||
front := gol.New(20, 40)
|
||||
back := gol.New(20, 40)
|
||||
|
||||
// draw initial objects
|
||||
// glider
|
||||
front[0][3] = true
|
||||
front[1][4] = true
|
||||
@ -21,35 +46,40 @@ func main() {
|
||||
front[2][4] = true
|
||||
|
||||
// cross
|
||||
|
||||
front[16][21] = true
|
||||
front[17][21] = true
|
||||
front[18][21] = true
|
||||
|
||||
// catch interrupt signals
|
||||
sigs := make(chan os.Signal, 1)
|
||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
|
||||
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
|
||||
|
||||
// initialize screen
|
||||
term.StartFullscreen()
|
||||
term.TurnCursor(term.CursorOff)
|
||||
|
||||
loop := func() {
|
||||
ticker := time.NewTicker(250 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
for {
|
||||
term.GoHome()
|
||||
front.PrintMe()
|
||||
front.NextGen(back)
|
||||
front, back = back, front
|
||||
select {
|
||||
case <-sigs: // przerwanie
|
||||
return
|
||||
case <-ticker.C: // upłynął czas do kolejnej generacji
|
||||
}
|
||||
defer restoreScreen()
|
||||
|
||||
// setup timer
|
||||
ticker := time.NewTicker(250 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
|
||||
mainLoop:
|
||||
for {
|
||||
term.GoHome()
|
||||
front.PrintMe()
|
||||
front.NextGen(back)
|
||||
front, back = back, front // switch arenas
|
||||
select {
|
||||
case <-sigs: // interrupt (Ctrl-C etc)
|
||||
break mainLoop
|
||||
case <-ticker.C: // wait for next tick
|
||||
}
|
||||
}
|
||||
defer func() {
|
||||
term.FinishFullscreen()
|
||||
term.TurnCursor(term.CursorOn)
|
||||
}()
|
||||
loop()
|
||||
}
|
||||
|
||||
// restoreScreen switch back terminal to normal mode.
|
||||
func restoreScreen() {
|
||||
term.FinishFullscreen()
|
||||
term.TurnCursor(term.CursorOn)
|
||||
}
|
||||
|
Reference in New Issue
Block a user