HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0323
123HSP標準命令とHGIMG3同時使用可能ですか?17解決


123

リンク

2013/3/23(Sat) 09:25:40|NO.53162

はじめまして、質問なんですが
HGIMG3で作成した画面をbuffer 2 などに読み込んで
gsel 0
gcopy 〜

などでscreen 0に描画することは可能でしょうか?

よろしくお願いします。



この記事に返信する


KA

リンク

2013/3/23(Sat) 10:21:41|NO.53163

やってみてから聞きましょう。

可能・不可能という問題なら「可能」です。



123

リンク

2013/3/23(Sat) 10:50:26|NO.53164

KAさま申し訳ないです
やってみて出来なかったので質問させていただいたんですが
自分でやると”Direct3Dデバイスの生成に失敗しました”というエラーが出てしまうのです。

bufferをscreenに変えると出来るんですが…
出来れば参考になる方法なりサイトなど教えていただけないでしょうか?



あり

リンク

2013/3/23(Sat) 11:21:21|NO.53165

サンプルの改造ですがこれで動きませんか?
#include "hgimg3.as"
; 立方体をキーで回転させるサンプル ; ; ウインドゥサイズの設定 ; screen 0,640,480,0,640,0 : title "HSPの画面" buffer 2,640,480 screen 1,640,480,0,0,0 :title "HGIMG3の画面" cls 4 ; 初期設定 ; hgini ; BOXオブジェクトを登録 ; setsizef 8.0, 8.0 ; BOXのXYZサイズ setuv 0,0,127,127 ; テクスチャUV座標 addbox mdid ; BOXモデルを作成 texload "btex.bmp" ; テクスチャの登録 regobj mychr,mdid ; BOXモデルをオブジェクトとして登録 ; カメラ位置設定 ; selcpos objset3 0.0, 0.0, 20.0 t = 0.0 *main ; 描画メイン ; hgdraw ; 描画処理 gsel 2 ; HGIMGの画面をHSPバッファにコピー hgcapture gsel 0 redraw 0 color 0,100,0 : boxf gmode 2,640,480 pos 320,240 grotate 2,0,0,t,640,240 t + 0.1 redraw gsel 1 hgsync 10 ; 時間待ち stick k,127 if k&128 : goto *owari ; [ESC]で終了 ; キー操作で回転 ; (スペースキー押しで移動) ; if k&16 { selpos mychr if k&2 : objadd3 0.0, -0.05, 0.0 if k&8 : objadd3 0.0, 0.05, 0.0 if k&4 : objadd3 0.05, 0.0, 0.0 if k&1 : objadd3 -0.05, 0.0, 0.0 } else { selang mychr if k&1 : objadd3 0.0, -0.05, 0.0 if k&4 : objadd3 0.0, 0.05, 0.0 if k&2 : objadd3 0.05, 0.0, 0.0 if k&8 : objadd3 -0.05, 0.0, 0.0 } goto *main *owari end



123

リンク

2013/3/23(Sat) 12:59:06|NO.53166

おお!
あり様ありがとうございます!
自分のシステムに合わせたところ動きました!!
悩みに悩んだ末わからずHGIMG3部分は切り捨てようかと思っていたので
非常に助かりました。
でもCPUの負荷が跳ね上がってしまったのでその部分でまた悩みが増えましたがw
みなさんはCPU負荷どのくらいまで容認してるのかな?



3y

リンク

2013/3/23(Sat) 17:42:43|NO.53172

buffer命令で確保した領域は普通のメモリ空間扱いのため、エラーが出るようです。
私もゲーム制作でHGIMG3の画面をgcopyなどで加工して表示する処理をしたことがありますが、
その時はbgscrを非表示モードにして確保しました。
後の処理はアリさんのスクリプトとほぼ同じようにhgcaptureです。

ただ、リファレンスにも記述があるように、hgcaputureはビデオメモリという
基本的にはメインメモリから隔離されたCPUを経由してビットマップデータを抜き出すという荒業のようなので、処理は重いです。
私が今、作っているゲームは1ループあたり9〜12ミリ秒の処理時間なのですが、
そのうちhgcaptureだけで3〜4ミリ秒かかっていました。
実際にキャプチャするHGIMG3の画面サイズは240x120なので、いかに重たい処理かおわかりでしょうか?
(メインメモリ⇒ビデオメモリの転送は高速ですが、逆方向の転送は画像描画処理の仕組み上けっこうな無理があります)
私は現在、AMD E-450というCPU(&GPU)をリファレンスとして使ってます。
非力なミニノートPC程度の能力なので、これで動けば現在販売されているPCならほぼ大丈夫だろうという目論見です。

