トップページ > 記事閲覧
ムービーグラフィックを作成して一度も再生していない状態で描画すると、ごくまれに変色する
名前:あいおい? 日時: 2020/08/10 00:18

題名の通りです。C#版を使用しています。 動画を背景として表示していて、特定のタイミングになったら再生を開始するという処理を実装した場合、 再生開始の前に動画の色が変色したり、一面緑なったりします。 つまり、PlayMovieToGraphを一度もしていない状態での描画(DrawRectRotaGraph3F)で発生する問題です。
メンテ

Page: 1 |

Re: ムービーグラフィックを作成して一度も再生していない状態で描画すると、ごくまれに変色する ( No.1 )
名前:あいおい? 日時:2020/08/11 02:12

このようなプログラムを組みましたが、不具合について再現できませんでした……。 もしかしたら、自分のプログラムに不備があるか、動画の読み込みの前後で他のグラフィックハンドルも生成してるので、その所為かもしれません……。 using System; using DxLibDLL; namespace DXLibTest { class Program { static void Main(string[] args) { SetUp(); while (DX.ProcessMessage() == 0) { DX.ClearDrawScreen(); DX.SetDrawScreen(DX.DX_SCREEN_BACK); Update(); Draw(); DX.ScreenFlip(); } Fin(); } static private int MovieHandle; static private void Update() { while (DX.GetMouseInputLog2(out var i, out _, out _, out var s, DX.TRUE) == 0) { if ((i & DX.MOUSE_INPUT_1) == 1 && s == DX.MOUSE_INPUT_LOG_UP) { DX.DeleteGraph(MovieHandle); MovieHandle = DX.LoadGraph(@"xxx.mp4"); } } } static private void Draw() { DX.DrawRectRotaGraph3F(0, 0, 0, 0, 1920, 1080, 0, 0, 0.75, 0.75, 0, MovieHandle, DX.TRUE); } static private void SetUp() { DX.ChangeWindowMode(DX.TRUE); DX.SetGraphMode(1280, 720, 32); DX.SetAlwaysRunFlag(DX.TRUE); DX.SetMultiThreadFlag(DX.TRUE); if (DX.DxLib_Init() == 1) { throw new Exception(); } } static private void Fin() { DX.DxLib_End(); } } }
メンテ
Re: ムービーグラフィックを作成して一度も再生していない状態で描画すると、ごくまれに変色する ( No.2 )
名前:管理人 日時:2020/08/09 20:31

うーん、mp4ファイルの再生には Media Foundation という機能を使用していて、この機能を 使用して動画を再生する場合は PlayMovitToGraph を実行していない状態でも 第1フレームが表示される筈なのですよね… 私も No.1 に載せていただいたプログラムを実行してみましたが、特に問題は発生しませんでした… 申し訳ありませんが、もう少し原因の絞り込みをしていただけないでしょうか? m(_ _;m ( 若しくは現象が確認できるプロジェクトを、現象の再現に不要なファイルやコードを除いた状態で アップローダー等にアップしていただけないでしょうか? 直接現象を手元で確認できれば何か分かるかもしれませんので… )
メンテ
Re: ムービーグラフィックを作成して一度も再生していない状態で描画すると、ごくまれに変色する ( No.3 )
名前:あいおい? 日時:2020/08/10 00:18

なんとなく原因が判明したので書かせていただきます この現象はふつうのグラフィックハンドルでも起こることが判明しました。 背景の動画や画像は、これらだけ特殊な読み込み方をしていて、Task.Run()、つまりスレッドを建ててそちらで読み込んでいます。 ふつうのグラフィックハンドルでも発生するのであれば、 他の場所で使われてるグラフィックハンドルでも起こるはずなのに再現しないことから、原因はマルチスレッドでの読み込みにあると考えられます。 アプリ画面を止めたくないという理由で別スレッドで読み込みだけ行ってましたが、それがまずいのかと思いました……。 とりあえず、イテレーターを使ってちょこっとずつ画面が止まらない程度にロード処理を挟もうと思います。
メンテ
Re: ムービーグラフィックを作成して一度も再生していない状態で描画すると、ごくまれに変色する ( No.4 )
名前:管理人 日時:2020/08/10 22:12

> 他の場所で使われてるグラフィックハンドルでも起こるはずなのに再現しないことから、原因はマルチスレッドでの読み込みにあると考えられます。 なるほど、確かにマルチスレッドが原因の可能性が高そうですね… > アプリ画面を止めたくないという理由で別スレッドで読み込みだけ行ってましたが、それがまずいのかと思いました……。 > とりあえず、イテレーターを使ってちょこっとずつ画面が止まらない程度にロード処理を挟もうと思います。 DXライブラリでも SetUseASyncLoadFlag という関数を使うことで非同期読み込みが可能ですので、 アプリの画面を止めずに画像や音のロードをされたい場合は SetUseASyncLoadFlag を使用してみてください m(_ _)m <関数リファレンス SetUseASyncLoadFlag> https://dxlib.xsrv.jp/function/dxfunc_other.html#R21N1
メンテ
Re: ムービーグラフィックを作成して一度も再生していない状態で描画すると、ごくまれに変色する ( No.5 )
名前:あいおい? 日時:2020/08/11 02:11

> アプリの画面を止めずに画像や音のロードをされたい場合は SetUseASyncLoadFlag を使用してみてください m(_ _)m ありがとうございます、こちらの方法で実装してみます。 こちらの関数は、SetUseASyncLoadFlag(TRUE)した後、非同期で読み込みたい画像のハンドル作成を待たずにSetUseASyncLoadFlag(FALSE)してよろしいでしょうか? 全てのグラフィックハンドルを非同期化する訳ではないので、頻繁に切り替えることを想定しています。
メンテ
Re: ムービーグラフィックを作成して一度も再生していない状態で描画すると、ごくまれに変色する ( No.6 )
名前:管理人 日時:2020/08/12 01:07

> こちらの関数は、SetUseASyncLoadFlag(TRUE)した後、非同期で読み込みたい画像のハンドル作成を待たずにSetUseASyncLoadFlag(FALSE)してよろしいでしょうか? はい、LoadGraph や LoadSound は呼ばれた時点での SetUseASyncLoadFlag の設定を保存していますので、 LoadGraph や LoadSound 呼び出しの次の行で SetUseASyncLoadFlag(FALSE) を実行しても問題ありません
メンテ
Re: ムービーグラフィックを作成して一度も再生していない状態で描画すると、ごくまれに変色する ( No.7 )
名前:あいおい?(解決) 日時:2020/08/12 23:04

> LoadGraph や LoadSound 呼び出しの次の行で SetUseASyncLoadFlag(FALSE) を実行しても問題ありません 情報、ありがとうございます 読み込みの課題についても解決できそうです。ありがとうございました m(__)m
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存