optimized redraw o decrease cpu usage

This commit is contained in:
Walter Oggioni
2019-04-27 18:05:18 +01:00
parent b0a890a85b
commit cbf5ad402e

View File

@@ -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,52 +132,50 @@ proc main_loop(arg : pointer) {.cdecl.} =
else: else:
discard discard
# let dt = fpsman.getFramerate() / 1000
# let dt = 10
render.setDrawColor 0,0,0,255
render.clear
var
x : float32 = bb.left
y : float32 = bb.top
render.setDrawColor 127,127,127,255
let f = min(windowSize.width / bb.width, windowSize.height / bb.height)
# let pan_xform = block:
# if pan_start.isSome():
# x
let pan = block: let pan = block:
if pan_start.isSome: if pan_start.isSome:
invalidate = true
var x, y : cint var x, y : cint
getMouseState(x, y) getMouseState(x, y)
xlate(newP2d(x.float32, y.float32) - pan_start.get()) xlate(newP2d(x.float32, y.float32) - pan_start.get())
else: else:
identity[3, float32]() identity[3, float32]()
xform = xlate(-bb.width / 2.0f32, -bb.height / 2.0f32) * scale(f, f) *
xlate(windowSize.width / 2.0f32, windowSize.height / 2.0f32) * uxform * pan
while x <= bb.width:
render.drawLine(newP2d(x, bb.top) * xform, newP2d(x, bb.height) * xform)
x += side.float32
while y <= bb.height:
render.drawLine(newP2d(bb.left, y) * xform, newP2d(bb.width, y) * xform)
y += side.float32
render.setDrawColor 255,255,255,255
for i in 0..<current_grid.columns:
for j in 0..<current_grid.rows:
if current_grid[][i, j]:
render.fillRect(newRect2d((i * side).float32, (j * side).float32, side.float32, side.float32) * xform)
render.present
# fpsman.delay
# delay(0)
let current_time = getTicks().uint let current_time = getTicks().uint
if not freeze and current_time - elapsed_time > step * 50: if not freeze and current_time - elapsed_time > step * 50:
elapsed_time = current_time elapsed_time = current_time
next_step(current_grid[], next_grid[]) next_step(current_grid[], next_grid[])
invalidate = true
if invalidate:
render.setDrawColor 0,0,0,255
render.clear
var
x : float32 = bb.left
y : float32 = bb.top
render.setDrawColor 127,127,127,255
let f = min(windowSize.width / bb.width, windowSize.height / bb.height)
# let pan_xform = block:
# if pan_start.isSome():
# x
xform = xlate(-bb.width / 2.0f32, -bb.height / 2.0f32) * scale(f, f) *
xlate(windowSize.width / 2.0f32, windowSize.height / 2.0f32) * uxform * pan
while x <= bb.width:
render.drawLine(newP2d(x, bb.top) * xform, newP2d(x, bb.height) * xform)
x += side.float32
while y <= bb.height:
render.drawLine(newP2d(bb.left, y) * xform, newP2d(bb.width, y) * xform)
y += side.float32
render.setDrawColor 255,255,255,255
for i in 0..<current_grid.columns:
for j in 0..<current_grid.rows:
if current_grid[][i, j]:
render.fillRect(newRect2d((i * side).float32, (j * side).float32, side.float32, side.float32) * xform)
render.present
invalidate = false
when defined(wasm): when defined(wasm):