mieki256's diary



2023/10/29() [n年前の日記]

#1 [hsp] hsp3dishの動作確認中

Windows10 x64 22H2 + HSP 3.7 beta7 で、hsp3dish の動作確認中。

動作確認に使っているPCのスペックは以下。
_昨日、hsp3dish を使ってフルスクリーン表示をするプログラムを書いた のですが。これをメインPC上で動かしたら、あっさり60FPSが出て喜んだものの。

サブPCで動かしてみたら 12 - 17FPSしか出なくて…。そんな速度しか出ないのかよ。ガッカリ。

そこで、ふと、もしかして、サブPC上では GPU を使って描画できていないのでは? と不安になってきて、そのあたりを検証せねばなるまい、と…。

HSPの標準機能だけで描画してみる :

とりあえず、HSPの標準機能の描画だけを使って試してみた。ソースは以下。hsp3dish関係の命令をコメントアウトしただけですが。

_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 では該当する命令が見つからない…。

    ; 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 を利用して動作確認してみるべきだろうか…。

以上です。

過去ログ表示

Prev - 2023/10 - Next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project