İşte size OCaml'deki basit bir oyun döngüsü. Durum görüntülenir, giriş alınır ve durum ilerletilir. Saniyedeki kare sayısı, her döngüde 0,025 saniye boyunca iplik geciktirilerek 40'a düşürülür.OCaml'de gösterim gecikmesi ve klavye olayları
main.ml: Bu örnek için
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
;;
, get_input
fonksiyon sadece pencereye tuş vuruşlarını yazdırır.
input.ml: Kolay test için
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:
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 $<
Bu çoğunlukla çalışır, ancak tuşlar çok hızlı basıldığında, program, bu hata ile çöker:
Fatal error: exception Unix.Unix_error(2, "select", "")
Thread.delay
ile ilgili. Bu soruna neden olan nedir ve sürekli bir FPS elde etmenin en iyi yolu nedir?
Jeffrey tüm hesaplarda haklıdır. Konu hakkında daha fazla bilgi alabilirsiniz.Gecikme [burada] (http://ocamlunix.forge.ocamlcore.org/threads.html#htoc63). –