« 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 btndef $2+$0+".jpg":blt 0,0,800,600,0,0,800,600 ;※mode800 の場合。デフォルトの解像度 640 なら 640,480 ONS設定とは違いますよん waittimer 2 if %2>=%1 break 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のデコーダです。

コメントする