このスペックで30フレームキープ、CPU使用率は40パーセント以下が判断基準です。

ご参考になれば><



3y

リンク

2013/3/23(Sat) 17:49:16|NO.53173

すみません、記述ミスがありました><

正しくは
『ビデオメモリという基本的にメインメモリから隔離された領域からCPU経由』
です。

あと、追記ですが、先ほどの判断基準で

Core2Duo E8400(2コア 3GHz)だと25パーセント以下を基準にしてます。
Core-i系は持ってませんが、同コア数同クロックならば、大体同じくらいになると思います。



123

リンク

2013/3/24(Sun) 00:17:54|NO.53189

3y様返信ありがとうございます。
アドバイスいろいろと参考になりました。
>>30フレームキープ、CPU使用率は40パーセント
>>Core2Duo E8400(2コア 3GHz)だと25パーセント以下

なるほど、私の現状の開発はPhenom II X4 955 3.2GHzで行っておりまして
今のスクリプトでCPU使用率が瞬間40%超えてしまう時があるので非常に迷ってます。
hgcaptureの部分をくっつける前までは2%〜5%くらいで安心してたのに…

HGIMG3は使い始めたばかりでほとんどわからないところばかりで慣れるまで
ちょくちょく訪れると思いますがまたよろしくお願いします。

あり様、3y様ありがとうございました。



暇人

リンク

2013/3/25(Mon) 02:32:11|NO.53240

directX8(3D)にはデバイスコンテキストハンドルを
取得する命令が削除されてるらしくBitBltが使えない・・・(使えるなら方法を知りたい)
バッファのフォーマット違いを吸収してくれる命令が使え無いと言う(DX9以上を使えって事か)

なのでデスクトップをキャプチャして利用(HG側のウィンドウ上に何かかぶさるとそれも・・・)

http://hsp.tv/play/pforum.php?mode=pastwch&num=46392
↑のモジュールを使用(最近多いな・・・)
自分の所だと秒間60フレームでCPU使用率30%ぐらい(2コアでタスクマネージャ上の使用率は15%)

#include "mod_d3d9vsync.hsp" #uselib "gdi32.dll" #cfunc CreateDC "CreateDCA" sptr,sptr,sptr,int #func DeleteDC "DeleteDC" int #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 #uselib "user32.dll" #func GetWindowLongA "GetWindowLongA" int , int #func SetWindowLongA "SetWindowLongA" int , int , int #func SetLayeredWindowAttributes "SetLayeredWindowAttributes" int , int , int , int #define WS_EX_LAYERED 0x00080000 #define LWA_COLORKEY 1 #define LWA_ALPHA 2 #define GWL_EXSTYLE -20 #include "hgimg3.as" screen 1,640,480,0,645,0 : title "HSPの画面" buffer 2,640,480 hdcbuf=hdc screen 0,640,480,0,0,0 :title "HGIMG3の画面" //d3d9vsyncがID0用になっちゃってるぽいからら0をHG用に cls 4 hgini setsizef 8.0, 8.0 ; BOXのXYZサイズ setuv 0,0,127,127 ; テクスチャUV座標 addbox mdid ; BOXモデルを作成 texload dir_exe+ "\\sample\\hgimg3\\btex.bmp" ; テクスチャの登録 regobj mychr,mdid ; BOXモデルをオブジェクトとして登録 selcpos objset3 0.0, 0.0, 20.0 hdcScreen = CreateDC("DISPLAY", NULL, NULL, NULL) t = 0.0 gsel 0 d3d9vsync_init if stat < 0 { if -5 ! stat {dialog "GetRasterStatusを使用できない環境です":end} } *main gsel 0 hgdraw ; 描画処理 d3d9vsync hgsync 0 ; 時間待ち hgwx=ginfo_wx1+3 //枠分加算 hgwy=ginfo_wy1+22 BitBlt hdcbuf, 0,0, 640, 480, hdcScreen, hgwx, hgwy, SRCCOPY gsel 1 color 0,100,0 : boxf gmode 2,640,480 pos 320,240 grotate 2,0,0,t,640,240 t + 0.1 color 255 pos 10,10 mes "処理時間 "+d3d9vsync_ptime+"ms" mes "CPU "+d3d9vsync_cpu+"%" mes "FPS "+d3d9vsync_fps redraw redraw 0 stick k,127 if k&128 : goto *owari ; [ESC]で終了 ; キー操作で回転 ; (スペースキー押しで移動) ; if k&16 { selpos mychr if k&2 : objadd3 0.0, -0.05, 0.0 if k&8 : objadd3 0.0, 0.05, 0.0 if k&4 : objadd3 0.05, 0.0, 0.0 if k&1 : objadd3 -0.05, 0.0, 0.0 } else { selang mychr if k&1 : objadd3 0.0, -0.05, 0.0 if k&4 : objadd3 0.0, 0.05, 0.0 if k&2 : objadd3 0.05, 0.0, 0.0 if k&8 : objadd3 -0.05, 0.0, 0.0 } goto *main *owari end
モジュールは無くてもキャプチャは出来る
XP環境なら使った方がキャプチャ画像もティアリングを起さない
Visuta以上だと使ってもキャプチャ画像はティアリング起すかも・・・



