HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0901
ナナシメモリが限界・・・?6解決


ナナシ

リンク

2009/9/1(Tue) 22:51:46|NO.27492

mesが限界?で質問した者ですが、全く別の問題が発生してしまったので質問させて頂きます。
ttp://hsp.tv/play/pforum.php?mode=all&num=27463

#include "hspdx.as" #include "sysval.as";トラックバー関連 #include "gblconst.as";トラックバー関連 #include "winapi32.as";この中でuser32.dllのDrawTextがfuncされています #include "extrackbar.as";トラックバー関連 #include "d3m.hsp" #include "hgimg3.as" ;http://www.tcn.zaq.ne.jp/akasy005/hsp.htmのfps処理です #uselib "winmm.dll" #func timegettime "timeGetTime" #func timeBeginPeriod "timeBeginPeriod" int #func timeEndPeriod "timeEndPeriod" int timeBeginPeriod 1 onexit goto *finish timegettime:lasttime=stat; ;------------------------------- *set maximg=2847;0.txt〜2847.txtまであり、何番まで読み込むか fontsize=2;フォントサイズ 2の倍数のみ sizex=fontsize*640;AA1枚当たりの横サイズ 実際は639 sizey=fontsize*480;縦サイズ 実際は479 scon=0;再生/一時停止の切替変数 con=0;再生/停止の切替変数 screen 0,4000,3000,1,0,0;画面初期化(4000x3000) pos 0,0 : button gosub "LOAD",*load;LOADを押すとAAをロードします objmode 2,0 : font "Webdings" : objsize 50;再生ボタンのフォント pos 100,0 : button gosub "4",*start : objenable 1,0 ;再生 font "wingdings";停止ボタンのフォント pos 160,0 : button gosub "n",*stopa : objenable 2,0;停止 trackhwnd=Createtrack(0,220,3,600,20) : trackrng trackhwnd,0,1000,0 ;トラックバー作成の関数です *main;メインループ if con=1 : gosub *draw :koma+ ;もしcon=1(再生状態)ならばdrawへ飛び、コマを一つ進める gosub *waittime goto *main *load;画像をロード bufferへ25枚ずつ書き込みます 2849枚やると10分ほどかかります objenable 0,0;LOADボタンを使用不可にします notesel p1;p1に確保 repeat maximg/25+1;bufferを確保します buffer cnt+5,sizex*25,sizey,1;念のためcnt+5 font "MS ゴシック",fontsize;予めセット await 0 loop repeat maximg+1;1つのbufferに25枚ずつ描画します noteload str(cnt)+".txt";0.txtから連番でtxtファイルがあるため gsel cnt/25+5;25枚描画する毎に次のbufferへと移ります pos (cnt\25)*sizex,0;これは要るかわかりません rect = (cnt\25)*sizex,0,(cnt\25)*sizex+sizex,sizey;1枚描画する毎に右へずれます DrawText hdc , p1, -1, varptr(rect), 0;APIで描画 gsel 0 title str(cnt) await 0 loop gsel 0 objenable 1,1 : objenable 2,1;再生、停止ボタンを有効に font "MS ゴシック",12,0 return *start if scon=0 :scon=1 : con=1 : objprm 1,";" : else : con=0 : scon=0: objprm 1,"4" ;一時停止状態(scon=0)または停止状態なら再生状態(scon=1,con=1)に、 ;再生状態(scon=1)なら一時停止状態に(scon=1) ;"4"は一時停止のフォントです return *stopa con=0:scon=0:objprm 1,"4";停止状態に koma=0;コマ数をリセット settrackpos trackhwnd,0;トラックバーを左端へ return *draw settrackpos trackhwnd,(koma*1000/maximg);トラックバーをコマ数に合わせて移動 redraw 0;描画停止 palcolor 255;白 boxf;全消し palcolor 0;黒 pos 0,30 gcopy koma/25+5,(koma\25)*sizex,0,sizex,sizey;bufferからコピーします fps=d3getfps() ;fps取得 pos 820,0 : mes "fps:"+str(fps) pos 860,0 : mes str(koma+1)+"/"+str(maximg+1) ;各種状態を描画(fps、コマ数、再生時間) redraw 1;描画 if koma>=maximg : goto *stopa;再生時間を越えたら停止します return ;fps処理用 *waittime repeat timegettime if stat-lasttime>32:lasttime=stat:break if stat-lasttime<=1:await 0:timegettime;余裕があればウェイトを挟んでCPU利用率を下げる loop timegettime:lasttime=stat;ウェイトの為に今の時間計測 return ;--------------------------------------------- *finish timeEndPeriod 1:end
前スレに書きましたが、文字で描いた絵(以下AA)を連続表示して動画のようにするスクリプトです。
mesはDrawTextに置換えることで解決しまして、無事に再生できましたが、
フォントサイズを大きくすると再生中に突然真っ白になる問題が発生しました。
恐らくメモリ不足か何かでbufferにDrawTextできていないのだと思います。
(メモリは3GB積んでるのでHSPの制限?)
フォントサイズ2で成功したと思い込んでいましたが、
実際は1000枚ほど再生した後真っ白になりました。
フォントサイズ6にすると100枚ほどでおわってしまいます。
1つのbufferに25枚描画するなど試してみましたが、特に変化は見られませんでした。

