« FAQ -ONS編- | メイン | ぼろぼろ »

2008年09月07日

●バイナリサーチによる連番ムービー準備時間の短縮

伊代かわいいよ伊代移植パッチとは別口で(また一部の人しか判らないことを)
先日 ONScripter での連番画像を使ったムービー再生について考える機会がありました。

ちなみに最近の作業物では、めんどくさいので実は盛り込んでなかったんですよね。
しかしあるとないとじゃ没入感がやはり違ってくるので真面目にやってみようかと。

大本は変わらずすとーむさん製の連番ムービー再生スクリプトです。改めてありがとうございます。

1から順次画像をチェック(fileexist)して画像枚数を測定し、経過時間でフレーム制御するというこの方式。
PSPで使用する際のネックは、測定に要する時間が非常に長くなってしまうという点でした。
以前カタハネ等で組み込んだ時は、測定を終盤まで100枚単位で行って多少測定時間を短くしてはいたのですが、まだまだ長すぎです。

そこで今回はバイナリサーチ(二分探索)による測定時間短縮を目論んでみました。

*movie
getparam $1,%1	;movie "ムービーのBGMファイル",再生時間
saveoff
fileexist %2,$1:if %2=0 return
csp -1
csp2 -1
split $1,".",$2:add $2,"-"
mov %2,0:mov %3,7	;画像ファイルは movie-0000001.jpg のような7桁連番で
mov %4,5000	;上限値設定
for %0=0 to 100
	itoa $0,%4:len %5,$0:mov %5,%3-%5
	for %6=1 to %5:mov $0,"0"+$0:next
	fileexist %2,$2+$0+".jpg"
	if %2=1 add %4,5000
	if %2=0 break
next
mov %7,0	;下限値設定

for %0=0 to 999999
mov %8,(%7+%4)/2 ;中央値 itoa $0,%8:len %5,$0:mov %5,%3-%5 for %6=1 to %5:mov $0,"0"+$0:next fileexist %2,$2+$0+".jpg" if %2=0 jumpf itoa $0,%8+1:len %5,$0:mov %5,%3-%5 for %6=1 to %5:mov $0,"0"+$0:next fileexist %2,$2+$0+".jpg" if %2 = 1 mov %7,%8+1:next if %2 = 0 break ~ mov %4,%8-1 ;(修正)±が逆でした if %8==0 break ;(追加)画像が一枚もない場合の永久ループ避け next
mov %0,0 lr_trap *movie_end bgmonce $1 resettimer for %0=1 to 999999 gettimer %2 itoa $0,%8*%2/%1:len %5,$0:mov %6,%3-%5 for %7=1 to %6:mov $0,"0"+$0:next if %2>=%1 break ;←20090323修正 参考.コメント欄 btndef $2+$0+".jpg":blt 0,0,800,600,0,0,800,600 ;※mode800 の場合。デフォルトの解像度 640 なら 640,480 ONS設定とは違いますよん waittimer 2 next
goto *movie_end2 *movie_end if %0>0 break:next *movie_end2 lr_trap off ofscpy:bg black,1:stop saveon return

これで平均測定回数が log2(n)*2 以下に減少するかと思います。n= int(画像枚数/5000 + 1) * 5000試しにと『車輪の国、向日葵の少女』のOPムービー4257枚が26回の fileexist 命令で済みました。

あとTMPGEnc 等では連番画像の出力フレームレートも設定出来るので、PSPではFPSが期待出来ないと割り切って最初から少ない枚数で出力してもいいかもしれませんね。

トラックバックURL

このエントリーのトラックバックURL:
http://hitotsumori.com/x/cgi-bin/mt/mt-tb.cgi/117

コメント

新しい連番画像ムービーのスクリプトの作成お疲れ様です。
画像描写部分の
if %2>=%1 break

for %7=1 to %6:mov $0,"0"+$0:next
より下に書かないとforとnextが正しくなくなり、ムービーを最後まで再生させるとエラーになります。

それと事後で申し訳ないのですが、勝手にひとつもりさんのムービー描写スクリプトを勝手に使わせて頂きました。
もし問題があれば仰って下さい。

ご指摘ありがとうございます。修正致しました。
そして嫌なタイミングの記事で申し訳ありません。コメント欄覗いてちょっと迷ったのですが……
使って貰ってこちらこそありがとうございます。

そして何より移植お疲れ様です。
伊代ルートを堪能させていただきますね。いや他もですが

ひとつもり様

お久しぶりです。
魂響の時はお世話になりました。
それで今回 お願いがあるのですが
今、『脳内彼女』様の『やみツキ!』を
移植しようとしています
それでもしよろしければ、ひとつもり様の
ムービースクリプトを流用してもよろしいでしょうか? いきなりのお願いで申し訳ありません

一応コンバータが出来てもアップはしませんが、筋なのでよろしくおねがいいます。

>fuさん
いえ、こちらこそありがとうございました。

fuさんも移植に挑戦されているのですね。是非とも頑張ってください。
今回のスクリプト流用ですが……あんまり「私の」じゃないという点を除けば全く問題はないかと思います。
継ぎ接ぎですのでー 先人に感謝です。
どなたさまも私に何か言っていただく必要はないのですよ。(嬉しいけれど)

※あと一点修正を入れました。(%8±1が逆だった)
たまに無限ループしてたかも……

ひとつもり様

流用許可ありがとうございます。
もともと、仕事でもons関係でもデバッカー
な私が移植は少し難しいと思いますが
頑張ります。
とりあえず作業経過ですが、タイトルから
最初の冒頭まで実装出来ました。
あとは勉強しながら少しずつ
やってみます。