暇人

リンク

2013/3/25(Mon) 06:38:13|NO.53243

ちょっと勘違い
>XP環境なら使った方がキャプチャ画像もティアリングを起さない
>Visuta以上だと使ってもキャプチャ画像はティアリング起すかも・・・
キャプチャ画像はティアリング起きない・・・はず・・・

>(HG側のウィンドウ上に何かかぶさるとそれも・・・)
XPなら最前面にすればツールチップぐらいしかSRCCOPYじゃコピーしないけど
Vista以降だと色々写り込みそう・・・



123

リンク

2013/3/25(Mon) 17:44:08|NO.53248

暇人様はじめまして、返信ありがとうございます。
ソースのほうためさせて頂いたところ当方ウィンドウズ7なんですが
ティアリングは起こさなかったです。
screen 0の上に持ってきたウィンドウそのままコピーして表示し、screen 0を非表示にすると
デスクトップ画面そのままをキャプチャしました。

 こんな方法もあるのかと色々と考えさせられましたし、
自分から見てオーバーテクノロジーなモジュールを見て頭が痛くなりましたw

>>自分の所だと秒間60フレームでCPU使用率30%ぐらい(2コアでタスクマネージャ上の使用率は15%)
なるほど、自分はいつも秒間30フレーム前後で動く感じにしてます。
しかし皆さんのフレームレートとCPU使用率は非常に参考になりますね。
知りたい人もいるだろうしこの質問と切り離して
永遠に解決しない質問として別にスレ立てようかな?



暇人

リンク

2013/3/25(Mon) 23:34:36|NO.53252

NO.53240のはDeleteDC忘れてたのと
デスクトップ上の座標指定しなくても
ウィンドウをキャプチャ元に出来る
GetDCExって言う命令があったのでそれでやってみた

HGウィンドウが非アクティブならBitBltを跳ばす事で
違うウィンドウをコピーしないようにしてみた

