[RESOLU] Emuler du 320*240 avec du 800*600

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
deeph
Messages : 33
Inscription : lun. 20/juil./2009 11:04
Contact :

[RESOLU] Emuler du 320*240 avec du 800*600

Message par deeph »

Bonjour,

Comme l'indique le titre je voudrai pouvoir émuler du 320*240 avec du 800*600 (voire plus). J'ai tout essayé : ZoomSprite3D(), images redimensionnées à la volée, etc...

Le seul truc qui rend pas trop mal c'est d'utiliser ResizeImage(), sauf que ça bouffe beaucoup trop de temps processeur. Pour le moment je fait, en gros, ça :

Code : Tout sélectionner

#ZOOM = 2.5 ; 800/320 ou 600/240
#SCREEN_WIDTH = 320*#ZOOM
#SCREEN_HEIGHT = 240*#ZOOM

[...]

Procedure ResizeAndDisplayScreen()
  If StartDrawing(ScreenOutput())
    GrabDrawingImage(#Image_temp, 0, 0, #SCREEN_WIDTH/#ZOOM, #SCREEN_HEIGHT/#ZOOM)
    ResizeImage(#Image_temp, #SCREEN_WIDTH, #SCREEN_HEIGHT)
    DrawImage(ImageID(#Image_temp), 0, 0)
    StopDrawing()
  EndIf
  FlipBuffers()
EndProcedure
(Avant j'affiche tout comme si c'était réellement du 320*240).

Y'a-t-il un autre moyen qui rend pas trop mal et qui ne bouffe pas autant de mémoire ?

Edit : Bizarrement ce code va un peu plus vite et donne exactement le même rendu :

Code : Tout sélectionner

Procedure ResizeAndDisplayScreen()
  If StartDrawing(ScreenOutput())
    GrabDrawingImage(#Image_temp, 0, 0, #SCREEN_WIDTH/#ZOOM, #SCREEN_HEIGHT/#ZOOM)
    DrawImage(ImageID(#Image_temp), 0, 0, #SCREEN_WIDTH, #SCREEN_HEIGHT)
    StopDrawing()
  EndIf
  FlipBuffers()
EndProcedure
Dernière modification par deeph le mer. 09/juin/2010 16:22, modifié 1 fois.
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: Emuler du 320*240 avec du 800*600

Message par cederavic »

La solution la plus simple qui me vienne à l'esprit est un WindowedScreen de 320 x 240 avec redimauto = #true dans une fenêtre de 800 x 600... Quitte à changer la résolution et faire une fenêtre borderless pour "simuler" un plein écran.
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Re: Emuler du 320*240 avec du 800*600

Message par Octavius »

Est-ce que ça ne va pas plus vite avec le mode #PB_Image_Raw pour ResizeImage(). Le rendu n'est peut-être pas tout à fait le même mais je ne sais pas ce que tu cherches à faire exactement.
deeph
Messages : 33
Inscription : lun. 20/juil./2009 11:04
Contact :

Re: Emuler du 320*240 avec du 800*600

Message par deeph »

cederavic > Mouais ça peut l'faire, j'vais tester.

Octavius > C'est plus laid et juste un tout petit peu plus rapide :|

Si quelqu'un a d'autres idées j'suis preneur :)
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Emuler du 320*240 avec du 800*600

Message par G-Rom »

Pour avoir déjà fait c'est artifice , je rends mon écran dans un sprite en 320x240
puis je l'étire avec ZoomSprite3D , GrabSprite() fait l'affaire pour la création du sprite.
deeph
Messages : 33
Inscription : lun. 20/juil./2009 11:04
Contact :

Re: Emuler du 320*240 avec du 800*600

Message par deeph »

J'ai essayé mais ça me déforme certains pixels, et d'autres pas. Bref c'est super moche. En plus apparemment il faut bidouiller la sprite pour avec un truc carré d'une certaine dimension...
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Emuler du 320*240 avec du 800*600

Message par G-Rom »

si tu donne un minimum de code , je peut t'aider :D
deeph
Messages : 33
Inscription : lun. 20/juil./2009 11:04
Contact :

Re: Emuler du 320*240 avec du 800*600

Message par deeph »

Bon pour simplifier disons que j'ai ça :

Code : Tout sélectionner

#ZOOM = 2.5
#SCREEN_WIDTH = 320*#ZOOM
#SCREEN_HEIGHT = 240*#ZOOM

Enumeration
  #Fond
  #Balle
  #Image_temp
EndEnumeration

If InitKeyboard() And InitSprite() And OpenScreen(#SCREEN_WIDTH, #SCREEN_HEIGHT, 32, "Test")
  Define x.l, y.l, vx.l, vy.l

  CreateSprite(#Fond, #SCREEN_WIDTH, #SCREEN_HEIGHT)
  If StartDrawing(SpriteOutput(#Fond))
    For x = 0 To #SCREEN_WIDTH-1
      For y = 0 To #SCREEN_HEIGHT-1
        Plot(x, y, RGB(Random(255), Random(255), Random(255)))
      Next y
    Next x
    StopDrawing()
  EndIf

  CreateSprite(#Balle, 16, 16)
  If StartDrawing(SpriteOutput(#Balle))
    Circle(8, 8, 7, RGB(255, 0, 0))
    StopDrawing()
  EndIf
  TransparentSpriteColor(#Balle, RGB(0, 0, 0))

  x = 0
  y = 0
  vx = 1
  vy = 1
  Repeat
    ExamineKeyboard()
    ClearScreen(RGB(0,0,0))

    x+vx
    If x = #SCREEN_WIDTH/#ZOOM Or x = 0
      vx=-vx
    EndIf
    y+vy
    If y = #SCREEN_HEIGHT/#ZOOM Or y= 0
      vy=-vy
    EndIf

    DisplaySprite(#Fond, 0, 0)
    DisplayTransparentSprite(#Balle, x, y)

    If StartDrawing(ScreenOutput())
      GrabDrawingImage(#Image_temp, 0, 0, #SCREEN_WIDTH/#ZOOM, #SCREEN_HEIGHT/#ZOOM)
      Box(0, 0, #SCREEN_WIDTH, #SCREEN_HEIGHT)
      DrawImage(ImageID(#Image_temp), 0, 0, #SCREEN_WIDTH, #SCREEN_HEIGHT)
      StopDrawing()
    EndIf

    FlipBuffers()
  Until KeyboardPushed(#PB_Key_Escape)
EndIf
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Emuler du 320*240 avec du 800*600

Message par G-Rom »

Code : Tout sélectionner

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  CompilerIf Subsystem("opengl") <> 1
    CompilerError "Le subsyteme opengl doit être activé ( Compilateur->Options du compilateur )"
  CompilerEndIf
CompilerEndIf


InitSprite() : InitKeyboard() : InitSprite3D() : InitMouse()

ExamineDesktops()
DW = DesktopWidth(0)
DH = DesktopHeight(0)
OpenScreen(DW,DH,DesktopDepth(0),"",#PB_Screen_NoSynchronization)


Global Virtual_Screen_x = 320
Global Virtual_Screen_y = 240





Repeat

    ExamineKeyboard()
    
    
    If FPST<ElapsedMilliseconds()
      FPS = FPSC
      FPSC = 0
      FPST = ElapsedMilliseconds()+1000
    EndIf 
    
    FPSC + 1
    
    
   
    
    If Temporise < ElapsedMilliseconds()
      Temporise = ElapsedMilliseconds()+40 ; tout les 40 ms on rend l'écran , soit environ 25 images secondes ( fluide pour un oeil humain , et on préserve le temps processeur )
      
        ClearScreen(0)
      
        ; ICI TU DESSINE CE QUE TU VEUT ( des sprites , directement sur l'écran , etc... )
        ; les sprites sont quand même mieux qu'un dessin sur screenoutput() en terme de perf
        ; Drawtext est à bannir aussi pour les perfs.
        
        StartDrawing(ScreenOutput())
            
          Nx = Virtual_Screen_x / 32 ; on dessine un damier
          Ny = Virtual_Screen_y / 32
          F.b = 0
          Offset.i+1
          Offset%32
          For y = -1 To Ny+1
            For x = -1 To Nx+1
              If F = 0
                Box(x*32+Offset,y*32+Offset,32,32,$AAAAAA) 
              Else
                Box(x*32+Offset,y*32+Offset,32,32,$FFCACA) 
              EndIf 
              F+1 :  F%2
            Next
          Next 
          
          DrawingMode(#PB_2DDrawing_AlphaBlend)
          Box(0,0,Virtual_Screen_x,32,RGBA(255,128,64,128))        
          
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawText( 1,1,"REAL FRAME RATE = "+Str(FPS))
        StopDrawing()
    
    
    ; On grabe le résultat
    virtual_screen_id = GrabSprite(#PB_Any,0,0,Virtual_Screen_x,Virtual_Screen_y,#PB_Sprite_Texture)
    CreateSprite3D(0,virtual_screen_id)
       
    
    Start3D()
      TransformSprite3D(0,0,0,DW,0,DW,DH,0,DH)
      DisplaySprite3D(0,0,DH-Virtual_Screen_y) ; Peut être spécifique linux le décalage en Y ?
    Stop3D()
    
    
    
    
    
    
    FreeSprite3D(0)
    FreeSprite(virtual_screen_id)
    FlipBuffers()
    
  EndIf 
  

    
  
Until KeyboardPushed(#PB_Key_Escape)
End 
Ca marche bien ici
deeph
Messages : 33
Inscription : lun. 20/juil./2009 11:04
Contact :

Re: Emuler du 320*240 avec du 800*600

Message par deeph »

Merci !

C'est pas mal mais c'est encore un peu plus lent que si c'était vraiment du 320*240... Puis le rendu n'est pas lissé, mais bon, ça j'pense que je peux laisser tomber ça bouffe un max de temps.

Si je trouve vraiment rien d'autre c'est sûrement la solution que j'utiliserai.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Emuler du 320*240 avec du 800*600

Message par G-Rom »

deeph a écrit :Merci !

C'est pas mal mais c'est encore un peu plus lent que si c'était vraiment du 320*240... Puis le rendu n'est pas lissé, mais bon, ça j'pense que je peux laisser tomber ça bouffe un max de temps.

Si je trouve vraiment rien d'autre c'est sûrement la solution que j'utiliserai.

Rajoute à la rigueur Sprite3DQuality(#PB_Sprite3D_BilinearFiltering) , mais faut pas s'attendre un un truc "lisse" , n'oublie pas que quelque soit la technique que tu utilises , ca sera "pixélisé" , ca reste du 320x240...

sur un écran qui fait 1680 en x , le pixel à une taille de 5,25 !
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Emuler du 320*240 avec du 800*600

Message par G-Rom »

tu peut aussi "bluré" en jouant sur la position & l'alpha du sprite3D

Code : Tout sélectionner

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  CompilerIf Subsystem("opengl") <> 1
    CompilerError "Le subsyteme opengl doit être activé ( Compilateur->Options du compilateur )"
  CompilerEndIf
CompilerEndIf


InitSprite() : InitKeyboard() : InitSprite3D() : InitMouse()

ExamineDesktops()
DW = DesktopWidth(0)
DH = DesktopHeight(0)
OpenScreen(DW,DH,DesktopDepth(0),"",#PB_Screen_NoSynchronization)


Global Virtual_Screen_x = 320
Global Virtual_Screen_y = 240





Repeat

    ExamineKeyboard()
    
    
    If FPST<ElapsedMilliseconds()
      FPS = FPSC
      FPSC = 0
      FPST = ElapsedMilliseconds()+1000
    EndIf 
    
    FPSC + 1
    
    
   
    
    If Temporise < ElapsedMilliseconds()
      Temporise = ElapsedMilliseconds()+40 ; tout les 40 ms on rend l'écran , soit environ 25 images secondes ( fluide pour un oeil humain , et on préserve le temps processeur )
      
        ClearScreen(0)
      
        ; ICI TU DESSINE CE QUE TU VEUT ( des sprites , directement sur l'écran , etc... )
        ; les sprites sont quand même mieux qu'un dessin sur screenoutput() en terme de perf
        ; Drawtext est à bannir aussi pour les perfs.
        
        StartDrawing(ScreenOutput())
            
          Nx = Virtual_Screen_x / 32 ; on dessine un damier
          Ny = Virtual_Screen_y / 32
          F.b = 0
          Offset.i+1
          Offset%32
          For y = -1 To Ny+1
            For x = -1 To Nx+1
              If F = 0
                Box(x*32+Offset,y*32+Offset,32,32,$AAAAAA) 
              Else
                Box(x*32+Offset,y*32+Offset,32,32,$FFCACA) 
              EndIf 
              F+1 :  F%2
            Next
          Next 
          
          DrawingMode(#PB_2DDrawing_AlphaBlend)
          Box(0,0,Virtual_Screen_x,32,RGBA(255,128,64,128))        
          
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawText( 1,1,"REAL FRAME RATE = "+Str(FPS))
        StopDrawing()
    
    
    ; On grabe le résultat
    virtual_screen_id = GrabSprite(#PB_Any,0,0,Virtual_Screen_x,Virtual_Screen_y,#PB_Sprite_Texture)
    ClearScreen(0)
    CreateSprite3D(0,virtual_screen_id)
       
    Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)
    BlurOffSet = 20 * Cos(ElapsedMilliseconds()/1000)
    Start3D()
    For y = -1 To 1
      For x = -1 To 1
        
        xx = x * BlurOffSet
        yy = y * BlurOffSet
        
        TransformSprite3D(0,xx,yy,xx+DW,yy,xx+DW,yy+DH,xx,yy+DH)
        DisplaySprite3D(0,0,DH-Virtual_Screen_y,96) ; Peut être spécifique linux le décalage en Y ?
      Next 
    Next 
    Stop3D()

    FreeSprite3D(0)
    FreeSprite(virtual_screen_id)
    FlipBuffers()
    
  EndIf 
  
  
Until KeyboardPushed(#PB_Key_Escape)
End 
deeph
Messages : 33
Inscription : lun. 20/juil./2009 11:04
Contact :

Re: Emuler du 320*240 avec du 800*600

Message par deeph »

Ouais finalement j'obtiens un résultat pas trop mal avec Sprite3DQuality() :)

Bon sauf si quelqu'un a une meilleur solution, je pense que c'est bon. Merci !
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: [RESOLU] Emuler du 320*240 avec du 800*600

Message par cederavic »

En partant du code de G-Rom :

Code : Tout sélectionner

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
  CompilerIf Subsystem("opengl") <> 1
    CompilerError "Le subsyteme opengl doit être activé ( Compilateur->Options du compilateur )"
  CompilerEndIf
CompilerEndIf


InitSprite() : InitKeyboard() : InitSprite3D() : InitMouse()

ExamineDesktops()
DW = DesktopWidth(0)
DH = DesktopHeight(0)
OpenWindow(0, 0, 0, DW, DH, "", #PB_Window_BorderLess)
  OpenWindowedScreen(WindowID(0), 0, 0, 320, 240, 1, 0, 0, #PB_Screen_NoSynchronization)


Global Virtual_Screen_x = 320
Global Virtual_Screen_y = 240





Repeat

    ExamineKeyboard()
   
   
    If FPST<ElapsedMilliseconds()
      FPS = FPSC
      FPSC = 0
      FPST = ElapsedMilliseconds()+1000
    EndIf
   
    FPSC + 1
   
   
   
   
    If Temporise < ElapsedMilliseconds()
      Temporise = ElapsedMilliseconds()+40 ; tout les 40 ms on rend l'écran , soit environ 25 images secondes ( fluide pour un oeil humain , et on préserve le temps processeur )
     
        ClearScreen(0)
     
        ; ICI TU DESSINE CE QUE TU VEUT ( des sprites , directement sur l'écran , etc... )
        ; les sprites sont quand même mieux qu'un dessin sur screenoutput() en terme de perf
        ; Drawtext est à bannir aussi pour les perfs.
       
        StartDrawing(ScreenOutput())
           
          Nx = Virtual_Screen_x / 32 ; on dessine un damier
          Ny = Virtual_Screen_y / 32
          F.b = 0
          Offset.i+1
          Offset%32
          For y = -1 To Ny+1
            For x = -1 To Nx+1
              If F = 0
                Box(x*32+Offset,y*32+Offset,32,32,$AAAAAA)
              Else
                Box(x*32+Offset,y*32+Offset,32,32,$FFCACA)
              EndIf
              F+1 :  F%2
            Next
          Next
         
          DrawingMode(#PB_2DDrawing_AlphaBlend)
          Box(0,0,Virtual_Screen_x,32,RGBA(255,128,64,128))       
         
          DrawingMode(#PB_2DDrawing_Transparent)
          DrawText( 1,1,"REAL FRAME RATE = "+Str(FPS))
        StopDrawing()
   
    FlipBuffers()
   
  EndIf
 
 
Until KeyboardPushed(#PB_Key_Escape) Or WindowEvent() = #WM_CLOSE
End 
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: [RESOLU] Emuler du 320*240 avec du 800*600

Message par G-Rom »

Marche pas sous linux ced , l'auto-redimensionnement n'est pas pris en compte.
Répondre