Page 1 sur 2

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

Publié : mar. 08/juin/2010 11:01
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

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

Publié : mar. 08/juin/2010 22:53
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.

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

Publié : mer. 09/juin/2010 7:35
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.

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

Publié : mer. 09/juin/2010 9:12
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 :)

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

Publié : mer. 09/juin/2010 10:23
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.

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

Publié : mer. 09/juin/2010 11:14
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...

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

Publié : mer. 09/juin/2010 12:34
par G-Rom
si tu donne un minimum de code , je peut t'aider :D

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

Publié : mer. 09/juin/2010 14:04
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

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

Publié : mer. 09/juin/2010 15:06
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

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

Publié : mer. 09/juin/2010 15:26
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.

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

Publié : mer. 09/juin/2010 15:36
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 !

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

Publié : mer. 09/juin/2010 15:45
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 

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

Publié : mer. 09/juin/2010 16:21
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 !

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

Publié : mer. 09/juin/2010 16:40
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 

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

Publié : mer. 09/juin/2010 17:14
par G-Rom
Marche pas sous linux ced , l'auto-redimensionnement n'est pas pris en compte.