●バイナリサーチによる連番ムービー準備時間の短縮
伊代かわいいよ伊代移植パッチとは別口で(また一部の人しか判らないことを)
先日 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が期待出来ないと割り切って最初から少ない枚数で出力してもいいかもしれませんね。
コメント
新しい連番画像ムービーのスクリプトの作成お疲れ様です。
画像描写部分の
if %2>=%1 break
は
for %7=1 to %6:mov $0,"0"+$0:next
より下に書かないとforとnextが正しくなくなり、ムービーを最後まで再生させるとエラーになります。
それと事後で申し訳ないのですが、勝手にひとつもりさんのムービー描写スクリプトを勝手に使わせて頂きました。
もし問題があれば仰って下さい。
Posted by: Herbas | 2008年09月07日 13:35
ご指摘ありがとうございます。修正致しました。
そして嫌なタイミングの記事で申し訳ありません。コメント欄覗いてちょっと迷ったのですが……
使って貰ってこちらこそありがとうございます。
そして何より移植お疲れ様です。
伊代ルートを堪能させていただきますね。いや他もですが
Posted by: ひとつもり | 2008年09月07日 16:59
ひとつもり様
お久しぶりです。
魂響の時はお世話になりました。
それで今回 お願いがあるのですが
今、『脳内彼女』様の『やみツキ!』を
移植しようとしています
それでもしよろしければ、ひとつもり様の
ムービースクリプトを流用してもよろしいでしょうか? いきなりのお願いで申し訳ありません
一応コンバータが出来てもアップはしませんが、筋なのでよろしくおねがいいます。
Posted by: fu | 2008年09月08日 16:31
>fuさん
いえ、こちらこそありがとうございました。
fuさんも移植に挑戦されているのですね。是非とも頑張ってください。
今回のスクリプト流用ですが……あんまり「私の」じゃないという点を除けば全く問題はないかと思います。
継ぎ接ぎですのでー 先人に感謝です。
どなたさまも私に何か言っていただく必要はないのですよ。(嬉しいけれど)
※あと一点修正を入れました。(%8±1が逆だった)
たまに無限ループしてたかも……
Posted by: ひとつもり | 2008年09月08日 20:34
ひとつもり様
流用許可ありがとうございます。
もともと、仕事でもons関係でもデバッカー
な私が移植は少し難しいと思いますが
頑張ります。
とりあえず作業経過ですが、タイトルから
最初の冒頭まで実装出来ました。
あとは勉強しながら少しずつ
やってみます。
Posted by: fu | 2008年09月08日 21:20
ひとつもり様
突然 申し訳ありません。
前回のスレで『一応コンバータが出来てもアップはしませんが、筋なのでよろしくおねがいいます。』 と書きましたが、やはり作成したからには公開したいです。
一度、公開しないと言った手前、このような
お願いをするのは変だとは思いますが
よろしくお願いします。
後、立ち絵をlsp命令で出すのと
ld命令で出すのはどちらがメモリーを食うのでしょうか? 出来ればお答え頂けるとうれしいです。
Posted by: fu | 2008年09月12日 20:58
どうぞどうぞ。まあ元々私の許可などいりませんですし
メモリにつきまして、ソース見てませんがほぼ変わらないでしょうとか言っちゃいます。
Posted by: ひとつもり | 2008年09月14日 23:08
ひとつもり様
公開許可、ありがとうございます。
とりあえず、作成中の『やみツキ!』の進行具合ですが とりあえず
差分の閲覧が出来ないCGモード(しかも最初から全開orz)
見せ掛けだけのコンフィングモード
ほしい人が手動で作成して下さい的な回想モード
などかなり手抜きですがこれらのエキストラ
を実装しました。
後 立ち絵の回答、ありがとうございます。
メモリー使用量が変わらないなら座標指定が出来る。lspの方が良いですね。
かなり勉強になります。
それでは失礼します
Posted by: fu | 2008年09月16日 02:48
SMPEGではなく、SMJPEGをONScripterに組み込んだところ、PSPでの動画再生に成功したので、ご報告を。近々コンバータと一緒に公開して、またしばらくお休みしたいと思います。ではでは。
※SMJPEGとは、MotionJPEGのデコーダです。
Posted by: 名称未設定 | 2008年09月25日 01:41