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

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.