optimized redraw o decrease cpu usage
This commit is contained in:
43
src/main.nim
43
src/main.nim
@@ -31,8 +31,6 @@ var
|
|||||||
evt = sdl2.defaultEvent
|
evt = sdl2.defaultEvent
|
||||||
quit = false
|
quit = false
|
||||||
freeze = true
|
freeze = true
|
||||||
# fpsman: FpsManager
|
|
||||||
# fpsman.init
|
|
||||||
|
|
||||||
let side = 5
|
let side = 5
|
||||||
let
|
let
|
||||||
@@ -54,6 +52,7 @@ var
|
|||||||
xform : X2d = identity[3, float32]()
|
xform : X2d = identity[3, float32]()
|
||||||
uxform : X2d = identity[3, float32]()
|
uxform : X2d = identity[3, float32]()
|
||||||
pan_start : Option[P2d] = none[P2d]()
|
pan_start : Option[P2d] = none[P2d]()
|
||||||
|
invalidate = true
|
||||||
|
|
||||||
proc main_loop(arg : pointer) {.cdecl.} =
|
proc main_loop(arg : pointer) {.cdecl.} =
|
||||||
let windowSize = block:
|
let windowSize = block:
|
||||||
@@ -65,6 +64,8 @@ proc main_loop(arg : pointer) {.cdecl.} =
|
|||||||
of QuitEvent:
|
of QuitEvent:
|
||||||
quit = true
|
quit = true
|
||||||
break
|
break
|
||||||
|
of WindowEvent:
|
||||||
|
invalidate = true
|
||||||
of KeyDown:
|
of KeyDown:
|
||||||
let keyboardEvent = cast[KeyboardEventPtr](addr(evt))
|
let keyboardEvent = cast[KeyboardEventPtr](addr(evt))
|
||||||
case keyboardEvent.keysym.sym:
|
case keyboardEvent.keysym.sym:
|
||||||
@@ -72,10 +73,13 @@ proc main_loop(arg : pointer) {.cdecl.} =
|
|||||||
freeze = not freeze
|
freeze = not freeze
|
||||||
of 'h'.int:
|
of 'h'.int:
|
||||||
uxform = identity[3, float32]()
|
uxform = identity[3, float32]()
|
||||||
|
invalidate = true
|
||||||
of 'c'.int:
|
of 'c'.int:
|
||||||
current_grid[].clear()
|
current_grid[].clear()
|
||||||
|
invalidate = true
|
||||||
of 's'.int:
|
of 's'.int:
|
||||||
next_step(current_grid[], next_grid[])
|
next_step(current_grid[], next_grid[])
|
||||||
|
invalidate = true
|
||||||
of '['.int:
|
of '['.int:
|
||||||
if step > 0u:
|
if step > 0u:
|
||||||
step -= 1
|
step -= 1
|
||||||
@@ -95,6 +99,7 @@ proc main_loop(arg : pointer) {.cdecl.} =
|
|||||||
let row = position.x.int
|
let row = position.x.int
|
||||||
let column = position.y.int
|
let column = position.y.int
|
||||||
current_grid[][row, column] = not current_grid[][row, column]
|
current_grid[][row, column] = not current_grid[][row, column]
|
||||||
|
invalidate = true
|
||||||
else:
|
else:
|
||||||
discard
|
discard
|
||||||
of MouseButtonUp:
|
of MouseButtonUp:
|
||||||
@@ -104,6 +109,7 @@ proc main_loop(arg : pointer) {.cdecl.} =
|
|||||||
let xlation = newP2d(mouseButtonUpEvent.x.float32, mouseButtonUpEvent.y.float32) - pan_start.get()
|
let xlation = newP2d(mouseButtonUpEvent.x.float32, mouseButtonUpEvent.y.float32) - pan_start.get()
|
||||||
pan_start = none[P2d]()
|
pan_start = none[P2d]()
|
||||||
uxform = uxform * xlate(xlation.x, xlation.y)
|
uxform = uxform * xlate(xlation.x, xlation.y)
|
||||||
|
invalidate = true
|
||||||
else:
|
else:
|
||||||
discard
|
discard
|
||||||
of MouseWheel:
|
of MouseWheel:
|
||||||
@@ -117,6 +123,7 @@ proc main_loop(arg : pointer) {.cdecl.} =
|
|||||||
uxform = uxform * scale(zoomCenter, 1.1f32, 1.1f32)
|
uxform = uxform * scale(zoomCenter, 1.1f32, 1.1f32)
|
||||||
else:
|
else:
|
||||||
uxform = uxform * scale(zoomCenter, 0.9f32, 0.9f32)
|
uxform = uxform * scale(zoomCenter, 0.9f32, 0.9f32)
|
||||||
|
invalidate = true
|
||||||
# of MouseMotion:
|
# of MouseMotion:
|
||||||
# let mouseMotionEvent = cast[MouseMotionEventPtr](addr(evt))
|
# let mouseMotionEvent = cast[MouseMotionEventPtr](addr(evt))
|
||||||
# if pan_start.isSome:
|
# if pan_start.isSome:
|
||||||
@@ -125,9 +132,20 @@ proc main_loop(arg : pointer) {.cdecl.} =
|
|||||||
else:
|
else:
|
||||||
discard
|
discard
|
||||||
|
|
||||||
# let dt = fpsman.getFramerate() / 1000
|
let pan = block:
|
||||||
# let dt = 10
|
if pan_start.isSome:
|
||||||
|
invalidate = true
|
||||||
|
var x, y : cint
|
||||||
|
getMouseState(x, y)
|
||||||
|
xlate(newP2d(x.float32, y.float32) - pan_start.get())
|
||||||
|
else:
|
||||||
|
identity[3, float32]()
|
||||||
|
let current_time = getTicks().uint
|
||||||
|
if not freeze and current_time - elapsed_time > step * 50:
|
||||||
|
elapsed_time = current_time
|
||||||
|
next_step(current_grid[], next_grid[])
|
||||||
|
invalidate = true
|
||||||
|
if invalidate:
|
||||||
render.setDrawColor 0,0,0,255
|
render.setDrawColor 0,0,0,255
|
||||||
render.clear
|
render.clear
|
||||||
var
|
var
|
||||||
@@ -140,14 +158,6 @@ proc main_loop(arg : pointer) {.cdecl.} =
|
|||||||
# if pan_start.isSome():
|
# if pan_start.isSome():
|
||||||
# x
|
# x
|
||||||
|
|
||||||
let pan = block:
|
|
||||||
if pan_start.isSome:
|
|
||||||
var x, y : cint
|
|
||||||
getMouseState(x, y)
|
|
||||||
xlate(newP2d(x.float32, y.float32) - pan_start.get())
|
|
||||||
else:
|
|
||||||
identity[3, float32]()
|
|
||||||
|
|
||||||
xform = xlate(-bb.width / 2.0f32, -bb.height / 2.0f32) * scale(f, f) *
|
xform = xlate(-bb.width / 2.0f32, -bb.height / 2.0f32) * scale(f, f) *
|
||||||
xlate(windowSize.width / 2.0f32, windowSize.height / 2.0f32) * uxform * pan
|
xlate(windowSize.width / 2.0f32, windowSize.height / 2.0f32) * uxform * pan
|
||||||
|
|
||||||
@@ -165,12 +175,7 @@ proc main_loop(arg : pointer) {.cdecl.} =
|
|||||||
if current_grid[][i, j]:
|
if current_grid[][i, j]:
|
||||||
render.fillRect(newRect2d((i * side).float32, (j * side).float32, side.float32, side.float32) * xform)
|
render.fillRect(newRect2d((i * side).float32, (j * side).float32, side.float32, side.float32) * xform)
|
||||||
render.present
|
render.present
|
||||||
# fpsman.delay
|
invalidate = false
|
||||||
# delay(0)
|
|
||||||
let current_time = getTicks().uint
|
|
||||||
if not freeze and current_time - elapsed_time > step * 50:
|
|
||||||
elapsed_time = current_time
|
|
||||||
next_step(current_grid[], next_grid[])
|
|
||||||
|
|
||||||
|
|
||||||
when defined(wasm):
|
when defined(wasm):
|
||||||
|
Reference in New Issue
Block a user