Hardware images: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
Line 10: Line 10:


: The first example uses software images while using between 20 - 30% processor power:
: The first example uses software images while using between 20 - 30% processor power:
{{CodeStart}}{{Cl|SCREEN}} {{Cl|_NEWIMAGE}}(640, 480, 32)
{{CodeStart}}
{{Cl|SCREEN}} {{Cl|_NEWIMAGE}}({{Text|640|#F580B1}}, {{Text|480|#F580B1}}, {{Text|32|#F580B1}})


'create some software screens
{{Text|<nowiki>'create some software screens</nowiki>|#919191}}
scr_bg = {{Cl|_NEWIMAGE}}(640, 480, 32)
scr_bg = {{Cl|_NEWIMAGE}}({{Text|640|#F580B1}}, {{Text|480|#F580B1}}, {{Text|32|#F580B1}})
scr_fg = {{Cl|_NEWIMAGE}}(50, 50, 32)
scr_fg = {{Cl|_NEWIMAGE}}({{Text|50|#F580B1}}, {{Text|50|#F580B1}}, {{Text|32|#F580B1}})


'draw to the background one, and make a nice pattern
{{Text|<nowiki>'draw to the background one, and make a nice pattern</nowiki>|#919191}}
{{Cl|_DEST}} scr_bg
{{Cl|_DEST}} scr_bg
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} 100
{{Cl|FOR}} i = {{Text|1|#F580B1}} {{Cl|TO}} {{Text|100|#F580B1}}
     {{Cl|LINE}} ({{Cl|RND}} * 640, {{Cl|RND}} * 480)-({{Cl|RND}} * 640, {{Cl|RND}} * 480), {{Cl|_RGBA32}}({{Cl|RND}} * 255, {{Cl|RND}} * 255, {{Cl|RND}} * 255, {{Cl|RND}} * 255), BF
     {{Cl|LINE}} ({{Cl|RND}} * {{Text|640|#F580B1}}, {{Cl|RND}} * {{Text|480|#F580B1}})-({{Cl|RND}} * {{Text|640|#F580B1}}, {{Cl|RND}} * {{Text|480|#F580B1}}), {{Cl|_RGBA32}}({{Cl|RND}} * {{Text|255|#F580B1}}, {{Cl|RND}} * {{Text|255|#F580B1}}, {{Cl|RND}} * {{Text|255|#F580B1}}, {{Cl|RND}} * {{Text|255|#F580B1}}), BF
{{Cl|NEXT}} i
{{Cl|NEXT}} i


'then do the same thing for the foreground
{{Text|<nowiki>'then do the same thing for the foreground</nowiki>|#919191}}
{{Cl|_DEST}} scr_fg
{{Cl|_DEST}} scr_fg
{{Cl|LINE}} (0, 0)-(50, 50), {{Cl|_RGBA32}}(255, 255, 255, 200), BF
{{Cl|LINE}} ({{Text|0|#F580B1}}, {{Text|0|#F580B1}})-({{Text|50|#F580B1}}, {{Text|50|#F580B1}}), {{Cl|_RGBA32}}({{Text|255|#F580B1}}, {{Text|255|#F580B1}}, {{Text|255|#F580B1}}, {{Text|200|#F580B1}}), BF


'set image destination to main screen
{{Text|<nowiki>'set image destination to main screen</nowiki>|#919191}}
{{Cl|_DEST}} 0
{{Cl|_DEST}} {{Text|0|#F580B1}}
DO
{{Cl|DO}}
     {{Cl|CLS}}
     {{Cl|CLS}}
     {{Cl|_PUTIMAGE}} , scr_bg
     {{Cl|_PUTIMAGE}} , scr_bg
Line 34: Line 35:
     k = {{Cl|_KEYHIT}}
     k = {{Cl|_KEYHIT}}
     {{Cl|SELECT CASE}} k
     {{Cl|SELECT CASE}} k
         {{Cl|CASE}} {{Cl|ASC (function)|ASC}}("w"): y = y - 1
         {{Cl|CASE}} {{Cl|ASC}}({{Text|<nowiki>"w"</nowiki>|#FFB100}}): y = y - {{Text|1|#F580B1}}
         {{Cl|CASE}} {{Cl|ASC (function)|ASC}}("a"): x = x - 1
         {{Cl|CASE}} {{Cl|ASC}}({{Text|<nowiki>"a"</nowiki>|#FFB100}}): x = x - {{Text|1|#F580B1}}
         {{Cl|CASE}} {{Cl|ASC (function)|ASC}}("s"): y = y + 1
         {{Cl|CASE}} {{Cl|ASC}}({{Text|<nowiki>"s"</nowiki>|#FFB100}}): y = y + {{Text|1|#F580B1}}
         {{Cl|CASE}} {{Cl|ASC (function)|ASC}}("d"): x = x + 1
         {{Cl|CASE}} {{Cl|ASC}}({{Text|<nowiki>"d"</nowiki>|#FFB100}}): x = x + {{Text|1|#F580B1}}
     {{Cl|END SELECT}}
     {{Cl|END SELECT}}
     {{Cl|_DISPLAY}} 'render image after changes
     {{Cl|_DISPLAY}} {{Text|<nowiki>'render image after changes</nowiki>|#919191}}
     {{Cl|_LIMIT}} 30 'we're doing all this at 30 cycles/second
     {{Cl|_LIMIT}} {{Text|30|#F580B1}} {{Text|<nowiki>'we're doing all this at 30 cycles/second</nowiki>|#919191}}
LOOP
{{Cl|LOOP}}
{{CodeEnd}}
{{CodeEnd}}
{{Small|Examples by Johny B.}}
{{Small|Example by Johny B.}}




: The second example converts the foreground and background software screens to hardware using 6-7% processor power:
: The second example converts the foreground and background software screens to hardware using 6-7% processor power:
{{CodeStart}}{{Cl|SCREEN}} {{Cl|_NEWIMAGE}}(640, 480, 32)
{{CodeStart}}
{{Cl|SCREEN}} {{Cl|_NEWIMAGE}}({{Text|640|#F580B1}}, {{Text|480|#F580B1}}, {{Text|32|#F580B1}})


'create some software screens
{{Text|<nowiki>'create some software screens</nowiki>|#919191}}
scr_bg = {{Cl|_NEWIMAGE}}(640, 480, 32)
scr_bg = {{Cl|_NEWIMAGE}}({{Text|640|#F580B1}}, {{Text|480|#F580B1}}, {{Text|32|#F580B1}})
scr_fg = {{Cl|_NEWIMAGE}}(50, 50, 32)
scr_fg = {{Cl|_NEWIMAGE}}({{Text|50|#F580B1}}, {{Text|50|#F580B1}}, {{Text|32|#F580B1}})


'draw to the background one, and make a nice pattern
{{Text|<nowiki>'draw to the background one, and make a nice pattern</nowiki>|#919191}}
{{Cl|_DEST}} scr_bg
{{Cl|_DEST}} scr_bg
{{Cl|FOR...NEXT|FOR}} i = 1 {{Cl|TO}} 100
{{Cl|FOR}} i = {{Text|1|#F580B1}} {{Cl|TO}} {{Text|100|#F580B1}}
     {{Cl|LINE}} ({{Cl|RND}} * 640, {{Cl|RND}} * 480)-({{Cl|RND}} * 640, {{Cl|RND}} * 480), {{Cl|_RGBA32}}({{Cl|RND}} * 255, {{Cl|RND}} * 255, {{Cl|RND}} * 255, {{Cl|RND}} * 255), BF
     {{Cl|LINE}} ({{Cl|RND}} * {{Text|640|#F580B1}}, {{Cl|RND}} * {{Text|480|#F580B1}})-({{Cl|RND}} * {{Text|640|#F580B1}}, {{Cl|RND}} * {{Text|480|#F580B1}}), {{Cl|_RGBA32}}({{Cl|RND}} * {{Text|255|#F580B1}}, {{Cl|RND}} * {{Text|255|#F580B1}}, {{Cl|RND}} * {{Text|255|#F580B1}}, {{Cl|RND}} * {{Text|255|#F580B1}}), BF
{{Cl|NEXT}} i
{{Cl|NEXT}} i
'create a hardware screen version of the background
{{Text|<nowiki>'create a hardware screen version of the background</nowiki>|#919191}}
scrh_bg = {{Cl|_COPYIMAGE}}(scr_bg, 33)
scrh_bg = {{Cl|_COPYIMAGE}}(scr_bg, {{Text|33|#F580B1}})
{{Cl|_FREEIMAGE}} scr_bg 'we no longer need the software version in memory
{{Cl|_FREEIMAGE}} scr_bg {{Text|<nowiki>'we no longer need the software version in memory</nowiki>|#919191}}


'then do the same thing for the foreground
{{Text|<nowiki>'then do the same thing for the foreground</nowiki>|#919191}}
{{Cl|_DEST}} scr_fg
{{Cl|_DEST}} scr_fg
{{Cl|LINE}} (0, 0)-(50, 50), {{Cl|_RGBA32}}(255, 255, 255, 200), BF
{{Cl|LINE}} ({{Text|0|#F580B1}}, {{Text|0|#F580B1}})-({{Text|50|#F580B1}}, {{Text|50|#F580B1}}), {{Cl|_RGBA32}}({{Text|255|#F580B1}}, {{Text|255|#F580B1}}, {{Text|255|#F580B1}}, {{Text|200|#F580B1}}), BF
'copy to hardware screen
{{Text|<nowiki>'copy to hardware screen</nowiki>|#919191}}
scrh_fg = {{Cl|_COPYIMAGE}}(scr_fg, 33)
scrh_fg = {{Cl|_COPYIMAGE}}(scr_fg, {{Text|33|#F580B1}})
{{Cl|_FREEIMAGE}} scr_fg 'and free software screen from memory
{{Cl|_FREEIMAGE}} scr_fg {{Text|<nowiki>'and free software screen from memory</nowiki>|#919191}}


'set image destination to main screen
{{Text|<nowiki>'set image destination to main screen</nowiki>|#919191}}
{{Cl|_DEST}} 0
{{Cl|_DEST}} {{Text|0|#F580B1}}
{{Cl|_DISPLAYORDER}} _HARDWARE 'do not even render the software layer, just the hardware one.
{{Cl|_DISPLAYORDER}} {{Cl|_HARDWARE}} {{Text|<nowiki>'do not even render the software layer, just the hardware one.</nowiki>|#919191}}
{{Cl|DO...LOOP|DO}} 'main program loop
{{Cl|DO}} {{Text|<nowiki>'main program loop</nowiki>|#919191}}
     '_putimage knows these are hardware screens, so destination of 0 is taken as hardware layer
     {{Text|<nowiki>'_putimage knows these are hardware screens, so destination of 0 is taken as hardware layer</nowiki>|#919191}}
     {{Cl|_PUTIMAGE}} , scrh_bg
     {{Cl|_PUTIMAGE}} , scrh_bg
     {{Cl|_PUTIMAGE}} (x, y), scrh_fg
     {{Cl|_PUTIMAGE}} (x, y), scrh_fg
     'just some input processing
     {{Text|<nowiki>'just some input processing</nowiki>|#919191}}
     k = {{Cl|_KEYHIT}}
     k = {{Cl|_KEYHIT}}
     {{Cl|SELECT CASE}} k
     {{Cl|SELECT CASE}} k
         {{Cl|CASE}} {{Cl|ASC (function)|ASC}}("w"): y = y - 1
         {{Cl|CASE}} {{Cl|ASC}}({{Text|<nowiki>"w"</nowiki>|#FFB100}}): y = y - {{Text|1|#F580B1}}
         {{Cl|CASE}} {{Cl|ASC (function)|ASC}}("a"): x = x - 1
         {{Cl|CASE}} {{Cl|ASC}}({{Text|<nowiki>"a"</nowiki>|#FFB100}}): x = x - {{Text|1|#F580B1}}
         {{Cl|CASE}} {{Cl|ASC (function)|ASC}}("s"): y = y + 1
         {{Cl|CASE}} {{Cl|ASC}}({{Text|<nowiki>"s"</nowiki>|#FFB100}}): y = y + {{Text|1|#F580B1}}
         {{Cl|CASE}} {{Cl|ASC (function)|ASC}}("d"): x = x + 1
         {{Cl|CASE}} {{Cl|ASC}}({{Text|<nowiki>"d"</nowiki>|#FFB100}}): x = x + {{Text|1|#F580B1}}
     {{Cl|END SELECT}}
     {{Cl|END SELECT}}
     {{Cl|_DISPLAY}} 'render image after changes
     {{Cl|_DISPLAY}} {{Text|<nowiki>'render image after changes</nowiki>|#919191}}
     {{Cl|_LIMIT}} 30 'we're doing all this at 30 cycles/second
     {{Cl|_LIMIT}} {{Text|30|#F580B1}} {{Text|<nowiki>'we're doing all this at 30 cycles/second</nowiki>|#919191}}
LOOP
{{Cl|LOOP}}
{{CodeEnd}}
{{CodeEnd}}
{{Small|Examples by Johny B.}}
{{Small|Example by Johny B.}}





Revision as of 18:59, 24 September 2024

Hardware Images (QB64 version 1.000 and up)


Demonstration of the Advantages of Using Hardware Images


The first example uses software images while using between 20 - 30% processor power:
SCREEN _NEWIMAGE(640, 480, 32)

'create some software screens
scr_bg = _NEWIMAGE(640, 480, 32)
scr_fg = _NEWIMAGE(50, 50, 32)

'draw to the background one, and make a nice pattern
_DEST scr_bg
FOR i = 1 TO 100
    LINE (RND * 640, RND * 480)-(RND * 640, RND * 480), _RGBA32(RND * 255, RND * 255, RND * 255, RND * 255), BF
NEXT i

'then do the same thing for the foreground
_DEST scr_fg
LINE (0, 0)-(50, 50), _RGBA32(255, 255, 255, 200), BF

'set image destination to main screen
_DEST 0
DO
    CLS
    _PUTIMAGE , scr_bg
    _PUTIMAGE (x, y), scr_fg
    k = _KEYHIT
    SELECT CASE k
        CASE ASC("w"): y = y - 1
        CASE ASC("a"): x = x - 1
        CASE ASC("s"): y = y + 1
        CASE ASC("d"): x = x + 1
    END SELECT
    _DISPLAY 'render image after changes
    _LIMIT 30 'we're doing all this at 30 cycles/second
LOOP
Example by Johny B.


The second example converts the foreground and background software screens to hardware using 6-7% processor power:
SCREEN _NEWIMAGE(640, 480, 32)

'create some software screens
scr_bg = _NEWIMAGE(640, 480, 32)
scr_fg = _NEWIMAGE(50, 50, 32)

'draw to the background one, and make a nice pattern
_DEST scr_bg
FOR i = 1 TO 100
    LINE (RND * 640, RND * 480)-(RND * 640, RND * 480), _RGBA32(RND * 255, RND * 255, RND * 255, RND * 255), BF
NEXT i
'create a hardware screen version of the background
scrh_bg = _COPYIMAGE(scr_bg, 33)
_FREEIMAGE scr_bg 'we no longer need the software version in memory

'then do the same thing for the foreground
_DEST scr_fg
LINE (0, 0)-(50, 50), _RGBA32(255, 255, 255, 200), BF
'copy to hardware screen
scrh_fg = _COPYIMAGE(scr_fg, 33)
_FREEIMAGE scr_fg 'and free software screen from memory

'set image destination to main screen
_DEST 0
_DISPLAYORDER _HARDWARE 'do not even render the software layer, just the hardware one.
DO 'main program loop
    '_putimage knows these are hardware screens, so destination of 0 is taken as hardware layer
    _PUTIMAGE , scrh_bg
    _PUTIMAGE (x, y), scrh_fg
    'just some input processing
    k = _KEYHIT
    SELECT CASE k
        CASE ASC("w"): y = y - 1
        CASE ASC("a"): x = x - 1
        CASE ASC("s"): y = y + 1
        CASE ASC("d"): x = x + 1
    END SELECT
    _DISPLAY 'render image after changes
    _LIMIT 30 'we're doing all this at 30 cycles/second
LOOP
Example by Johny B.


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link