2023/11/12(日) [n年前の日記]
#1 [hsp] HGIMG3のhgcaptureについて調べてる。その2
Windows10 x64 22H2 + HSP 3.7 beta7 で、仮想画面相当に HGIMG3 で描画して、その結果をメイン表示ウインドウに持ってこれないか実験中。
たぶんできたような気がする。ただ、ちと問題はあるけれど、それについては後述。
要するに以下のような仕組みにすれば、それらしくなるのかなと。
たぶんできたような気がする。ただ、ちと問題はあるけれど、それについては後述。
要するに以下のような仕組みにすれば、それらしくなるのかなと。
- プログラム起動時に作成される初期ウインドウ(ID=0)には手を付けない。(後々スクリーンセーバを作りたいので…)
- メイン表示ウインドウ(ID=2)と、仮想画面相当にする表示ウインドウ(ID=5)を新規作成。
- HGIMG3の描画結果のコピー先として、buffer ID=6 も新規作成。この buffer は、仮想画面相当ウインドウと同じサイズにしておく。
- HGIMG3を使って、仮想画面相当の表示ウインドウに色々描画。
- hgcaptureを使って、仮想画面相当表示ウインドウから、buffer ID=6 に、描画内容をコピー。
- buffer ID=6 の内容を、メイン表示ウインドウに拡大描画。その際利用するのは、HSP標準描画機能。HGIMG3で描画はできない。HGIMG3を使って描画しようとすると、仮想画面相当の表示ウインドウ側に描かれてしまうので。
◎ ソース :
_07_hgcapture_02.hsp
使用画像は以下。
_chara.png
; hgcapture使用サンプルその2
; 表示ウインドウを2つ新規作成して、片方を仮想画面相当、片方をメイン表示にする
#include "hgimg3.as"
#include "d3m.hsp"
; 以下の行をコメントアウトするとウインドウ表示になる
;#define FULLSCR
#packopt name "07_hgcapture_02" ; file name
#packopt type 0 ; generate ".exe"
#define TEXFILE "chara.png"
#pack TEXFILE
#define KB_ESC 128
#define KB_LEFT $00001
#define KB_UP $00002
#define KB_RIGHT $00004
#define KB_DOWN $00008
#define KB_CURSOR (KB_LEFT | KB_UP | KB_RIGHT | KB_DOWN)
framerate = 60
title "Screen 0"
; メイン表示ウインドウを確保。HSPの標準描画機能で描画していく
dispid = 2
#ifdef FULLSCR
; get desktop size
dispw = ginfo_dispx
disph = ginfo_dispy
bgscr dispid, dispw, disph, 0, 0, 0, dispw, disph
#else
dispw = 1280
disph = 720
screen dispid, dispw, disph, 0
title "Screen " + dispid
#endif
; hgcapture用バッファを確保
tbufid = 6
vscrw = 512
vscrh = 288
buffer tbufid, vscrw, vscrh
; 仮想画面相当の表示ウインドウを確保。HGIMG3で描画していく
vscrid = 5
; modevalue = screen_hide
modevalue = 0
screen vscrid, vscrw, vscrh, modevalue
title "Screen " + vscrid
hgini
; load texture
texload2 TEXFILE
texid = stat ; get texture ID
texw = 16
texh = 16
clscolor $4080c0 ; set clear color
count = 0
x = (vscrw / 2)
y = (vscrh / 2)
time_start = d3timer()
*mainloop
repeat
; get FPS
tm = d3timer() - time_start
fps = d3getfps()
; ESC key to exit
stick k, KB_CURSOR
if k & KB_ESC : break
; move character
spd = 3
if k & KB_LEFT : x -= spd
if k & KB_RIGHT : x += spd
if k & KB_UP : y -= spd
if k & KB_DOWN : y += spd
hgdraw
; draw images (HGIMG3)
gmode gmode_rgb0, texw, texh
pos x, y
src_x = ((count / 16) \ 2) * texw
src_y = 0
rot = 0.0
scale = 3
dst_w = texw * scale
dst_h = texh * scale
hgrotate texid, src_x, src_y, rot, dst_w, dst_h
; HGIMG3 の描画結果をキャプチャしてbuffer(ID=tbufid)にコピー
; 右端と下端に数ドット黒部分が出るのはバグらしい
gsel tbufid
hgcapture
; メイン表示ウインドウにHGIMG3の描画結果を描画していく
gsel dispid
redraw 0
; zoom copy tbufid -> dispid (HSP標準描画機能)
if 1 {
gmode gmode_gdi
pos 0, 0
gzoom dispw, disph, tbufid, 0, 0, vscrw, vscrh, 1
} else {
gmode gmode_gdi, vscrw, vscrh
pos (dispw / 2), (disph / 2)
grotate tbufid, 0, 0, 0.0, dispw, disph
}
; draw text (HSP標準描画機能)
if 1 {
font "Tahoma", 20, 1, 2
objcolor 255, 255, 255
color 16, 16, 16
pos 16, 16
mes strf("[%dx%d] %d FPS", vscrw, vscrh, fps), 4
}
redraw 1
t = (1000 / framerate) - 1
if t <= 0 : t = 1
hgsync t
count++
loop
*mainloop_end
end
使用画像は以下。
_chara.png
◎ 問題点 :
問題点としては…。処理が遅い…。そのせいか、動きもガクガクしてしまう…。
前述のソースでは違いが分からないかもしれないけれど、以下に示すような描画面積がそれなりに大きい処理の場合、明らかに遅くなる。
_07_hgcapture.hsp
_tex.png
仮想画面相当を経由させずに直接描画すれば60FPSが出る処理内容でも、仮想画面を経由させると60FPSが出なくなったりする。一旦仮想画面を経由することで、描画面積はかなり少なくなって、処理時間が短くなるのではないかと予想していたのだけど、実際には真逆の結果に ―― 速くなるどころか、むしろ遅くなる状態になってしまった。
実際に測定したわけではないから、たしかなことは言えないけれど、どうも hgcapture が遅いのではないかという気がしている。関連情報を眺めると、VRAM からメインメモリに内容をコピーしてくる関係でどうしても遅くなる、と言及されているようだし…。
前述のソースでは違いが分からないかもしれないけれど、以下に示すような描画面積がそれなりに大きい処理の場合、明らかに遅くなる。
_07_hgcapture.hsp
_tex.png
仮想画面相当を経由させずに直接描画すれば60FPSが出る処理内容でも、仮想画面を経由させると60FPSが出なくなったりする。一旦仮想画面を経由することで、描画面積はかなり少なくなって、処理時間が短くなるのではないかと予想していたのだけど、実際には真逆の結果に ―― 速くなるどころか、むしろ遅くなる状態になってしまった。
実際に測定したわけではないから、たしかなことは言えないけれど、どうも hgcapture が遅いのではないかという気がしている。関連情報を眺めると、VRAM からメインメモリに内容をコピーしてくる関係でどうしても遅くなる、と言及されているようだし…。
[ ツッコむ ]
#2 [nitijyou] 選挙に行ってきた
福島県議会議員一般選挙とやらで、近所の下宿公会堂まで行って投票してきた。電動自転車で10:30頃に行ったような気がする。今回のこの地域の立候補者は4人。
◎ 傘を新調 :
帰りに、ホームセンターサンデーに寄って、新しい傘を購入。70cmと書いてある。色は深緑。税抜970円。
今まで持っていた自分用の傘は、いつのまにか骨組みがボキボキに折れていて。親父さんがたまに使ってたらしいのだけど、その際壊れてしまったらしい。そんなわけで、新しく購入。
今まで使っていた傘はかなり鮮やかな緑だったけど、今回購入したのは黒に近い緑で…。ダサい。もっと原色に近い色の傘が欲しいけど、ホームセンターではそんなの売ってないわけで…。ホーマックにも寄って探したけれど、長さが70cmぐらいの商品は置いてなかったわけで…。ひょっとして、ファッションセンターしまむらとかそういうところを回って探したほうが良かったのだろうか。失敗したかも。
今まで持っていた自分用の傘は、いつのまにか骨組みがボキボキに折れていて。親父さんがたまに使ってたらしいのだけど、その際壊れてしまったらしい。そんなわけで、新しく購入。
今まで使っていた傘はかなり鮮やかな緑だったけど、今回購入したのは黒に近い緑で…。ダサい。もっと原色に近い色の傘が欲しいけど、ホームセンターではそんなの売ってないわけで…。ホーマックにも寄って探したけれど、長さが70cmぐらいの商品は置いてなかったわけで…。ひょっとして、ファッションセンターしまむらとかそういうところを回って探したほうが良かったのだろうか。失敗したかも。
[ ツッコむ ]
以上、1 日分です。
