Journal [OCaml] Sdl et ecran tout noir, Beuuuuhh......

Posté par  .
Étiquettes : aucune
0
23
mar.
2004
Sdl.init [`VIDEO];;

let (bpp, w, h) = (24, 700, 480);;

let screen = Sdlvideo.set_video_mode ~w:w ~h:h ~bpp:bpp [`HWSURFACE];;

let tux = Sdlloader.load_image "wall9.jpg";;
let tax = Sdlvideo.display_format tux;;

Sdlvideo.blit_surface ~dst:screen ~src:tax;;

Sdlvideo.flip screen;;

Sdltimer.delay 3000;;
Sdl.quit;;

OcamlSdl c'est bien, mais pas documenté pour un rond...
si qq'un peu m'éclairer, je suis vraiment un nOOb de chez nOOb...
  • # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

    Posté par  . Évalué à 1.

    Je connais très peu ocaml, mais y'a pas un update() qui manque quelque part ? genre:


    Sdlvideo.blit_surface ~dst:screen ~src:tax;;
    Sdlvideo.update_rects maListeDeRectsaMettreaJour;;
    Sdlvideo.flip screen;;


    Sans garantie aucune, ça fait longtemps que j'ai pas touché à SDL.
    Sinon, tu es allé voir là: http://ocamlsdl.sourceforge.net/doc/html/Sdlvideo.html(...) ?
  • # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

    Posté par  (site web personnel) . Évalué à 1.

    OK alors :

    1) ne pas programmer en mettant des expressions en toplevel. C'est moche, ça ne se fait pas.

    2) OcamlSDL n'est pas documenté car c'est un binding assez strict de SDL. La doc se trouve donc là -> http://sdldoc.csn.ul.ie/(...)

    3) Tu as plusieurs fonctions qui ne sont pas appliquées ... forcèment ça ne marche pas. (ça t'apprendras à ne pas programmer en balancant des expressions comme ça, cf 1. :)

    4) Voilà du code qui marche :


    let main () =
    Sdl.init [`VIDEO] ;
    let (bpp, w, h) = (24, 700, 480) in
    let screen = Sdlvideo.set_video_mode ~w ~h ~bpp [] in
    (* pas de HWSURFACE, ça sert à rien avec le pilote x11 *)
    let tux = Sdlloader.load_image "wall9.jpg" in
    let tax = Sdlvideo.display_format tux in
    Sdlvideo.blit_surface ~dst:screen ~src:tax () ;
    (* il blit_surface n'était pas complètement appliquée *)
    Sdlvideo.update_rect screen ;
    (* ou flip, c'est pareil *)
    Sdltimer.delay 3000 ;
    Sdl.quit ()
    (* 'manquait un () *)
    let () =
    try main () with exn -> Sdl.quit () ; raise exn
    (* c'est bien de toujours mettre un truc comme ça,
    ça protége en cas d'exception non rattrapée *)
    • [^] # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

      Posté par  . Évalué à 1.

      pas de HWSURFACE, ça sert à rien avec le pilote x11

      gni ? c'est un peu abuser de dire ça quand même, ça s'est largement amélioré depuis l'époque où il fallait sacrifier un gnou pour que ça marche...
      • [^] # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

        Posté par  . Évalué à 1.

        Je pense que tu peux lui faire confiance cf. http://oandrieu.nerim.net/ocaml/(...) :p

        Il a l'air de maîtriser son sujet en OCaml et plus précisément OcamlSDL :)
        • [^] # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

          Posté par  . Évalué à 2.

          Je dis pas le contraire...

          Bon, ceci dit, après le test suivant:

          $ python
          Python 2.3.3 (#2, Feb 24 2004, 09:29:20)
          [GCC 3.3.3 (Debian)] on linux2
          Type "help", "copyright", "credits" or "license" for more information.
          >>> import pygame
          >>> from pygame.locals import *
          >>> pygame .init()
          (6, 0)
          >>> pygame.display.get_driver()
          'x11'
          >>> screen = pygame.display.set_mode((468, 60),HWSURFACE | DOUBLEBUF)
          >>> print screen
          <Surface(468x60x32 SW)>

          Je bats ma coulpe... J'avais pourtant cru lire que ça avait changé récemment.
          Encore une raison de plus pour rester sur OpenGL...
      • [^] # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

        Posté par  (site web personnel) . Évalué à 1.

        Non, il a raison, le backend x11 de SDL n'est pas capable de créer une surface "hardware". Ce n'est pas une limitation de x11 mais une limitation de SDL (en fait, pour rester portable on n'a pas trop le choix - il faut utiliser x11 de base et pas les extensions qui vont bien). Pour les perfs, il existe d'auter backends comme dga, directfb...
    • [^] # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

      Posté par  (site web personnel) . Évalué à 2.

      let screen = Sdlvideo.set_video_mode ~w ~h ~bpp [] in
      (* pas de HWSURFACE, ça sert à rien avec le pilote x11 *)


      Si on considère que SDL se place dans une optique de portabilité, c'est mal de dire "ça ne marche pas chez moi, donc les autres n'en profiteront pas non plus". D'autant plus que d'autres backends sous linux supportent les surfaces h/w comme directfb, dga ou (celui qui-va-tout-dépoter-quand-il-sera-fini) le futur glSDL.

      Pour choisir d'utiliser ou non le flag HWSURFACE il faut considérer la manière dont ton application accède ) la surface vidéo le plus souvent (c'est-à-dire est-ce qu'elle accède directement à ses pixels, ou est-ce qu'elle y accède par l'intermédiaire de blits).

      Sdlvideo.update_rect screen ;
      (* ou flip, c'est pareil *)


      Pas exactement, flip c'est quand on utilise un double buffer uniquement.

      Sinon, je pense que la raison pour laquelle le programme original ne marche pas, c'est qu'il fait flip sur une surface video qui nest pas un double buffer. Donc il faudrait initialiser en demandant un double buffer. Ce qui donne en utilisant mes connaisssances très lointaines en caml :
      let screen = Sdlvideo.set_video_mode ~w:w ~h:h ~bpp:bpp [`DOUBLEBUF];;
      (en rajoutant aussi le flag HWSURFACE si c'est nécessaire, mais je n'irai pas jusqu'à retrouver le ou en caml)
      • [^] # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

        Posté par  (site web personnel) . Évalué à 1.

        c'est mal de dire "ça ne marche pas chez moi, donc les autres n'en profiteront pas non plus"

        certes.

        Pas exactement, flip c'est quand on utilise un double buffer uniquement.

        oui mais s'il n'y a pas de double buffer (le cas ici), ça fait un update de tout l'écran.

        Sinon, je pense que la raison pour laquelle le programme original ne marche pas

        nonnon, s'il ne marche c'est parce qu'il manquait un argument au blit_surface, tout simplement (et au quit aussi).

        DOUBLEBUF n'est pas supporté non plus par le driver x11 (et implique HWSURFACE de toutes façons).
      • [^] # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

        Posté par  . Évalué à 1.

        Ce qui donne en utilisant mes connaisssances très lointaines en caml :
        let screen = Sdlvideo.set_video_mode ~w:w ~h:h ~bpp:bpp [`DOUBLEBUF];;


        Mais qui a essayé de me faire apprendre le Caml ??? :)
        • [^] # Re: [OCaml] Sdl et ecran tout noir, Beuuuuhh......

          Posté par  . Évalué à 1.

          JE VOUS AI COMPRIS !!!!

          Merci à tous.

          ça t'apprendras à ne pas programmer en balancant des expressions comme ça

          Effectivement. Avec le recul, je crois que tu as parfaitement cerner le problème. :-S.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.