Aquí hay un bucle de juego simple en OCaml. Se muestra el estado, se recibe la entrada y el estado avanza. El número de cuadros por segundo se reduce a 40 al retrasar el hilo durante 0.025 segundos en cada ciclo.Retraso de hilo y eventos de teclado en OCaml
main.ml:
let rec main (* state *) frame_time =
(* Display state here. *)
Input.get_input();
(* Advance state by one frame here. *)
(* If less than 25ms have passed, delay until they have. *)
if((Sys.time()) < (frame_time +. 0.025)) then
Thread.delay ((frame_time +. 0.025) -. (Sys.time()));
main (* next_state *) (Sys.time())
;;
let init =
Graphics.open_graph " 800x500";
let start_time = (Sys.time()) in
main (* start_state *) start_time
;;
Para este ejemplo, la función get_input
simplemente imprime pulsaciones de teclas a la ventana.
input.ml:
let get_input() =
let s = Graphics.wait_next_event
[Graphics.Key_pressed] in
if s.Graphics.keypressed then
Graphics.draw_char s.Graphics.key
;;
Makefile para la prueba fácil:
main: input.cmo main.cmo
ocamlfind ocamlc -o [email protected] unix.cma -thread threads.cma graphics.cma $^
main.cmo: main.ml
ocamlfind ocamlc -c $< -thread
input.cmo: input.ml
ocamlfind ocamlc -c $<
Esto funciona en su mayor parte, pero cuando se pulsan las teclas muy rápidamente, el programa se bloquea con este error:
Fatal error: exception Unix.Unix_error(2, "select", "")
Creo que tiene algo para hacer con Thread.delay
. ¿Qué está causando este problema y cuál es la mejor manera de lograr un FPS constante?
Jeffrey tiene razón en todas las cuentas. Puedes obtener ligeramente más información sobre Thread.demora [aquí] (http://ocamlunix.forge.ocamlcore.org/threads.html#htoc63). –