Posts: 476
Threads: 25
Joined: Nov 2022
Reputation:
45
(09-12-2023, 01:53 PM)TerryRitchie Wrote: (09-12-2023, 01:45 AM)bplus Wrote: I never worked with Hardware images the Wiki for _copyimage didn't show an example in my quick scan.
I wonder if Terry's tutorial might have something?
Sorry, it doesn't. Something I need to add in the near future.
Looking forward to that day @TerryRitchie
Posts: 476
Threads: 25
Joined: Nov 2022
Reputation:
45
(09-12-2023, 07:11 PM)TerryRitchie Wrote: It's well worth learning to use hardware images. Here is a little demo I just wrote showing the power of hardware images. This program creates 8000 sprites and then let's the user switch between software and hardware mode to see the performance difference. I'm going to start creating demos for a lesson on hardware vs software images in the tutorial. It's long overdue.
Keys:
H - hardware mode
S - software mode
ESC - leave program
Note: You may need to decrease the amount of objects depending on your system's performance. Change the TOTAL = 8000 to a lower number that doesn't crash the program.
...and the day has come
@TerryRitchie this is a FANTASTIC example and we should put this in the damned wiki.
I wish the forum had some way to mark posts as notable or something and then a way to just see them in a list.
Thanks Terry!
Posts: 476
Threads: 25
Joined: Nov 2022
Reputation:
45
(09-12-2023, 09:46 PM)SMcNeill Wrote: Try this little demo to showcase the difference in speed between Hardware Images and Software Images:
On my PC, I get about 100 FPS for the software image animation, and about 130,000 FPS for the hardware image animation.
I think that's enough to showcase a slight difference in the performance between the two.
Thanks @SMcNeill I was getting almost similar results. 80,000 or so in hardware and 80-90 in software.
This is on a 8 year old macbook pro from 2015.
Posts: 372
Threads: 23
Joined: May 2022
Reputation:
56
(09-12-2023, 10:54 PM)grymmjack Wrote: (09-12-2023, 01:21 PM)a740g Wrote: Made a few changes.
Code: (Select All)
ALIEN_SPRITE& = _NEWIMAGE(w% + 1, h% + 1, 256)
_DEST ALIEN_SPRITE&
PSET (0, 10)
DRAW ALIEN$
_CLEARCOLOR 0, ALIEN_SPRITE&
ALIEN_32& = _NEWIMAGE(w% + 1, h% + 1, 32)
_SOURCE ALIEN_SPRITE&: _DEST ALIEN_32&: _PUTIMAGE
ALIEN_HW& = _COPYIMAGE(ALIEN_32&, 33)
Thanks @a740g ! I was missing `_CLEARCOLOR 0` somehow, and that was the fix?
I don't quite understand that because the screen is `320x200` and the sprite is only `50x50` or so.
Why was the entire background black and not showing the blue?
Thanks again! The `_CLEARCOLOR` is for the sprite transparency. I removed the `_DISPLAYORDER _HARDWARE` line. `_DISPLAYORDER _HARDWARE` will render hardware surfaces only. So, basically `CLS , _RGB32(0, 0, 255)` had no effect with that line.
Posts: 188
Threads: 22
Joined: Mar 2023
Reputation:
12
Very cool demo, Terry! What a difference using hardware images. I'm on an M1 Mac Mini and I cranked the sprite total up to 20,000. The program ran fine @ 7 FPS software and ~500 FPS hardware, though the hardware speed jumped back'n'forth from 1000 to 500 constantly.
This will come in handy for the game I'm working on... Thanks!
Posts: 188
Threads: 22
Joined: Mar 2023
Reputation:
12
09-13-2023, 12:33 AM
(This post was last modified: 09-13-2023, 12:33 AM by NakedApe.)
SMcNeill, thanks for your demo too. Very helpful!
Posts: 476
Threads: 25
Joined: Nov 2022
Reputation:
45
(09-12-2023, 11:48 PM)a740g Wrote: (09-12-2023, 10:54 PM)grymmjack Wrote: (09-12-2023, 01:21 PM)a740g Wrote: Made a few changes.
Code: (Select All)
ALIEN_SPRITE& = _NEWIMAGE(w% + 1, h% + 1, 256)
_DEST ALIEN_SPRITE&
PSET (0, 10)
DRAW ALIEN$
_CLEARCOLOR 0, ALIEN_SPRITE&
ALIEN_32& = _NEWIMAGE(w% + 1, h% + 1, 32)
_SOURCE ALIEN_SPRITE&: _DEST ALIEN_32&: _PUTIMAGE
ALIEN_HW& = _COPYIMAGE(ALIEN_32&, 33)
Thanks @a740g ! I was missing `_CLEARCOLOR 0` somehow, and that was the fix?
I don't quite understand that because the screen is `320x200` and the sprite is only `50x50` or so.
Why was the entire background black and not showing the blue?
Thanks again! The `_CLEARCOLOR` is for the sprite transparency. I removed the `_DISPLAYORDER _HARDWARE` line. `_DISPLAYORDER _HARDWARE` will render hardware surfaces only. So, basically `CLS , _RGB32(0, 0, 255)` had no effect with that line.
But without that, it's not using _HARDWARE images?
Posts: 1,272
Threads: 119
Joined: Apr 2022
Reputation:
100
(09-12-2023, 09:46 PM)SMcNeill Wrote: (09-12-2023, 07:41 PM)TerryRitchie Wrote: The reason you're getting 1000 FPS in hardware mode is because that's the upper limit that can be calculated with TIMER(.001). Only when hardware is taxed enough will the frame rate drop below 1000. The program crashes for me when I try to go a few more than 8000 sprites. Perhaps someone with a better video card and more RAM can tax the hardware layer enough to start seeing the FPS drop below 1000 in hardware mode. (or someone has a better timing method I can use)
Try this little demo to showcase the difference in speed between Hardware Images and Software Images:
Code: (Select All)
DIM AS LONG HWscreen, SWscreen, DisplayScreen, TempScreen
DisplayScreen = _NEWIMAGE(1280, 720, 32)
SWscreen = _NEWIMAGE(64, 8, 32)
TempScreen = _NEWIMAGE(64, 8, 32)
'draw a few characters for screen display
_DEST TempScreen 'make a temp software screen to print on
_FONT 8 'size 8 font
_PRINTSTRING (0, 0), "Hardware" 'print the word "Hardware"
HWscreen = _COPYIMAGE(TempScreen, 33) 'make a copy of that temp screen as a hardware screen
_FREEIMAGE TempScreen 'free the temp screen
_DEST SWscreen 'Draw on a software screen
_FONT 8 'same size font 8
_PRINTSTRING (0, 0), "Software" 'And print the word Software on this screen
_DEST DisplayScreen
SCREEN DisplayScreen
HardwareMode = 0 'let's start out in software mode
xdirection = 1: ydirection = 1
DO
IF TIMER > t# THEN
IF FPS > maxFPS THEN maxFPS = FPS
_TITLE "FPS:" + STR$(FPS) + " -- MaxFPS:" + STR$(maxFPS)
t# = TIMER
FPS = 0
ELSE
FPS = FPS + 1
END IF
x = x + xdirection
y = y + ydirection
IF x < 0 OR x > _WIDTH THEN xdirection = -xdirection
IF y < 0 OR y > _HEIGHT THEN ydirection = -ydirection
IF HardwareMode THEN
_DISPLAYORDER _HARDWARE
_PUTIMAGE (x, y), HWscreen
ELSE
_DISPLAYORDER _SOFTWARE
CLS
_PUTIMAGE (x, y), SWscreen, DisplayScreen
END IF
k = _KEYHIT
SELECT CASE k
CASE 27: SYSTEM
CASE ASC("H"), ASC("h"): HardwareMode = -1: maxFPS = 0: FPS = 0
CASE ASC("S"), ASC("s"): HardwareMode = 0: maxFPS = 0: FPS = 0
END SELECT
_DISPLAY
LOOP
On my PC, I get about 100 FPS for the software image animation, and about 130,000 FPS for the hardware image animation.
I think that's enough to showcase a slight difference in the performance between the two. Doh, it never occurred to me to use a simple counter to keep track of frames. That's why Steve is the master
New to QB64pe? Visit the QB64 tutorial to get started.
QB64 Tutorial
Posts: 1,272
Threads: 119
Joined: Apr 2022
Reputation:
100
(09-13-2023, 12:28 AM)NakedApe Wrote: Very cool demo, Terry! What a difference using hardware images. I'm on an M1 Mac Mini and I cranked the sprite total up to 20,000. The program ran fine @ 7 FPS software and ~500 FPS hardware, though the hardware speed jumped back'n'forth from 1000 to 500 constantly.
This will come in handy for the game I'm working on... Thanks! Thanks everyone for the feedback.
NakedApe, you were able to crank the count up to 20,000? Wowsers. I wonder why I can't get much past 8000? I have 32GB of RAM, a 6th gen i7 and a GTX960 video card with 4GB of VRAM. When I try, for example, 8500, the program crashes before a screen in even seen. I just assumed I was using too much video ram creating all those hardware sprites.
Jumping back and forth between 500 and 1000 FPS is because my frame counter is timer based. It's a hack at best. --> 1 / .001 = 1000, 1 / .002 = 500, etc..
New to QB64pe? Visit the QB64 tutorial to get started.
QB64 Tutorial
Posts: 1,272
Threads: 119
Joined: Apr 2022
Reputation:
100
(09-12-2023, 11:04 PM)grymmjack Wrote: (09-12-2023, 07:11 PM)TerryRitchie Wrote: It's well worth learning to use hardware images. Here is a little demo I just wrote showing the power of hardware images. This program creates 8000 sprites and then let's the user switch between software and hardware mode to see the performance difference. I'm going to start creating demos for a lesson on hardware vs software images in the tutorial. It's long overdue.
Keys:
H - hardware mode
S - software mode
ESC - leave program
Note: You may need to decrease the amount of objects depending on your system's performance. Change the TOTAL = 8000 to a lower number that doesn't crash the program.
...and the day has come
@TerryRitchie this is a FANTASTIC example and we should put this in the damned wiki.
I wish the forum had some way to mark posts as notable or something and then a way to just see them in a list.
Thanks Terry! Yes, I agree, a demo showing the virtues of hardware images needs to be in the Wiki, be it this program or someone else's.
New to QB64pe? Visit the QB64 tutorial to get started.
QB64 Tutorial
|