HSPに何らかの制限があるとすれば私にはお手上げです。
メモリの問題となるとこの方法では無理ですよね・・・他の方法を示唆して頂くだけでも構いませんので、
どなたかご回答宜しくお願いします。



この記事に返信する


shinkun

リンク

2009/9/2(Wed) 07:05:24|NO.27494

メモリが不足しているのは確かなようですね。
HSP の画面では 1px に付き 3 バイトのメモリを使用するはずなので、ナナシさんの試された各フォントサイズで全 buffer に費やすメモリサイズを計算すると、次のようになります。

fontsize = 1[px] の時
640[文字] x 1[px] x 480[文字] x 1[px] x 3[B] x 2848[枚] ≒ 2.44[GB]

fontsize = 2[px] の時
640[文字] x 2[px] x 480[文字] x 2[px] x 3[B] x 2848[枚] ≒ 9.78[GB]
利用可能枚数: 2848 x (3.0 / 9.78) ≒ 854[枚]

fontsize = 6[px] の時
640[文字] x 6[px] x 480[文字] x 6[px] x 3[B] x 2848[枚] ≒ 88.0[GB]
利用可能枚数: 2848 x (3.0 / 88.0) ≒ 97[枚]

と言う事で、ナナシさんの報告とほぼ一致しています。
ただ、真っ白になる、という現象については何か他の要因もあるように思います。

3 ギガものメモリを積んでいる方って多くはないと思うので、最初に全部バッファリングする方式は止めて、再生しながら部分的にバッファリングしていくか、あるいは 1 枚ずつバッファリングする方式にした方が良いのではないでしょうか?



ナナシ

リンク

2009/9/2(Wed) 18:14:13|NO.27514

ご回答有難う御座います。
なるほど、やはりメモリですか。
再生しながらバッファリングするにしても、1枚ずつバッファリングするにしても高速で再生するのは難しそうですね・・・
バッファリングは1枚に1秒ほどかかりますので。
ところで再生と平行して読込をする、ということは可能なのでしょうか?AAを全て画像ファイルにしてから
picloadを使うと、かなり高速に再生できました。しかし安定しないので読込ながら再生できれば
うまくいきそうなのですが。



shinkun

リンク

2009/9/3(Thu) 06:59:02|NO.27519

> バッファリングは1枚に1秒ほどかかりますので。

一番のネックはテキストの描画にあるみたいですね。テキストの内容によっても速度に違いがあるみたいです。全角スペースを含まないテキストならば 150 〜 200 [ms] ですが、全角スペースも含んだテキストだと 1000 [ms] になったり。何故そんな違いが生じるのか理由が分かりませんが。


> ところで再生と平行して読込をする、ということは可能なのでしょうか?

それをするにはマルチスレッドを利用する事になると思うのですが、残念ながら現行の HSP ではマルチスレッドは対応していないみたいです。しかも、マルチスレッドを利用したからといって劇的に速くなるとは限らないというのが痛い所です。
今回に限って言えば再生に 99% の時間が掛かっているので、マルチスレッドを利用しても速度に改善は見られないでしょうね。


> AAを全て画像ファイルにしてから picloadを使うと、かなり高速に再生できました。

今までテキストファイルを読み込んで動画再生する事に意義があるのかと思って候補から外していましたが、動画再生出来れば読み込みのファイル形式は問わないのでしょうか?
それでしたら、はじめから動画を用意しておけば速度改善には期待できると思います。



ナナシ

リンク

2009/9/3(Thu) 17:11:47|NO.27522

なるほど・・・全角スペースは重いのですか。
確かに全角スペース使ってまして、白い画像ほど描画が遅くなります。
できればテキストを動画にしたかったのですが、無理でしたら再生だけでも構いません。
しかし動画ファイルにするとかなり重くなってしまいます。
2bitのBMPならば1.4MB程度(3000枚でも4GBほど)で済むのですが2bitの動画にする
というソフトが見つからないので、未圧縮だと100GBを超えてしまいました。



check

リンク

2009/9/3(Thu) 20:31:26|NO.27525

じゃああきらめるんだな。(圧縮しろよ・・・)
つーか、再生しながら作成していく方式じゃダメなのか?



ナナシ

リンク

2009/9/3(Thu) 21:27:53|NO.27526

圧縮するとグレーの部分が出来てしまうので、これは避けたいです。
元々白黒しかないのでモノクロ圧縮できるコーデックがあればいいのですが。
前のレスに書きましたが再生しながら作成、というのは直接描画するのと変わらないと思います。
そうなると1秒に1枚ほどしか描画できないため、非常に低速な動画しか実現できませんでした。
・・・HSP外の問題となってきてしまったので、他の方法を模索しようと思います。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.