2023/10/29(日) [n年前の日記]
#1 [hsp] hsp3dishの動作確認中
Windows10 x64 22H2 + HSP 3.7 beta7 で、hsp3dish の動作確認中。
動作確認に使っているPCのスペックは以下。
_昨日、hsp3dish を使ってフルスクリーン表示をするプログラムを書いた のですが。これをメインPC上で動かしたら、あっさり60FPSが出て喜んだものの。
サブPCで動かしてみたら 12 - 17FPSしか出なくて…。そんな速度しか出ないのかよ。ガッカリ。
そこで、ふと、もしかして、サブPC上では GPU を使って描画できていないのでは? と不安になってきて、そのあたりを検証せねばなるまい、と…。
動作確認に使っているPCのスペックは以下。
- メインPC : CPU AMD Ryzen 5 5600X + GPU NVIDIA GeForce GTX 1060 6GB, RAM 16GB
- サブPC : CPU AMD Athlon 5350 + オンボードビデオ Radeon R3, RAM 4GB
_昨日、hsp3dish を使ってフルスクリーン表示をするプログラムを書いた のですが。これをメインPC上で動かしたら、あっさり60FPSが出て喜んだものの。
サブPCで動かしてみたら 12 - 17FPSしか出なくて…。そんな速度しか出ないのかよ。ガッカリ。
そこで、ふと、もしかして、サブPC上では GPU を使って描画できていないのでは? と不安になってきて、そのあたりを検証せねばなるまい、と…。
◎ HSPの標準機能だけで描画してみる :
とりあえず、HSPの標準機能の描画だけを使って試してみた。ソースは以下。hsp3dish関係の命令をコメントアウトしただけですが。
_fullscreen_normal.hsp
使用画像は以下。
_texa2.png
動かしてみたところ…。
60FPS が 7FPS に、12FPS が 1FPS に落ちてしまったわけだから、hsp3dish はちゃんとGPUを使って高速描画してくれていたようだなと…。単にサブPCのオンボードGPUが非力すぎるのだろうなあ…。
_fullscreen_normal.hsp
; HSP normal + fullscreen test. not use hsp3dish
;
; Windows10 x64 22H2 + HSP 3.7beta7
; #include "hsp3dish.as"
#include "d3m.hsp"
#packopt name "fullscreen_normal"
#packopt type 0
#define TEX_FILE "texa2.png"
#pack TEX_FILE
#define KB_ESC $000080
#define FRAMERATE 60
; get desktop size
dispx = ginfo_dispx
dispy = ginfo_dispy
; initialize window without frame
bgscr 0, dispx, dispy, 0, 0, 0
; load image
imgid = 3
celload TEX_FILE, imgid
; split image, set orign.
celdiv imgid, 512, 512, 256, 256
; Set the buffer to draw from. Windows ID 0
gsel 0, 1
; Set screen clear color to be performed when redraw 0 is called.
; 0 or 1, color ($000000 - $ffffff)
; setcls CLSMODE_SOLID, $4080c0
font "Tahoma", 24, 1
angle = 0.0
time_start = d3timer()
*mainloop
; ESC key to exit
stick key, 0
if key & KB_ESC : goto *jobend
tm = d3timer() - time_start
fps = d3getfps()
angle += 0.5
redraw 0 ; draw start
; clear screen
; color 64, 128, 192
; boxf
objmax = 64
repeat objmax
r = double(dispy) * 0.5
a = angle + (270.0 / double(objmax)) * double(cnt)
x = int(r * cos(deg2rad(a))) + (dispx / 2)
y = int(r * sin(deg2rad(a))) + (dispy / 2)
d = double(cnt) / double(objmax)
; draw image by crlput
gmode gmode_rgb0 ; alpha channel enabled. Semi transparency disabled.
pos x, y
scale = 8.0 - (7.5 * d)
idx = (cnt \ 4)
rot = deg2rad(angle * 2.0 + 360.0 * d)
celput imgid, idx, scale, scale, rot
loop
color 255, 255, 255
pos 10, 10
mes strf("[%dx%d] %d/%dFPS", dispx, dispy, fps, FRAMERATE)
redraw 1 ; draw end. screen refersh
await (1000 / FRAMERATE)
; await 12
goto *mainloop
*jobend:
end
使用画像は以下。
_texa2.png
動かしてみたところ…。
- メインPC : 7FPS
- サブPC : 1FPS。数値では1FPSと出てるけど、実際は1FPSすら出ていない感じ。
60FPS が 7FPS に、12FPS が 1FPS に落ちてしまったわけだから、hsp3dish はちゃんとGPUを使って高速描画してくれていたようだなと…。単にサブPCのオンボードGPUが非力すぎるのだろうなあ…。
◎ OpenGL と DirectX のどちらを使うか :
hsp3dish の利用時、OpenGL を使っているのか、DirectX を使っているのか、そのあたりが気になり始めた。
サブPCのオンボードGPUは Radeon R3 だけど、AMD/ATI製GPU の OpenGL周りは色々と不具合があって何かと弱かった記憶があるので、もし hsp3dish が OpenGL を使っているのだとしたら、DircetX を使うように変更することで速度が改善したりしないか、と…。
ただ、hsp3dish で、「OpenGL じゃなくて DirectX を使え」と指示する方法が分からない…。setreq や getreq を使うのだろうか…?
_HSP3Dish プログラミングマニュアル・基本仕様ガイド
スクリーンの初期化をする bgscr の周辺に挿入してみたけれど、これで本当に DirectX が使われているのかどうか…? HGIMG3 の場合は hgini とやらを呼んで初期化が必要になるらしいけど、hsp3dish では該当する命令が見つからない…。
確実に DirectX を使いそうな HGIMG3 を利用して動作確認してみるべきだろうか…。
サブPCのオンボードGPUは Radeon R3 だけど、AMD/ATI製GPU の OpenGL周りは色々と不具合があって何かと弱かった記憶があるので、もし hsp3dish が OpenGL を使っているのだとしたら、DircetX を使うように変更することで速度が改善したりしないか、と…。
ただ、hsp3dish で、「OpenGL じゃなくて DirectX を使え」と指示する方法が分からない…。setreq や getreq を使うのだろうか…?
_HSP3Dish プログラミングマニュアル・基本仕様ガイド
スクリーンの初期化をする bgscr の周辺に挿入してみたけれど、これで本当に DirectX が使われているのかどうか…? HGIMG3 の場合は hgini とやらを呼んで初期化が必要になるらしいけど、hsp3dish では該当する命令が見つからない…。
; get desktop size
dispx = ginfo_dispx
dispy = ginfo_dispy
; initialize window without frame
bgscr 0, dispx, dispy, 0, 0, 0
; DirectX mode enable
setreq SYSREQ_DXWIDTH, dispx
setreq SYSREQ_DXHEIGHT, dispy
setreq SYSREQ_DXMODE, 1
cls 4
getreq dxmode, SYSREQ_DXMODE
getreq devlost, SYSREQ_DEVLOST
getreq dxresult, SYSREQ_RESULT
確実に DirectX を使いそうな HGIMG3 を利用して動作確認してみるべきだろうか…。
[ ツッコむ ]
以上です。