#uselib "gdi32.dll" #func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int #define NULL 0 #define SRCCOPY 0x00CC0020 #define CAPTUREBLT 0x40000000 #uselib "user32.dll" #func ReleaseDC "ReleaseDC" int , int #cfunc GetDCEx "GetDCEx" int , int , int #include "hgimg3.as" screen 1,640,480,0,645,0 : title "HSPの画面" buffer 2,640,480 hdcbuf=hdc screen 0,640,480,0,0,0 :title "HGIMG3の画面" //d3d9vsyncがID0用になっちゃってるぽいからら0をHG用に cls 4 hgini setsizef 8.0, 8.0 ; BOXのXYZサイズ setuv 0,0,127,127 ; テクスチャUV座標 addbox mdid ; BOXモデルを作成 texload dir_exe+ "\\sample\\hgimg3\\btex.bmp" ; テクスチャの登録 regobj mychr,mdid ; BOXモデルをオブジェクトとして登録 selcpos objset3 0.0, 0.0, 20.0 t = 0.0 gsel 0,1 hWndhg=hWnd #define DCX_PARENTCLIP $20 // 親ウィンドウの可視領域を使用 hdchg=GetDCEx(hWndhg,0,DCX_PARENTCLIP) onexit *owari *main gsel 0 stick k,127 if k&128 : goto *owari ; [ESC]で終了 hgdraw ; 描画処理 hgsync 16 ; 時間待ち if ginfo_act ! 0 { //HGウィンドウ以外がアクティブになったらactに値をセットしてBitBlt処理を跳ばす act=5 if ginfo_act > 0 {gsel 0,1}//HSPウィンドウがアクティブになったらHGウィンドウを強制的にアクティブ化 }else{ act-- } if act<=0 {//他のウィンドウをコピーしないようにHGウィンドウがアクティブになってからactが0以下でBitBltの処理 BitBlt hdcbuf, 0,0, 640, 480, hdchg, 0, 0, SRCCOPY gsel 1 color 0,100,0 : boxf gmode 2,640,480 pos 320,240 grotate 2,0,0,t,640,480 t + 0.05 redraw redraw 0 if k&16 { selpos mychr if k&2 : objadd3 0.0, -0.05, 0.0 if k&8 : objadd3 0.0, 0.05, 0.0 if k&4 : objadd3 0.05, 0.0, 0.0 if k&1 : objadd3 -0.05, 0.0, 0.0 } else { selang mychr if k&1 : objadd3 0.0, -0.05, 0.0 if k&4 : objadd3 0.0, 0.05, 0.0 if k&2 : objadd3 0.05, 0.0, 0.0 if k&8 : objadd3 -0.05, 0.0, 0.0 } } goto *main *owari ReleaseDC hWndhg,hdchg end

>自分から見てオーバーテクノロジーなモジュールを見て頭が痛くなりましたw
今回は使わないでやってますw



123

リンク

2013/3/26(Tue) 08:51:56|NO.53255

暇人様返信ありがとうございます。
APIなどは普段から勉強不足なので(ほとんど使わないので敬遠しがちだし使ってもすぐ忘れるw)
このサンプルはわかりやすくとても勉強になりました。

暇人様、丁寧なサンプルどうもありがとうございました。



暇人

リンク

2013/3/30(Sat) 12:26:36|NO.53344

まだ方法があった
直接バックバッファから持ってこれるから不要なものが写り込む事も無い
ちょっとNO.53252のに比べると複雑になるから出来たら後でモジュールにしてみる

方法は
D3D8COM使ってhgimg3バックバッファと互換性のあるTexture(32ビット色)を作り
バックバッファからCopyRectsして、そのTextureをLockRectしてアドレス取得し
SetDIBitsでTextureを色データとしてをHSPバッファ(24ビット色)のピクセル変更
(32ビット色>24ビット色へ変更とコピーしてるのと同等)


BitBltよりちょっとだけ軽いかも(因みにhgcaptureは10msぐらい)
BitBltが2ms以上でCopyRects+SetDIBitsが1ms前後って程度だが・・・
hgsyncの後にCopyRectsしないと少し重くなる感じ



暇人

リンク

2013/3/31(Sun) 21:15:09|NO.53363

hgcapture2を実装するモジュール
使い方は通常のhgcaptureと同じ
コピー先HSPバッファID、コピー元座標サイズ、コピー先座標を指定できる

NO.53344でSetDIBits使うようなこと書いたけど
SetDIBitsToDeviceの方が使い勝手良いので変更
ついでに拡縮にも対応させたhgcapture2Ex(StretchDIBitsを使用)も実装

コピー先バッファとHGIMG3を初期化したサイズは同じにする必要はない

hginiとhgdrawを置き換えてるのでHGIMG3のバージョンアップでパラメータが追加されたら
それにあわせて変更する必要がある


