トピック
だにえる haru2016nen

高速化アドバイス求む

フォントの描画関数を作ってるんですが、 速度が満足いかないんですよね。 一応、単独で改良を進めましたが、 このくらいが限度な気がしたので、、、 もうこれは頼るしかないかと。 コメントに 現在の描画のシステムを書くので アドバイス下さい。
5そうだね
プレイ済み
返信[1]
親投稿
だにえる haru2016nen
フォントデータの管理は ML$,TEXT$ 2つの文字列を使っています。 ML$にはフォントデータが設定されている 文字列。 TEXT$には(ML$の文字列の順に並んだ) フォントデータ本体。
0そうだね
プレイ済み
返信[2]
親投稿
だにえる haru2016nen
TEXT$の文字列の要素数は [ML$の要素数*フォントの高さ] となっており、1文字毎の文字コードが フォントのY軸一列分のデータ (2進数16桁) を持っています。
0そうだね
プレイ済み
返信[3]
親投稿
だにえる haru2016nen
(X軸一列分って言ったほうが合ってたり…?)
0そうだね
プレイ済み
返信[4]
親投稿
だにえる haru2016nen
現在の描画関数はコチラです。
0そうだね
プレイ済み
返信[5]
親投稿
だにえる haru2016nen
補足1: INSTR%配列は 65536の要素数で、 INSTR%[N]=INSTR(ML$,CHR$(N)) となっています。
0そうだね
プレイ済み
返信[6]
親投稿
だにえる haru2016nen
少し異なったバージョンの関数です。 上の関数との違いで 削除した箇所は*** 変更した箇所は!!! となっています。
0そうだね
プレイ済み
返信[7]
親投稿
だにえる haru2016nen
補足2: CC%配列には 画像データが入っているので 特殊な描画が可能となります。 なんだかんだ便利だと思います。
0そうだね
プレイ済み
返信[8]
親投稿
だにえる haru2016nen
上の2つの関数の通り、、、 IN%の取得には 配列から代入する方法と 直接INSTR関数を使う方法があり、 FV%の取得には MID$であらかじめフォントの高さ分の 文字数を取っておく方法と、 直接TEXT$から持ってくる方法がありますが、 それぞれ速度はあまり変わらないようでした。
0そうだね
プレイ済み
返信[9]
親投稿
だにえる haru2016nen
恐らく、 上手く伝えられてないと思うので とりあえず反応を待ってます。
0そうだね
プレイ済み
返信[10]
親投稿
しんいち stgf1080
フォントデータは文字列変数に入れとかなきゃいけない事情があるのかな? グラフィックの数値配列データとして持っておけるんだったら、例えばフォントデータの0/1を反転させて文字部分が透明になるようにしといて、特殊効果用のグラフィックをGLOADした上に、フォントデータをGLOADすれば、文字部分が透けて特殊効果が文字として浮かび上がるじゃないかなぁと。 それだとW,Hの2つのFORループ不要になって、GLOAD2発で済むから速くなると思う。
5そうだね
プレイ済み
返信[11]
親投稿
ナルミンチョ naru_starfy28
ほしけんさんのプチコン漢字ライブラリのように、bitTable[8*256]を使って 文字コードの数値データをCOPY命令で配列のデータに一気に(8bitずつ)変換すれば速くなると思う。 フォントデータの構造はそれでいいと思う。
4そうだね
プレイ済み
返信[12]
親投稿
だにえる haru2016nen
あーなるほど。 0/1のパターンをあらかじめ 用意してたんですね。
0そうだね
プレイ済み
返信[13]
親投稿
だにえる haru2016nen
しんいちsの方法だと画像のように 背景が塗り潰されてしまうので 実用的ではないかと… 合ってます?
1そうだね
プレイ済み
返信[14]
親投稿
れい rei-nntnd
あたりまえだが、一番深いループが一番効く。 ここではN%のループ。 ここでいちいち1dotずつビットシフトしてマスクして配列に書いてるから遅い。 ビットシフトと条件分岐、成功時には配列アクセス。 これだと確かに遅い。 ループ展開とか、CC%を別変数に保存しとくとかで多少は速くできるが、良くて2倍程度かな。 しんいち氏のいうようにまとめて処理すべき。
4そうだね
プレイ済み
返信[15]
親投稿
しんいち stgf1080
#文字のことしか考えてなかった^^; 全くその通りでございますm__m 背景潰れちゃうねぇ。 ポイントは縦、横用の2つのFORループを速くする、もしくは省略できないかになると思うんだけど。 更に背景とフォントデータでも同じようにして文字部分透明抜きの画像作って、更に重ね合わせるとか(遅いかなぁ)。 ほか思い付いたのは、IF 1なら代入、みたいなところを無条件にかけ算して代入とか(速くならないか)。 #ARYOPは...ダメだよねぇ^^; 最近仕入れた知識だと、FORじゃなくてREPEATにするとか、くらいかなぁ。
1そうだね
プレイ済み
返信[16]
親投稿
SilverBlue Corei72630QM
定かではありませんが、FORよりもREPEATにI=I+1をつけた方が速かったような気がします。
3そうだね
プレイ済み
返信[17]
親投稿
だにえる haru2016nen
BitTableにからデータをCOPYする ようにして、それをARYOPを使って CC%との乗算することで、 背景問題は解決し、 速度も2~3倍早くなりました! 個人的にはこれで満足です。 ありがとうございました。 もう暫く開けておきます。
1そうだね
プレイ済み
返信[18]
親投稿
しんいち stgf1080
お、ARYOPありでしたか。3号だと別売りなんだよね。自分だけで使うぶんにはいいけど、公開考えたとき高度サウンドユニット必要だよ制約付いちゃうのアレかなぁと思ってました。
4そうだね
プレイ済み
返信[19]
親投稿
myu314 myu314
もう終わってるのかな…でも思いついたので書きます:) フォント展開部分とか色々省略して書くけど、 '元のやりかた FOR M=0 TO H-1:FOR N=0 TO W-1 GRP[M,N]=CC[M,N] NEXT:NEXT GLOAD X,Y,W,H,GRP,0,FALSE '上の処理を高速化 VAR I=0,SZ=W*H,GRP[SZ] REPEAT GRP[I]=I:I=I+1 UNTIL SZ<=I GLOAD X,Y,W,H,GRP,CC,FALSE
2そうだね
プレイ済み
返信[20]
親投稿
myu314 myu314
行数オーバーしちゃったので続き。 簡単に解説すると、画像をパレットととして考えればGRPには連番を入れるだけで良い。パレット範囲外の値は透明色になるみたいだから、それを使ってフォント展開すればいい。字の大きさが固定ならGRPに入れる連番は、先に用意しておいてコピーしておけば更に処理は減る。これでARYOP使わなくても倍速にはなると思うよ。
2そうだね
プレイ済み
返信[21]
親投稿
しんいち stgf1080
文字透明抜きの例。 これだとループは文字数分の特殊効果タイルGLOADのだけでいいはず。 ARYOPは要らん。どうかのぉ?
2そうだね
プレイ済み
返信[22]
親投稿
ツララ LongIceSword
すくりゅーさんの質問トピックで気になった「暗黙の変数宣言とVAR命令での宣言はどっちが処理が重いのか?」っていう検証でこんな感じのプログラムを作ってみたんですけど 結果は、確かにVAR命令を使った方が実時間は遅いんですけど、MILLISECでの数値上は経過時間0っていう面白い結果が出ました。 何でも試してみるもんですね。
1そうだね
プレイ済み