ひとつもり様


突然 申し訳ありません。
前回のスレで『一応コンバータが出来てもアップはしませんが、筋なのでよろしくおねがいいます。』 と書きましたが、やはり作成したからには公開したいです。
一度、公開しないと言った手前、このような
お願いをするのは変だとは思いますが
よろしくお願いします。
後、立ち絵をlsp命令で出すのと
ld命令で出すのはどちらがメモリーを食うのでしょうか?  出来ればお答え頂けるとうれしいです。

どうぞどうぞ。まあ元々私の許可などいりませんですし

メモリにつきまして、ソース見てませんがほぼ変わらないでしょうとか言っちゃいます。

ひとつもり様

公開許可、ありがとうございます。
とりあえず、作成中の『やみツキ!』の進行具合ですが とりあえず
差分の閲覧が出来ないCGモード(しかも最初から全開orz)
 見せ掛けだけのコンフィングモード
ほしい人が手動で作成して下さい的な回想モード 
などかなり手抜きですがこれらのエキストラ
を実装しました。

後 立ち絵の回答、ありがとうございます。
メモリー使用量が変わらないなら座標指定が出来る。lspの方が良いですね。
かなり勉強になります。

それでは失礼します


SMPEGではなく、SMJPEGをONScripterに組み込んだところ、PSPでの動画再生に成功したので、ご報告を。近々コンバータと一緒に公開して、またしばらくお休みしたいと思います。ではでは。

※SMJPEGとは、MotionJPEGのデコーダです。

>名称未設定さん
おお、ついに待ち望んだ単一動画ファイルの再生機能が!(感嘆が○ヶ月遅くなってしまいましたpart2)
ご無理をなさらずにー (遅いってば

以前に報告したif %2>=%1 breakの位置ですが、
for %7=1 to %6:mov $0,"0"+$0:next

btndef $2+$0+".jpg":blt 0,0,800,600,0,0,800,600
の間でないとbtndefで読み込む画像がないため落ちる場合があります。

おお、何も考えていなかったことがずだ分かりですね!
毎度面目ありません。
そのように修正して使ってみてください。
でもsmjpegがあるのに何故わざわざ……?
あ、水平線は16:9だからなのかっ (追記:と思ったけど違ったみたい?

まさに水平線です。
この不具合は作成した動画のフレームレート以上の表示が出来るPC等では起こらない不具合だったので今まで自分も気がつきませんでした。

まさにでしたか。
丁度見て回ってたら、タイミング的に符号していたのでついつい。
しかし皆さんカスタマイズとか凄いことになってますね。
近頃あまり顔が出せませんが応援してます。

そして自分でも確認出来たので本文修正しました。ありがとうございます。

ひとつもり様

お久しぶりでございます
ひとつもり様が作成された連番」ムービー
ありがたく水平線で使用させていただかせています。

このゲームの動画の完全対応には
smjpegでは不可能な為、本当に助かりました
改めて ありがとうございます

それでこの連番ムービーなのですが
何故かスクリプトにエラーがあると
何故か動画終了後に強制ENDになるようです

一応 報告しておきますね。
それでは失礼します

>fuさん
勝手に話題に出しておきながら、すっかり間が開いてしまいました。ほんと申し訳ありません。
使っていただけるのはこちらこそ大変ありがたいです。

スクリプトのエラーというのは今回ご指摘いただいた箇所とは違うものでしょうか?
(それとも「何故か」というには、変数が本編と突合してしまっていたとか?)
何にしろ解決済みなら良いのですが。
改めまして頑張ってくださいましまし

>ひとつもり様

返信ありがとうございます
連番ムービーのスクリプトを使用の件で
ひとつもり様にお礼を言われるなんて
とんでもありません
こちらが我侭で使わせて頂いているので
お礼を言うのはこちらの方です
本当に助かっています。
公開して頂いてありがとうございます

オープニングタイトルやムービーでは
かなりこのスクリプトが重宝しています
特にオープニングではムービーをそのまま
背景に使用しているため連番でなければ
オープニングの実装は不可でした
改めて ありがとうございます

それと不具合の件なのですが
申し訳ありません。
あの説明では分からないですね
コメントを再度送ったのですが
それが受理されず今に至っています

再度、詳しく書くとスクリプトがこのように
あるとします

0.txt←設定スクリプト
1.txt←ストーリースクリプト
2.txt←ムービースクリプト

1.txtに問題があり、例えばスクリプトエラー
があるとムービー再生後に落ちます
**←こんなものとか
{*←こんなものとかです。

でも不思議なことに、2.txtのムービースクリプトを0.txtに移す場合は問題なく進めます
多分 ONSの不具合でスクリプトエラーがある場合0.txtと1.txt以外 正確なスクリプトとして
認識されず、 2.txtは一度は認識されますが
参照した場合元の場所に戻れないのでは?と思います


これはひとつもり様のスクリプトが悪いわけではありません。 試しに選択肢ルーチンを
3.txtに作成したら 読み込むことはしますが
その後落ちました

これは自分の責任で出ている不具合です
報告までになどとひとつもり様のスクリプトに
問題ありみたいなことを書いてしまい申し訳ありませんでした。


あ、いえいえ、そういうことでしたか
こっちも余計なことを言ってしまいましたね
詳しいエラー仕様については私じゃ何とも言えませんが、了解です。
お気にせずに~

コメントする