#include "hgimg3.as" //mod_hgcapture2をincludeする場合必ずhgimg3.asの後にしてください #module "mod_hgcapture2" #define global SRCCOPY $00CC0020;// { dest = source } #define global SRCPAINT $00EE0086;// { dest = source OR dest } #define global SRCAND $008800C6;// { dest = source AND dest } #define global SRCINVERT $00660046;// { dest = source XOR dest } #define global SRCERASE $00440328;// { dest = source AND (NOT dest ) } #define global NOTSRCCOPY $00330008;// { dest = (NOT source) } #define global NOTSRCERASE $001100A6;// { dest = (NOT src) AND (NOT dest) } #define global MERGECOPY $00C000CA;// { dest = (source AND pattern) } #define global MERGEPAINT $00BB0226;// { dest = (NOT source) OR dest } #define global PATCOPY $00F00021;// { dest = pattern } #define global PATPAINT $00FB0A09;// { dest = DPSnoo } #define global PATINVERT $005A0049;// { dest = pattern XOR dest } #define global DSTINVERT $00550009;// { dest = (NOT dest) } #define global BLACKNESS $00000042;// { dest = BLACK } #define global WHITENESS $00FF0062;// { dest = WHITE #define global BLACKONWHITE 1 #define global COLORONCOLOR 3 #define global HALFTONE 4 #uselib "gdi32.dll" #cfunc SetDIBits "SetDIBits" int,int,int,int,int,var,int #cfunc SetDIBitsToDevice "SetDIBitsToDevice" int,int,int,int,int,int,int,int,int,var,var,int #cfunc StretchDIBits "StretchDIBits" int,int,int,int,int,int,int,int,int,var,var,int,int #func SetBrushOrgEx "SetBrushOrgEx" int,int,int,int #func SetStretchBltMode "SetStretchBltMode" int,int #usecom IDirect3DDevice8 "{7385E5DF-8FE8-41D5-86B6-D7B48547B6CF}" #comfunc global IDirect3DDevice8_CreateTexture 20 int,int,int,int,int,int,int #comfunc global IDirect3DDevice8_CopyRects 28 int,int,int,int,int #comfunc global IDirect3DDevice8_GetRenderTarget 32 int #define DIB_PAL_COLORS 1 ;DIBカラーは論理パレットによる #define DIB_RGB_COLORS 0 ;DIBカラーはRGBカラー値 #usecom IID_IDirect3DSurface8 "{B96EEBCA-B326-4ea5-882F-2FF5BAE021DD}" #comfunc IDirect3DSurface8_GetDesc 8 int #comfunc IDirect3DSurface8_LockRect 9 int,int,int #comfunc IDirect3DSurface8_UnlockRect 10 #usecom IID_IDirect3DTexture8 "{E4CDD575-2866-4f01-B12E-7EECE1EC9358}" #comfunc IDirect3DTexture8_GetSurfaceLevel 15 int,int #define D3DFMT_A8R8G8B8 21 #define D3DFMT_X8R8G8B8 22 #define D3DPOOL_DEFAULT 0 #define D3DPOOL_MANAGED 1 #define D3DPOOL_SYSTEMMEM 2 #define D3DUSAGE_DEPTHSTENCIL 0x00000002 #define D3DUSAGE_DYNAMIC 0x00000200 #define D3DUSAGE_AUTOGENMIPMAP 0x00000400 #define D3DLOCK_READONLY 0x00000010 #define D3DLOCK_DISCARD 0x00002000 #define D3DLOCK_NOSYSLOCK 0x00000800 #define D3DLOCK_DONOTWAIT 0x00004000 #define D3DLOCK_NO_DIRTY_UPDATE 0x00008000 #enum SURFACE = 0 #enum TEXTURE #enum RENDERTARGET #enum PTRD3DDEV #enum PTRD3DDEVCOMEND #undef hgini #undef hgdraw //HGIMG3のhgdrawを乗っ取ってhgdrfを1に #define global hgdraw(%1=0) _hgdraw %1 #deffunc _hgdraw int p1 hgdraw@hsp p1 hgdrf =1 return //HGIMG3のhginiを乗っ取ってhgcapture2_initを追加で実行 #define global hgini(%1=0,%2=0) __hgini %1,%2 #deffunc __hgini int p1,int p2 mref bm@HGIMG,67 hgmode@HGIMG = bm@HGIMG(3) _hgini p1,p2 ; hgsel@HGIMG=ginfo(3) buffer WORKSCR,128,128,hgmode@HGIMG gsel hgsel@HGIMG wait 1 //hgcapture2初期化 hgcapture2_init return //hgcapture2初期化 (hgini内で実行されるので自分で実行する必要は無い) //hgcapture2_init #deffunc hgcapture2_init if LPBITMAPINFO=0 {//初めての初期化 dimtype com,6,PTRD3DDEVCOMEND dim ret,PTRD3DDEVCOMEND hggetreq ret(PTRD3DDEV),SYSREQ_PTRD3DDEV newcom com(PTRD3DDEV), , -1, ret(PTRD3DDEV) IDirect3DDevice8_GetRenderTarget com(PTRD3DDEV),varptr(ret(RENDERTARGET)) :if stat : dialog "error "+__line__+": GetRenderTargetData "+stat : end newcom com(RENDERTARGET), , -1, ret(RENDERTARGET) }else{//二回目の初期化はテクスチャ関係だけ削除して作り直し hgcapture2_end } dim D3DSURFACE_DESC,8 IDirect3DSurface8_GetDesc com(RENDERTARGET),varptr(D3DSURFACE_DESC) dup dup_D3DFORMAT,D3DSURFACE_DESC dup dup_tsizex,D3DSURFACE_DESC(6) dup dup_tsizey,D3DSURFACE_DESC(7) //D3DUSAGEとMANAGEDの指定はどの組み合わせが良いのか良く分からない・・・ IDirect3DDevice8_CreateTexture com(PTRD3DDEV),dup_tsizex,dup_tsizey,1,D3DUSAGE_DYNAMIC, dup_D3DFORMAT,D3DPOOL_SYSTEMMEM,varptr(ret(TEXTURE)) :if( stat ) : dialog "error "+__line__+": CreateTexture "+stat : end newcom com(TEXTURE), , -1, ret(TEXTURE) IDirect3DTexture8_GetSurfaceLevel com(TEXTURE),0,varptr(ret(SURFACE)) :if stat : dialog "error "+__line__+": GetSurfaceLevel "+stat : end newcom com(SURFACE), , -1, ret(SURFACE) dim LPBITMAPINFO,10 LPBITMAPINFO = 40 ,dup_tsizex ,-dup_tsizey ,((32<<16) | 1) //上下反転した32ビットの色データとしてLPBITMAPINFOを設定 dim D3DLOCKED_RECT8,2 return //DirectX画面データの取得 //hgcapture2 id, s_left, s_top, s_sizx, s_sizy, d_left, d_top //id =コピー先HSPバッファID //s_left =コピー元矩形左 //s_top =コピー元矩形上 //s_sizx =コピー横サイズ //s_sizy =コピー縦サイズ //d_left =コピー先左 //d_top =コピー先上 //コピーされたライン数がstatに返る #define global hgcapture2(%1=-1,%2=0,%3=0,%4=dup_tsizex@mod_hgcapture2,%5=dup_tsizey@mod_hgcapture2,%6=0,%7=0) _hgcapture2 %1,%2,%3,%4,%5,%6,%7,0,0,0,0,0 //拡大縮小ラスタオペレーション付きDirectX画面データの取得 //hgcapture2Ex id, d_left, d_top, d_sizx, d_sizy, s_left, s_top, s_sizx, s_sizy, mode, copyf //id =コピー先HSPバッファID //d_left =コピー先左 //d_top =コピー先上 //d_sizx =コピー先横サイズ //d_sizy =コピー先縦サイズ //s_left =コピー元矩形左 //s_top =コピー元矩形上 //s_sizx =コピー元横サイズ //s_sizy =コピー元縦サイズ //modey =ズームのモード(COLORONCOLORが通常,HALFTONEがgzoomのモード1同じ) //copyfy =ラスタオペレーション(SRCCOPYが通常、他にANDや色反転などがある) //コピーされたライン数がstatに返る #define global hgcapture2Ex(%1=-1,%2=0,%3=0,%4=dup_tsizex@mod_hgcapture2,%5=dup_tsizey@mod_hgcapture2,%6=0,%7=0,%8=dup_tsizex@mod_hgcapture2,%9=dup_tsizey@mod_hgcapture2,%10=COLORONCOLOR,%11=SRCCOPY) _hgcapture2 %1,%6,%7,%8,%9,%2,%3,%4,%5,%10,%11,1 #deffunc _hgcapture2 int id,int s_left,int s_top,int s_sizx,int s_sizy,int d_left ,int d_top ,int d_sizx ,int d_sizy,int mode,int copyf,int copyt if id < 0 {_id=ginfo(3)}else{_id=id} if ((WHITENESS | BLACKNESS) & copyf) =0 and hgdrf {hgdrf=0 //hgdrfはhgdrawが実行されたら1になり1フレーム内に複数回hgcapture2しても無駄にCopyRectsを使わないようにしてる //hgdrawとhgsyncの間にCopyRectsが実行されると少し処理時間が増す //LockRectでもコピー座標サイズを指定できるがバッファ全体を対象にしないと処理時間が不安定になるのでDIBitsの方で対応 IDirect3DDevice8_CopyRects com(PTRD3DDEV),ret(RENDERTARGET),0,0,ret(SURFACE),0 :if stat : dialog "error "+__line__+": CopyRects "+stat:end } id_bak=ginfo(3) gsel _id IDirect3DSurface8_LockRect com(SURFACE),varptr(D3DLOCKED_RECT8), 0, D3DLOCK_READONLY|D3DLOCK_NO_DIRTY_UPDATET:if stat : dialog "error "+__line__+": CopyRectsLockRect "+stat:end dupptr RECT8, D3DLOCKED_RECT8(1), D3DLOCKED_RECT8*dup_tsizey if copyt=0 { CopyLine = SetDIBitsToDevice(hdc, d_left, d_top, s_sizx, s_sizy, s_left, s_top, 0, dup_tsizey, RECT8,LPBITMAPINFO, DIB_RGB_COLORS) }else{ SetStretchBltMode hdc,mode if mode=HALFTONE {SetBrushOrgEx hdc,0,0,0} CopyLine = StretchDIBits(hdc, d_left, d_top, d_sizx,d_sizy,s_left, s_top, s_sizx, s_sizy, RECT8, LPBITMAPINFO, DIB_RGB_COLORS, copyf) } IDirect3DSurface8_UnlockRect com(SURFACE) :if stat : dialog "error "+__line__+": UnlockRect "+stat:end gsel id_bak return CopyLine #deffunc hgcapture2_end onexit //RENDERTARGET,PTRD3DDEVまでdelcomするとエラーが出る repeat RENDERTARGET if vartype(com(cnt)) = 6 : delcom com(cnt) loop return #global //モジュールここまで screen 1,640,480,0,645,0 : title "HSPの画面" buffer 2,640,480 screen 0,640,480,0,0,0 :title "HGIMG3の画面" cls 4 hgini setsizef 8.0, 8.0 ; BOXのXYZサイズ setuv 0,0,127,127 ; テクスチャUV座標 addbox mdid ; BOXモデルを作成 texload dir_exe+ "\\sample\\hgimg3\\btex.bmp" ; テクスチャの登録 regobj mychr,mdid ; BOXモデルをオブジェクトとして登録 selcpos objset3 0.0, 0.0, 20.0 t = 0.0 gsel 0,1 dim ms,5 *main gsel 0 stick k,127 if k&128 : goto *owari ; [ESC]で終了 hgdraw ; 描画処理 hgsync 16 ; 時間待ち hggettime tim(timcnt\25),0//hgcapture2の処理時間を計測 //コピー先HSPウィンドウID,コピー元座標,コピーサイズ,コピー先座標を指定出来ます //hgcapture2 id, s_left, s_top, s_sizx, s_sizy, d_left, d_top //idを指定しない場合現在の描画先にコピーされる(hgcaptureと同じ) hgcapture2 2 hggettime tim2(timcnt\25),0//hgcapture2の処理時間を計測 gsel 1 color 0,100,0 : boxf gmode 2,640,480 pos 320,240 grotate 2,0,0,t,640,480 //hgcapture2Ex id, d_left, d_top, d_sizx, d_sizy, s_left, s_top, s_sizx, s_sizy, mode, copyf // id コピー先HSPウィンドウID // d_left, d_top, d_sizx, d_sizy(p2〜p5) コピー先座標とサイズ // s_left, s_top, s_sizx, s_sizy(p6〜p9) コピー元座標とサイズ // mode(p10) 拡縮時のモード(省略時COLORONCOLOR) 使える定数 BLACKONWHITE,COLORONCOLOR,HALFTONE // copyf(p11) コピーの種類(省略時SRCCOPY)に使える定数 SRCCOPY,SRCPAINT,SRCAND,SRCINVERT,SRCERASE,NOTSRCCOPY,NOTSRCERASE,MERGECOPY,MERGEPAINT,PATCOPY,PATPAINT,PATINVERT,DSTINVERT,BLACKNESS,WHITENESS hgcapture2Ex 1,0,0,640/3,480/3 color 255 pos 10,10 //25フレーム分を個別にhgcapture2の処理時間表示 repeat limit(timcnt,0,25) mes (tim2(cnt)-tim(cnt)) ms(limit((tim2(cnt)-tim(cnt)),0,5))++ loop timcnt++ pos 100,200 //0〜4msの割合を表示 msall=ms+ms(1)+ms(2)+ms(3)+1 repeat 5 mes strf("%dms %5.2f%%",cnt,1.0*ms(cnt)/msall*100) loop t + 0.05 redraw redraw 0 if k&16 { selpos mychr if k&2 : objadd3 0.0, -0.05, 0.0 if k&8 : objadd3 0.0, 0.05, 0.0 if k&4 : objadd3 0.05, 0.0, 0.0 if k&1 : objadd3 -0.05, 0.0, 0.0 } else { selang mychr if k&1 : objadd3 0.0, -0.05, 0.0 if k&4 : objadd3 0.0, 0.05, 0.0 if k&2 : objadd3 0.05, 0.0, 0.0 if k&8 : objadd3 -0.05, 0.0, 0.0 } goto *main *owari end



