私は今、Windows Graphics Captureを使ってキャプチャーした画面を時間差で表示するプログラムを作成しています。
良い感じに画面のキャプチャーなどはできたのですが、数秒前のキャプチャーした画面を表示しようとしても、キャプチャーしたフレームのデータが現在のものに上書きされてしまって困っています、、、
例えば以下のようなプログラムがあるとします。
C++
1int frame_count = 0; 2IDirect3DSurface tmp_surface; 3 4// この中は毎フレーム実行される 5{ 6 IDirect3DSurface surface = 現在の画面のデータ; 7 8 // 500フレーム目のみtmp_surfaceに代入する 9 if (frame_count == 500) { 10 tmp_surface = surface; 11 } 12 13 if (frame_count == 1000) { 14 // 500フレーム目の画面の状態が見たいのに 15 // 1000フレーム目の画面が表示されてしまう 16 Draw(tmp_surface); 17 } 18 19 frame_count++; 20}
500フレーム目でtmp_surfaceにsurfaceを代入しています。
それを1000フレーム目で表示して500フレーム前の状態を確認しようとしているのですが、どうしても1000フレーム目の状態が表示されてしまいます。
色々調べたのですが、シャローコピーとディープコピーというものがあり、上記のプログラムではシャローコピーになってしまっているのだと思います。
なので、ディープコピーできる方法を調べたのですが、どうも自作のクラスという前提の説明ばかりで、DirectXやWindows Graphics CaptureといったAPIのクラスのディープコピーの方法は出てきません、、、
ID3D11Texture2Dのcopy_toを使用すれば、値自体をコピーできるかなと思ったのですが、これでもシャロ―コピーになってしまいます。
C++
1int frame_count = 0; 2ID3D11Texture2D* pTexture = NULL; 3 4// この中は毎フレーム実行される 5{ 6 IDirect3DSurface surface = 現在の画面のデータ; 7 8 // 500フレーム目のみcopy_toでコピーする 9 if (frame_count == 500) { 10 surface.copy_to(&pTexture); 11 } 12 13 ・ 14 ・ 15 ・
今日で行き詰って3日目です、、、
もし、IDirect3DSurfaceやID3D11Texture2Dのディープコピーの方法がわかる方や、別の手段を知っている方がいればぜひ教えてください!
よろしくお願いします🥺
▼ 参考サイト
画面の取り込み
C++ から Windows Graphics Capture API を利用する方法について調べてみた
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2022/07/07 03:42
2022/07/07 03:44