アプリ版:「スタンプのみでお礼する」機能のリリースについて

私は今、Windows Graphics Captureを使ってキャプチャーした画面を時間差で表示するプログラムを作成しています。

良い感じに画面のキャプチャーなどはできたのですが、数秒前のキャプチャーした画面を表示しようとしても、キャプチャーしたフレームのデータが現在のものに上書きされてしまって困っています、、、


例えば以下のようなプログラムがあるとします。

---

IDirect3DSurface tmp_surface;

# この中は毎フレーム実行される
{
 IDirect3DSurface surface = 現在の画面のデータ;

 # 500フレーム目のみtmp_surfaceに代入する
 if (frame_count == 500) {
  tmp_surface = surface;
 }

 # 1000フレーム目で表示して確認してみる
 if (frame_count == 1000) {
  # 500フレーム目の画面の状態が見たいのに
  # 1000フレーム目の画面が表示されてしまう
  Draw(tmp_surface);
 }

 frame_count++;
}

---

500フレーム目でtmp_surfaceにsurfaceを代入して値を保持しています。

それを1000フレーム目で表示して500フレーム前の状態を確認しようとしているのですが、どうしても1000フレーム目の状態が表示されてしまいます。

色々調べたのですが、シャローコピーとディープコピーというものがあり、上記のプログラムではシャローコピーになってしまっているのだと思います。

なので、ディープコピーできる方法を調べたのですが、どうも自作のクラスという前提の説明ばかりで、DirectXやWindows Graphics CaptureといったAPIのクラスのディープコピーの方法は出てきません、、、

もし方法がわかる方や、別の手段を知っている方がいればぜひ教えてください!

よろしくお願いします!


▼ 参考サイト
https://docs.microsoft.com/ja-jp/windows/uwp/aud …
https://tips.hecomi.com/entry/2021/03/23/230947

質問者からの補足コメント

  • そうですね、書き方が悪かったです。

    値は保持しているつもりで参照を持っているだけ、つまりシャローコピーになってしまっていると思います。

    なのでディープコピーの方法を知りたいというのが今回の質問内容です。

    私も推測で、メンバ変数を一つ一つ値渡しでコピーすると言った方法は思いついたのですが、DirectXなどのAPIのクラスが持つメンバ変数は、自分が作ったクラスでもないですし複雑 (アクセス指定子の影響など) なので、なかなか簡単に中身をコピーすることができません。

    コピーコンストラクタなども自作クラスの例しか出てきませんし、、、

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/07/06 10:37
  • うれしい

    こちらにて解決しました↓
    https://teratail.com/questions/3aq9e4z44k1ubt

      補足日時:2022/07/09 10:51

A 回答 (1件)

>500フレーム目でtmp_surfaceにsurfaceを代入して値を保持しています。


本当に?

>それを1000フレーム目で表示して500フレーム前の状態を確認しようとしているのですが、どうしても1000フレーム目の状態が表示されてしまいます。

症状から推測すると、

 # 500フレーム目のみtmp_surfaceに代入する
 if (frame_count == 500) {
  tmp_surface = surface;
 }

では
 500フレーム目にキャプチャーした画面が入っている中身ではなく
 500フレーム目にキャプチャーした画面が入っている入れ物の場所
をコピーしただけなのでは?
その後、その場所に別のキャプチャーした画面が入れられれば、当然、その時入っている画像(1000フレーム目の画像)が表示される
ということでしょうかね。

>もし方法がわかる方や、
具体的な操作方法はわかりませんが、推測が正しいとすれば、
500フレーム目にキャプチャーした画面が入っている「中身をコピーする命令」を書けばよいだけの気がしますけど・・・
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!