暇人

リンク

2013/4/1(Mon) 00:56:50|NO.53366

ちょっとコメントが間違ってた
> //LockRectでもコピー座標サイズを指定できるがバッファ全体を対象にしないと処理時間が不安定になるのでDIBitsの方で対応
LockRectじゃ無くてCopyRectsでした・・・



暇人

リンク

2013/4/1(Mon) 01:37:46|NO.53368

あ、hgcapture2Exが先にhgcapture2実行してないとDXの画面コピー出来てない・・・
> if ((WHITENESS | BLACKNESS) & copyf) =0 and hgdrf {hgdrf=0 //hgdrfはhgdrawが実行されたら1になり1フレーム内に複数回hgcapture2しても無駄にCopyRectsを使わないようにしてる


if (((WHITENESS = copyf) or (BLACKNESS = copyf))=0) and hgdrf {hgdrf=0 //hgdrfはhgdrawが実行されたら1になり1フレーム内に複数回hgcapture2しても無駄にCopyRectsを使わないようにしてる
に修正



暇人

リンク

2013/4/18(Thu) 19:15:30|NO.53573

今更だけど縦のコピー元サイズを変更すると
上からじゃなくて下からの範囲になってた・・・

コピー元座標を 元のサイズ-指定コピー元サイズ で指定すれば問題無いけど
一応修正箇所

> CopyLine = SetDIBitsToDevice(hdc, d_left, d_top, s_sizx, s_sizy, s_left, s_top, 0, dup_tsizey, RECT8,LPBITMAPINFO, DIB_RGB_COLORS)


CopyLine = SetDIBitsToDevice(hdc, d_left, d_top, s_sizx, s_sizy, s_left,-s_top, 0, s_sizy, RECT8,LPBITMAPINFO, DIB_RGB_COLORS)


> CopyLine = StretchDIBits(hdc, d_left, d_top, d_sizx,d_sizy,s_left, s_top, s_sizx, s_sizy, RECT8, LPBITMAPINFO, DIB_RGB_COLORS, copyf)


CopyLine = StretchDIBits(hdc, d_left, d_top, d_sizx,d_sizy,s_left, -s_top+(dup_tsizey-s_sizy), s_sizx, s_sizy, RECT8, LPBITMAPINFO, DIB_RGB_COLORS, copyf)
に修正

後、NO.53363のはデバイスロストには対応してない
エラーダイアログ出して終了するようにしてる
機能追加してデバイスロストにも対応させたやつを
そのうち書き込むかも・・・



ONION software Copyright 1997-2023(c) All rights reserved.