Ich habe dieses einfache OpenGL-Programm in Go.Golang fmt.Println() verursacht Spielabsturz
Wenn ich es kompiliere und ausführe, durchläuft die Hauptspielschleife ungefähr 9 Iterationen, bevor sie mit einer Segmentierungsverletzung abstürzt.
rendering for the 0 time
rendering for the 1 time
rendering for the 2 time
rendering for the 3 time
rendering for the 4 time
rendering for the 5 time
rendering for the 6 time
SIGSEGV: segmentation violation
PC=0x7fdab95a0e29
signal arrived during cgo execution
runtime.cgocall(0x414f90, 0x7fdab9887e88)
/usr/lib/go/src/pkg/runtime/cgocall.c:149 +0x11b fp=0x7fdab9887e70
github.com/go-gl/gl._Cfunc_glClear(0xc200004100)
github.com/go-gl/gl/_obj/_cgo_defun.c:340 +0x31 fp=0x7fdab9887e88
github.com/go-gl/gl.Clear(0x4100)
/mnt/data/Dropbox/Coding/Go/src/github.com/go-gl/gl/gl.go:161 +0x25 fp=0x7fdab9887e98
main.draw()
/home/josh/Coding/Go/src/github.com/JoshWillik/Wander/wander.go:120 +0x25 fp=0x7fdab9887eb8
main.main()
/home/josh/Coding/Go/src/github.com/JoshWillik/Wander/wander.go:52 +0x300 fp=0x7fdab9887f48
runtime.main()
/usr/lib/go/src/pkg/runtime/proc.c:220 +0x11f fp=0x7fdab9887fa0
runtime.goexit()
/usr/lib/go/src/pkg/runtime/proc.c:1394 fp=0x7fdab9887fa8
goroutine 3 [syscall]:
runtime.goexit()
/usr/lib/go/src/pkg/runtime/proc.c:1394
rax 0x0
rbx 0x7fdab9887e88
rcx 0x7fdab9887e88
rdx 0x7fdab9887e20
rdi 0x4100
rsi 0xc210001900
rbp 0xc21002a000
rsp 0x7fdab2a4ddd8
r8 0xc210001120
r9 0x7fdab9887e20
r10 0x0
r11 0x286
r12 0x0
r13 0x7fdab9a74000
r14 0x0
r15 0x7fdab2a4e700
rip 0x7fdab95a0e29
rflags 0x10202
cs 0x33
fs 0x0
gs 0x0
Wenn ich die zeitbasierte Logik in der shouldRender
Funktion zu entfernen, macht es zu etwa 28-29 Wiederholungen vor dem Absturz.
Wenn ich den Anruf zu gl.Clear()
in der draw
Funktion entfernen, dauert es in den 90er Jahren vor dem Absturz.
Wenn ich den Anruf zu fmt.Println()
in shouldRender
entfernen, wird das Spiel wie erwartet ausgeführt, ohne abzustürzen. (Ich habe es bis zu etwa 2 oder 3 Minuten getestet, also fast 10 000 Frames)
Das lässt mich vermuten, dass der Anruf an fmt.Println()
irgendwie für die Segmentierungsverletzung verantwortlich ist. Verkenne ich die Zeichen falsch? Wenn nicht, wie ist eine Kernfunktion wie Println()
so instabil?
Was bedeutet der Code "_ = grün;" machen? – PaulQ
Nur halbwilde Vermutung: versuch, runtime.LockOSThread() an den Anfang von main zu setzen und den Code mit Println auszuführen. Wenn es gut läuft, denke ich, dass ich die Antwort kenne. – LinearZoetrope
@PaulQ, '_ = grün' lässt den Go-Compiler ignorieren, dass ich nie' grün' für irgendwas verwende – JoshWillik