248:Re^4: 私のやってる圧縮形式について…2000/07/06 (木) 04:59 |
コメント数: 0件 |
剣聖炎羅 |
|
> 別の圧縮と組み合わせなければなりませんしねぇ;_;
んー、Cマガジンを見る限り、jpegをライバルにしなければ(笑) その必要はないんじゃないでしょうか?
ウェーブレット変換ルーチン中間報告: k6-2 300MHzで、640*480*24bppの画像の変換に 440ミリ秒になりました。 AGIなど微塵も考えてないので、普通のIntel MMXで 何倍の時間がかかるか楽しみです(泣) MMX使ってないので、まだまだですね… 今度C(ほとんどアセンブラ)ソース公開します。 |
新規投稿|この投稿にリプライ|投稿者削除
|
247:Re: 変形離散コサイン変換のプログラム2000/07/06 (木) 00:02 |
コメント数: 0件 |
剣聖炎羅 |
|
> MPEG圧縮などに使われている、 > 変形離散コサイン変換をするプログラムをC言語で作ろうと思っています。 (中略) > MDCTの式などはわかるのですが、
私はDCTの実装方法はソフトバンクから出版されている 「JPEG 概念からC++による実装まで(ケイワーク著)」 で勉強しました。 MDCTでやってることは基本的にはDCTと同じなんでしょうか? であっれば、上記の本の内容を応用すればOKです。
#私はFFTファミリは嫌いなんですが…(笑) |
新規投稿|この投稿にリプライ|投稿者削除
|
245:変形離散コサイン変換のプログラム2000/07/05 (水) 16:01 |
コメント数: 2件 |
sukashi |
|
はじめまして。 ちょっとお尋ねしたいことがあるのですが、 MPEG圧縮などに使われている、 変形離散コサイン変換をするプログラムをC言語で作ろうと思っています。 学校の研究に必要なのですが。 MDCTの式などはわかるのですが、 プログラムを組むとなると全くわかりません。 場違いな質問かもしれませんが、 アドバイスがあったらよろしくお願いします。
|
新規投稿|この投稿にリプライ|投稿者削除
|
244:Re^3: 私のやってる圧縮形式について…2000/07/05 (水) 15:54 |
コメント数: 1件 |
さ〜 |
http://D5.w3.to/
|
> > 一つの画像にパレットを複数用意して(256とか)、 > > 展開時には領域に応じてパレットを選択するとか。 > それはマトリクス量子化とかテクスチャ量子化とか言う方法ですね。 > 先月のCマガジンにも載ってますね。 > 再現性は良いと思いますが、かなり時間のかかりそうな圧縮です。
あ、ほんとですね。買ってるのに知らなかった・・・。 確かに一般的に圧縮するのは大変ですが、 人間が領域を指定すればそんなに時間はかか・・・るか。逆に。(笑) 別の圧縮と組み合わせなければなりませんしねぇ;_; |
新規投稿|この投稿にリプライ|投稿者削除
|
243:Re^2: 私のやってる圧縮形式について…2000/07/05 (水) 00:18 |
コメント数: 2件 |
剣聖炎羅 |
|
> アイデア的には昔の水平割込(用語忘れた・・・) > でパレットを変更するってやつです。 > 一つの画像にパレットを複数用意して(256とか)、 > 展開時には領域に応じてパレットを選択するとか。 > 局所的に256でも十分な表現力はあります(予想)。
それはマトリクス量子化とかテクスチャ量子化とか言う方法ですね。 先月のCマガジンにも載ってますね。 再現性は良いと思いますが、かなり時間のかかりそうな圧縮です。 でも展開時間が大事なのであれば、やはりこっちのほうがいいですね。 小さい升目であれば256でも16でも再現性は変わらないようです。 大きい升目を使うと256色でしょうね。 |
新規投稿|この投稿にリプライ|投稿者削除
|
242:Re^8: あれ?2000/07/02 (日) 22:26 |
コメント数: 0件 |
さ〜 |
http://D5.w3.to/
|
連書きすいません・・・;_;
> > a=b%N; > > の話です。 > > a=b -N*((b*(65536/N))>>16); > > というのはどうでしょう?
> このテクは知らなかったので、「う〜ん、納得」 > といきたかったんですがどうも疑問が。 > たとえば、N=3,b=9のとき。 > 65536/N=21845.333…→21845(=Tmp1)で、 > (b*Tmp1)>>16=2(=Tmp2)なので、 > b-N*Tmp2=3となるような…。 > b%N=0なんで食い違うような気がしちゃうんです。 > どの辺で解釈し間違えてるのかな〜、私。 > #bやNに制限があるのかなぁ…
やぁ、ほんとですね。 僕は使ってないので知りませんでした(おぃ・・・
b=b-[b/N]の計算を b=b-N*[b*(1/N)]として計算するのですから、 誤差が大きくなるのは避けられないでしょう。 ですが、N=3,b=9の場合は切り捨てが問題ですから 回避は簡単です。 (65536/N)を(65536/N+1)にしましょう。 この場合には切り上げの問題が発生しますが、 bとNの範囲が決まれば、問題があるかどうかを 検証することは可能です。 b>65535のときに問題が発生します(笑)
というか、へるみさんのように 32bitにして計算すれば b<(1<<32)の範囲で・・・って、 それ以上の値は表現できないよ・・・
|
新規投稿|この投稿にリプライ|投稿者削除
|
241:Re^3: 全くの余談(^^;2000/07/02 (日) 22:24 |
コメント数: 0件 |
さ〜 |
http://D5.w3.to/
|
> 書き方が悪かったですね。申し訳無いです。 > 「プレイ時にCD-ROMとドライブが必要になる」っていうのが面倒だなと。 > WAV再生可能ならすべてHDDに入れてしまってそのままどこでも遊べて > 便利だなと。当然、HDD食いますが。 > いまどきはCD-ROMドライブが内蔵されてないなんてマシンは > ノートPCでもあんまりないのかな?
いやいや、そんなことはありませんよ。 現に僕のマシンはついてません(笑) で、どうするかというと、仮想CD-ROMソフトで CD-DAをwave/mp3に変換します(笑) そのための仮想CD-ROMですが、某携速CDでは、 CD-ROMドライブが内蔵されていないとインストール できないという・・・どないせっちゅーんや・・・ 今はどうだか知りませんけど(^^;
>#ウチのサークルの音楽屋さんは今ごろ今日売るアレンジCDの >#製作をしている…ハズです←忙しくて手伝っていないのでよくしらない(^^;
夜の2時半にマスターアップですか・・・。 早いなぁ〜(爆) ぎゃるぱにXは、AM10:00、AM06:30、AM05:00ってな感じです。 ・・・AM10:00ってなんなんでしょうーねー(笑)
|
新規投稿|この投稿にリプライ|投稿者削除
|
240:Re: 私のやってる圧縮形式について…2000/07/02 (日) 22:21 |
コメント数: 3件 |
さ〜 |
http://D5.w3.to/
|
> > #多重パレットとかいいかなぁと思ったり。 > > #単に複数の画像をつなぐだけだけど(笑) > ??どのようなものなのでしょうか(わくわく)
アイデア的には昔の水平割込(用語忘れた・・・) でパレットを変更するってやつです。 一つの画像にパレットを複数用意して(256とか)、 展開時には領域に応じてパレットを選択するとか。 局所的に256でも十分な表現力はあります(予想)。 作ったら公開しません?(笑)でも、どっかにありそうな・・・
|
新規投稿|この投稿にリプライ|投稿者削除
|
239:Re^2: 全くの余談(^^;2000/07/02 (日) 16:34 |
コメント数: 1件 |
小次郎 |
|
> ありゃ?外付けではダメなんでしたっけ… > てっきりオプションでコードが着いてると思ったんですけど
書き方が悪かったですね。申し訳無いです。 「プレイ時にCD-ROMとドライブが必要になる」っていうのが面倒だなと。 WAV再生可能ならすべてHDDに入れてしまってそのままどこでも遊べて 便利だなと。当然、HDD食いますが。 いまどきはCD-ROMドライブが内蔵されてないなんてマシンは ノートPCでもあんまりないのかな? #最近のメーカマシン情報には疎い(^^;
> やはりDirectXなしでコーディングするメリットは大きいと思います(^^ > すごいなぁ…
すごいわけではないと思いますよ(^^; DirectXに対応していないハードウエアを持っている方には利点に なるかもしれませんが、対応しているハードウエアを持っている方には CPU占有率の向上というデメリットが痛いわけですから。 DirectX使用版と無使用版の2ルーチンを用意してユーザに選択できるように すれば、いいんでしょうけど…メンドくさかったのでやりませんでした(笑)
あと、CD-DAにしなかったのにはHDDへのファイルコピーなしでCD-ROMから 起動するようにするときに、CD-ROMの中のデータを読もうとするとBGMを 止めなくてはならないのが…って思ったのもありました。 実は結局のところ、HDDにすべてのファイルをコピーしないと遊べないもの しか作ってませんが(ヒドイなぁ(笑)) |
新規投稿|この投稿にリプライ|投稿者削除
|
238:Re^7: あれ?2000/07/02 (日) 16:13 |
コメント数: 1件 |
小次郎 |
|
> a=b%N; > の話です。 > > a=b -N*((b*(65536/N))>>16); > というのはどうでしょう?
このテクは知らなかったので、「う〜ん、納得」 といきたかったんですがどうも疑問が。 たとえば、N=3,b=9のとき。 65536/N=21845.333…→21845(=Tmp1)で、 (b*Tmp1)>>16=2(=Tmp2)なので、 b-N*Tmp2=3となるような…。 b%N=0なんで食い違うような気がしちゃうんです。 どの辺で解釈し間違えてるのかな〜、私。 #bやNに制限があるのかなぁ… |
新規投稿|この投稿にリプライ|投稿者削除
|
237:Re^2: 私のやってる圧縮形式について…2000/07/02 (日) 15:33 |
コメント数: 0件 |
剣聖炎羅 |
|
> 一応、かけるエフェクトにもよるんではないでしょうか。 > 激しい横スクロールとかなどの激しい画面変化の場合は低フレームレートだと > 気になる可能性が高くなるかなと。
ADVとRPGにしか使えないでしょうね、DIBに完全展開してから エフェクトを掛けるので、展開時間が重要なことにはかわりありませんね…(^^;;
> #10 Frame Per Minuteとか極端になると話は別…って当たり前か… 640*480*32bppで現在1FPSです…MMX使おうかな…… |
新規投稿|この投稿にリプライ|投稿者削除
|
236:Re: 全くの余談(^^;2000/07/02 (日) 15:31 |
コメント数: 2件 |
剣聖炎羅 |
|
> ○CD-ROMドライブ付でないマシン(ノートPCなど)で困る > (外付けCD-ROMドライブなどやLAN経由などでインストールして、 > 遊ぶような状況だと曲が無くなっていまい寂しいという意味で)
ありゃ?外付けではダメなんでしたっけ… てっきりオプションでコードが着いてると思ったんですけど > と理由をつけてBGMをWAV再生にしました。強引に。 > #単にトラブル対応がいやだっただけなんですが。
やはりそういう問題がありましたか… > ですが、普通に実装するとWindowのタイトルをドラックしたときに曲が > 止まってしまうので、別スレッドで再生するように作る羽目に…。 > さらにDirectXを使用しない方針でしたので、BGMとSEのミキシングルーチンまで > 自ら書く羽目に…。
やはりDirectXなしでコーディングするメリットは大きいと思います(^^ すごいなぁ…
> 音楽屋さんってCD-DAにしたがる傾向があるみたいですね。 > って、単にウチの音楽屋さんもそうだっただけなんですが。
イヤ別にwavでも良かったんですけど、midi再生からいっきに cddaに再生方針が変わってしまったので…
|
新規投稿|この投稿にリプライ|投稿者削除
|
235:Re: 私のやってる圧縮形式について…2000/07/02 (日) 02:33 |
コメント数: 1件 |
小次郎 |
|
> > いちおうFPSですが、シューティングみたいなのでは > > 30FPSが最低限必要、らしいです。RPGは少し甘く20FPS > > ぐらいなのかな?ADVでエフェクトをかける場合なら、 > > 10FPSもあればなんとか実用できそうです。 > > なるほど。その程度で良いんですか…
一応、かけるエフェクトにもよるんではないでしょうか。 激しい横スクロールとかなどの激しい画面変化の場合は低フレームレートだと 気になる可能性が高くなるかなと。 ただ、FPSはシューティングなどだとゲーム性に直にかかわってきますので、 かなり重要です。が、ADVなどの非アクション系の場合では「気になるだけ」で ゲーム自体の難易度などにはそんなに直結してないですので、 「どの辺りで妥協するか」だけだと思います。 #10 Frame Per Minuteとか極端になると話は別…って当たり前か…
> ただ、次のjpegでこれがインプリメントされると言う噂があります。
JPEG2000で搭載されるとか読んだような… ロスレス圧縮でJPEG-LSって名前だったような… Cマガジン辺りで読んだような… …「ような」ばっかりですみません(^^; |
新規投稿|この投稿にリプライ|投稿者削除
|
234:全くの余談(^^;2000/07/02 (日) 02:28 |
コメント数: 3件 |
小次郎 |
|
> そりゃいくら何でも無謀ですよね(^^;;; > 一枚絵は容量を食うので、できるだけ空き資源を多くするために > 開発してます。 > #じつは私は音楽屋でして、CD−DA容量をCGに食われるのが > イヤなんです(爆)
CD-DAだと…
○CD-ROMドライブ付でないマシン(ノートPCなど)で困る (外付けCD-ROMドライブなどやLAN経由などでインストールして、 遊ぶような状況だと曲が無くなっていまい寂しいという意味で)
○なつかしの(笑)NEC98x1シリーズで音源ボードを刺し、 内部音源をOFFにするとCD-DA音声がLine Outに来なくなる (ドライブのイアホン端子からは聞ける)
○ドライブによって機能差があり、シークなどで問題が発生するらしい (ゲームのシューティングやネット上の情報より)
と理由をつけてBGMをWAV再生にしました。強引に。 #単にトラブル対応がいやだっただけなんですが。
ですが、普通に実装するとWindowのタイトルをドラックしたときに曲が 止まってしまうので、別スレッドで再生するように作る羽目に…。 さらにDirectXを使用しない方針でしたので、BGMとSEのミキシングルーチンまで 自ら書く羽目に…。 楽したんだか、苦労したんだか判らない状態(笑)
まー、そういうこともあるってことで参考に…ならないか…。
音楽屋さんってCD-DAにしたがる傾向があるみたいですね。 って、単にウチの音楽屋さんもそうだっただけなんですが。
#ウチのサークルの音楽屋さんは今ごろ今日売るアレンジCDの #製作をしている…ハズです←忙しくて手伝っていないのでよくしらない(^^;
…あ、せっかちな話で無いですね(^^; |
新規投稿|この投稿にリプライ|投稿者削除
|
233:ウェーブレット変換の演算2000/07/02 (日) 01:33 |
コメント数: 0件 |
剣聖炎羅 |
|
自己レスです
> じつは、あの方法が一番良いアルゴリズムらしいんです。 わざわざ転置行列を作るのがあほらしいし、メモリの無駄遣いなので 演算の際に、 1.データを縦に書き出す 2.データを縦に読む という2つの方法のを考えたのですが、 つまり、1は演算後にpDestにxSize(配列Destの横サイズ)を足して 書き出していき、 2はpSrcにxSizeを足しながら8個のデータを読んで演算し、 最後に元のpSrcにリセットした後pSrcに1を足して(横に1つ移動させる) また演算ループの先頭に戻る方法なのですが…
効果あると思われますか…? 2は、キャッシュの関係から遅いような気がします いちいち転置行列を作るよりは良いような気もするんですが… |
新規投稿|この投稿にリプライ|投稿者削除
|
232:VC++の自動最適化2000/07/02 (日) 01:21 |
コメント数: 0件 |
剣聖炎羅 |
|
> VC++では割算はこの最適化が自動で行なわれます。
StandardEditionではこんな最適化をやってくれないみたいです… |
新規投稿|この投稿にリプライ|投稿者削除
|
231:Re^5: FPS2000/07/01 (土) 01:22 |
コメント数: 1件 |
剣聖炎羅 |
|
こんばんはー
> でもだとすると、余計アルゴリズムを練ってからでないと最適化するのは > 辛いのではないでしょうか。
じつは、あの方法が一番良いアルゴリズムらしいんです。 どっかの教授が考えたらしいんですが、 Cレベルでは変えようがないみたいです。
私のコードでは、数列の中身だけはimulする時に直接指定してます。 中身を14bit左シフトしたものでかけ算して、足していき、 四捨五入のために1024*8を足して 最後に14bit右シフトしてます。
ただ、やっぱりあの方法では2次元のデータを扱うのに時間がかかりすぎるので、 2次元のフィルタ(数列)を使った変換方法も考えてます。 |
新規投稿|この投稿にリプライ|投稿者削除
|
230:私のやってる圧縮形式について…2000/07/01 (土) 01:16 |
コメント数: 10件 |
剣聖炎羅 |
|
こんばんはー 内容が違うのでsubjectを変えました。
> >用途としては、ADV・RPGの背景などの一枚絵という > >あまり速度の要求されない、比較的サイズの大きい絵です。 > リアルタイムエフェクトに使うのかと思ってました(^^; そりゃいくら何でも無謀ですよね(^^;;; 一枚絵は容量を食うので、できるだけ空き資源を多くするために 開発してます。 #じつは私は音楽屋でして、CD−DA容量をCGに食われるのが イヤなんです(爆) > いちおうFPSですが、シューティングみたいなのでは > 30FPSが最低限必要、らしいです。RPGは少し甘く20FPS > ぐらいなのかな?ADVでエフェクトをかける場合なら、 > 10FPSもあればなんとか実用できそうです。
なるほど。その程度で良いんですか… > どこにメリットを求めるか、ですね。 > 差分を圧縮でもっていれば動画として > 使うことができそうな気が少ししますが(^^; > それはそれでどっかでやられている気も。MNGあたり?
ウェーブレット変換もDCTと同じ直交変換の仲間です。 単にDCTの後がまに過ぎないので、差分を持たせて モーションjpegみたいなことを真似したり(しかも画質を上げて) いろんな事に応用できます 多分…(^^; つまり、今現在DCTなどのフーリエ変換ファミリーに基盤を 置いている技術をそのまま流用することが可能です。
> やっぱりjpegと競合するのがキツいですね。 > 圧縮率+劣化の具合はどうですか?
jpegより、劣化は少ないか、同じです。悪くなることは基本的にありません。 #展開係数に何を用いるかによりますが… 圧縮率は、後々の量子化+符号化で決まっちゃうので、ウェーブレットに したからどーだ!というものではないです。 ただ、DCTより、フィルタバンクとしての周波数特性が 優れているので、ブロックひずみやモスキートノイズを 押さえることが可能です。
ただ、次のjpegでこれがインプリメントされると言う噂があります。
> #多重パレットとかいいかなぁと思ったり。 > #単に複数の画像をつなぐだけだけど(笑) ??どのようなものなのでしょうか(わくわく) |
新規投稿|この投稿にリプライ|投稿者削除
|
229:Re^8: あれ?2000/07/01 (土) 01:13 |
コメント数: 0件 |
さ〜 |
http://D5.w3.to/
|
> 私は結構使ってます(^^) > (意味ないけど)2進→10進変換で使えます。 > それから、mulを使ってedx:eaxの後edxをシフトすれば > オーバーフローを気にせずに使えます。 > VC++では割算はこの最適化が自動で行なわれます。
うわ、恥ずかし>オレ 一般的なテクニックなのですね。 といいつつ、今、ふと「メガデモを作ろう」に 割り算のテクニックとして紹介されていたことを 思い出した・・・
そうか、そういうことだったのですね。 いけてねぇ〜>オレ |
新規投稿|この投稿にリプライ|投稿者削除
|
228:Re^4: FPS2000/06/30 (金) 21:09 |
コメント数: 2件 |
へるみ |
|
>じつは私はゲームプログラマ屋ではなく、ゲームに使える圧縮画像ファイルを >作ろうとしてるだけなので… >しかし実用的ではないとすると…うーむ。 あ、なるほどjpegに変わるフォーマットをということですね。 でもだとすると、余計アルゴリズムを練ってからでないと最適化するのは 辛いのではないでしょうか。
|
新規投稿|この投稿にリプライ|投稿者削除
|
227:Re^7: あれ?2000/06/30 (金) 21:07 |
コメント数: 2件 |
へるみ |
|
>a=b -N*((b*(65536/N))>>16); >というのはどうでしょう? 私は結構使ってます(^^) (意味ないけど)2進→10進変換で使えます。 それから、mulを使ってedx:eaxの後edxをシフトすれば オーバーフローを気にせずに使えます。 VC++では割算はこの最適化が自動で行なわれます。
|
新規投稿|この投稿にリプライ|投稿者削除
|
226:Re^6: あれ?2000/06/30 (金) 16:06 |
コメント数: 5件 |
さ〜 |
http://D5.w3.to/
|
どもです。
自由なサイズのテクスチャでタイル張りできないかなぁ〜と 考えていたところ、ふと思いつきました。
あ、なんの話か書かないとわかりませんね(^^; a=b%N; の話です。
a=b -N*((b*(65536/N))>>16); というのはどうでしょう? 65536/Nは定数なので計算レスです。 で、N*... はオーバーフローの大きさに よりますが、1or2ならがんばってコーディングすれば 乗算なしで計算できそうな気がします。 ま、乗算2回でも % の41クロックよりは安いですね(^^; 理論としては、 b:N=x:65536 です。xに精度はいりません。ようはNより どれだけ大きいかを大雑把に知りたいだけなので。 もし気になるようでしたら 16bitを24bitぐらいにすれば 大丈夫でしょう。 |
新規投稿|この投稿にリプライ|投稿者削除
|
225:Re^4: FPS2000/06/30 (金) 11:27 |
コメント数: 11件 |
さ〜 |
http://D5.w3.to/
|
>こういうのはさ〜さんがお詳しそうですね。 ゲームを作り始めて早8ヶ月のさ〜です(笑) 全然詳しくないです(^^;
>用途としては、ADV・RPGの背景などの一枚絵という >あまり速度の要求されない、比較的サイズの大きい絵です。 リアルタイムエフェクトに使うのかと思ってました(^^; このような用途であれば特にFPSは関係ないですね 速ければ速いほどよい、という感じで。
いちおうFPSですが、シューティングみたいなのでは 30FPSが最低限必要、らしいです。RPGは少し甘く20FPS ぐらいなのかな?ADVでエフェクトをかける場合なら、 10FPSもあればなんとか実用できそうです。
>じつは私はゲームプログラマ屋ではなく、ゲームに使える圧縮画像ファイルを >作ろうとしてるだけなので… どこにメリットを求めるか、ですね。 差分を圧縮でもっていれば動画として 使うことができそうな気が少ししますが(^^; それはそれでどっかでやられている気も。MNGあたり?
やっぱりjpegと競合するのがキツいですね。 圧縮率+劣化の具合はどうですか?
#多重パレットとかいいかなぁと思ったり。 #単に複数の画像をつなぐだけだけど(笑)
|
新規投稿|この投稿にリプライ|投稿者削除
|
224:Re^3: FPS2000/06/29 (木) 15:05 |
コメント数: 15件 |
剣聖炎羅 |
|
> 私はまともなゲームを作ったことが無いので感じがつかめないのですが > 背景の圧縮ルーチンに気合を入れるよりは別のところに力を入れたほうが > 良いような気が(^^; じつは私はゲームプログラマ屋ではなく、ゲームに使える圧縮画像ファイルを 作ろうとしてるだけなので… しかし実用的ではないとすると…うーむ。
> 圧縮アルゴリズムについても表示は32bppとしても使用色の標本をうまく採って > (paletteみたいに)データ量を減らしていくという簡単な方法は駄目なんでしょうか。 基本的には高周波成分をカットするというJPEGの 考え方と同じなので、標本については考えていませんが、 (別の圧縮の考え方なので) その方がより実用的かもしれないですね…
|
新規投稿|この投稿にリプライ|投稿者削除
|
223:Re^2: FPS2000/06/29 (木) 11:27 |
コメント数: 16件 |
へるみ |
|
こういうのはさ〜さんがお詳しそうですね。
私はまともなゲームを作ったことが無いので感じがつかめないのですが 背景の圧縮ルーチンに気合を入れるよりは別のところに力を入れたほうが 良いような気が(^^; 圧縮アルゴリズムについても表示は32bppとしても使用色の標本をうまく採って (paletteみたいに)データ量を減らしていくという簡単な方法は駄目なんでしょうか。 #今月のC Magazineにも画像圧縮のアルゴリズムがいろいろ載ってますね。
|
新規投稿|この投稿にリプライ|投稿者削除
|
222:Re: FPS2000/06/29 (木) 00:55 |
コメント数: 17件 |
剣聖炎羅 |
|
なんだか連続書き込みになってしまい申し訳ないです… 用途としては、ADV・RPGの背景などの一枚絵という あまり速度の要求されない、比較的サイズの大きい絵です。
ところで、何FPSくらいになると実用的なのでしょうか? #掲示板の趣旨に反してしまい申し訳ありません_(__)_ |
新規投稿|この投稿にリプライ|投稿者削除
|
221:FPS2000/06/29 (木) 00:08 |
コメント数: 18件 |
剣聖炎羅 |
|
> > 客観的に言って、640x480x32bpp程度になると > > メモリアクセスだけで30fpsがやっとこ出る程度に > > なるので、そのまま使うのは困難であると > > 思わざるを得ません。 > 実際ゲームで使う表示部分は「展開」部分ですが、やっぱし遅いですね… > この後RLE+LHA符号化しますから… > やはり1枚絵に使うべきでしょうか? > #プレステに馴れてると、速度が気にならなかったりするのかも…(笑) 先ほどFPSを計ってみました。 最大値判定無しの部分をアセンブラで、残りをCのままにして 行ってみますと、640*480*32bppの画像で2FPS… 話にならないですね……(--;;; |
新規投稿|この投稿にリプライ|投稿者削除
|
220:Re^5: あれ?2000/06/28 (水) 23:00 |
コメント数: 25件 |
剣聖炎羅 |
|
こんばんはー
> えぇっと、逆ですね。 > 2000を超えると仮定できたほうがいいです(^^; > 画像サイズが小さいときは残りの部分の比率が > 高くなるので・・・。
ががーん。そういやそうだった…(^^;;
> 客観的に言って、640x480x32bpp程度になると > メモリアクセスだけで30fpsがやっとこ出る程度に > なるので、そのまま使うのは困難であると > 思わざるを得ません。 実際ゲームで使う表示部分は「展開」部分ですが、やっぱし遅いですね… この後RLE+LHA符号化しますから… やはり1枚絵に使うべきでしょうか? #プレステに馴れてると、速度が気にならなかったりするのかも…(笑) > ゲームに使うというのであれば > ある程度簡略化して扱ってもかまわないと思います。 > ということで、普通は平均値を求めて・・・という > ことになるかと思いますが、サンプリング領域を > 少し狭くしておくとか。 高周波部分を、統計的に求めたしきい値を元にしてカットしますが、 その部分が0になるだけで、逆変換する時のデータ個数は変わらないです。 やはり圧縮画像ファイルはゲーム向きではないのでしょうか? #1秒以内で表示が完了するなら気にならない気もします… |
新規投稿|この投稿にリプライ|投稿者削除
|
219:Re^4: あれ?2000/06/28 (水) 06:00 |
コメント数: 26件 |
さ〜 |
http://D5.w3.to/
|
どもです。
> > 例えばMax=2048ぐらいの大きさでしたら、その残りの部分が占める割合は > > 小さいですから、それほど気にする必要は無いと思います。 > 画像の圧縮(の一歩手前の変換の)アルゴリズムですので、 > Maxつまりデータの幅は2000を超えないと仮定できます。
えぇっと、逆ですね。 2000を超えると仮定できたほうがいいです(^^; 画像サイズが小さいときは残りの部分の比率が 高くなるので・・・。
> で、次の問題…2次元の変換なので、出てきたデータを行列として扱い、 > 転置行列を作ってもう一度変換しないと、変換作業が完了しません。 > ウェーブレット変換については、このページが便利です。 > http://www.imagica.com/tech/wavelet/wave_start.html > 転置行列って…速度的にもメモリ的にもふりなんじゃぁ…(^^;; > どうしよ、ゲームにつかえるのかな…
客観的に言って、640x480x32bpp程度になると メモリアクセスだけで30fpsがやっとこ出る程度に なるので、そのまま使うのは困難であると 思わざるを得ません。
ゲームに使うというのであれば ある程度簡略化して扱ってもかまわないと思います。 ということで、普通は平均値を求めて・・・という ことになるかと思いますが、サンプリング領域を 少し狭くしておくとか。
どのように使うのかにもよりますが。
でわ。 |
新規投稿|この投稿にリプライ|投稿者削除
|
218:Re^3: あれ?2000/06/27 (火) 23:29 |
コメント数: 27件 |
剣聖炎羅 |
|
> 例えばMax=2048ぐらいの大きさでしたら、その残りの部分が占める割合は > 小さいですから、それほど気にする必要は無いと思います。
画像の圧縮(の一歩手前の変換の)アルゴリズムですので、 Maxつまりデータの幅は2000を超えないと仮定できます。 (ゲームに使うことを前提としています) ということは、全て記述してしまえばいいわけなんですねー。
で、次の問題…2次元の変換なので、出てきたデータを行列として扱い、 転置行列を作ってもう一度変換しないと、変換作業が完了しません。 ウェーブレット変換については、このページが便利です。 http://www.imagica.com/tech/wavelet/wave_start.html 転置行列って…速度的にもメモリ的にもふりなんじゃぁ…(^^;; どうしよ、ゲームにつかえるのかな… |
新規投稿|この投稿にリプライ|投稿者削除
|
217:Re: 飽和減算2000/06/27 (火) 11:26 |
コメント数: 0件 |
へるみ |
|
>最後の行が「いいこと」です。 なるほど。以前考えたときは2行目までは思いつきましたが、そこから `mask' cを使ってc0とc1をswapすることばかり考えていました。 うまいですね(^^)
|
新規投稿|この投稿にリプライ|投稿者削除
|
216:Re^2: あれ?2000/06/27 (火) 11:25 |
コメント数: 28件 |
へるみ |
|
>問題は、残りの3つです。 >ループにしないで、全て記述してしまった方がいいのでしょうか?
例えばMax=2048ぐらいの大きさでしたら、その残りの部分が占める割合は 小さいですから、それほど気にする必要は無いと思います。 逆にMax=16ぐらいだったらその割合も大きくなるのでunloopした方が良い と思います。 #なんとも当たり前の話ですが...
それからrdtscのカウンタは64bitなのでedx:eaxが返ります。 eaxがoverflowしない限りedxは変化しません。 |
新規投稿|この投稿にリプライ|投稿者削除
|
215:飽和減算2000/06/26 (月) 05:15 |
コメント数: 1件 |
さ〜 |
http://D5.w3.to/
|
久々にいいこと思いついたので。
c = (((~c0 & c1) << 1) + ((~c0 ^ c1) & 0x7bde)) & 0x8420; c = (( c >> 5) + 0x3def) ^ 0x3def; return (c0 | c) - (c1 | c);
最後の行が「いいこと」です。 どこかですでに使われていたら 指摘してください(^^; 得意げにしてるのが恥ずかしいので(笑) なんとなく、どっかで見た気がしなくもないんですが(^^; |
新規投稿|この投稿にリプライ|投稿者削除
|
214:Re: あれ?2000/06/24 (土) 01:43 |
コメント数: 29件 |
剣聖炎羅 |
|
> どう計算しようかと思ってたら書き込みがなくなってますね(^^;
すみません(^^; 整理しようと思いまして、いったん削除しました(^^;;;;; ソースを入れようと思ったのですが、どうやら1000文字を超えるらしく(笑) どうしようかと悩んでます。 1次元での変換を考えると、最大値判定をしなくて良いのは(全データ数−3)回 なので、Cで書くと、 for (int k=0;k<(Max-3)*2;k+=2) { for (int n=0;n<8;n++) { *pDest = *(pSrc + (k+n)) * Matrix[n]; } } となります。この部分のnに関するループを全部ばらしてアセンブラ化したところ その部分は80クロック(実際は70位だと思います)で動いてるみたいです。 問題は、残りの3つです。 ループにしないで、全て記述してしまった方がいいのでしょうか? #クロック数判定には、rdtsc後のeaxの変化量を使ってます。 |
新規投稿|この投稿にリプライ|投稿者削除
|
213:あれ?2000/06/23 (金) 21:22 |
コメント数: 30件 |
へるみ |
|
どう計算しようかと思ってたら書き込みがなくなってますね(^^; |
新規投稿|この投稿にリプライ|投稿者削除
|
209:Re: 2. まとめて処理する No. 011ってば2000/06/18 (日) 18:12 |
コメント数: 0件 |
さ〜 |
http://D5.w3.to/
|
やっぱりレスは早いもの勝ちでしょう(^^; さ〜 です。整数演算専門です(^^;
> 0ビット同士でand取って、足しちゃダメなんですか? > output = ( ( col1 & 0b111101111011110 ) >> 1 ) > |( ( col2 & 0b111101111011110 ) >> 1 ) > | ( (col1 & 0b0001000100010001 ) & (col2 & 0b0001000100010001) ) > #答え:ダメです の可能性大(笑
動作としては問題ないように思いますが、 レジスタ数として問題がある、かもしれません。
仮に書いてみます。(col1:eax, col2:ebx, dst:edi, counter:ecx) mov edx, eax and edx, 0b111101111011110 shr edx, 1 mov esi, ebx and esi, 0b111101111011110 shr esi, 1 or edx, esi and eax, 0b000010000100001 and ebx, 0b000010000100001 or edx, eax or edx, ebx mov [edi], edx あれ?書けた(笑)
結論:コードが長くなります(^^; |
新規投稿|この投稿にリプライ|投稿者削除
|
208:2. まとめて処理する No. 011ってば2000/06/18 (日) 15:52 |
コメント数: 1件 |
kubota |
|
0ビット同士でand取って、足しちゃダメなんですか?
output = ( ( col1 & 0b111101111011110 ) >> 1 ) |( ( col2 & 0b111101111011110 ) >> 1 ) | ( (col1 & 0b0001000100010001 ) & (col2 & 0b0001000100010001) )
#答え:ダメです の可能性大(笑
|
新規投稿|この投稿にリプライ|投稿者削除
|
207:Re^2: 最大値を超えないようにする方法2000/06/16 (金) 19:12 |
コメント数: 0件 |
小次郎 |
|
> 勢いだけで書いたのであっているかどうか。 > ってひどい話ですね。 > アイデアレベルでの参考にとどめてください。
自己レス。 Maxが小さい時や奇数の時にうまく動かないようですね(^^; とりあえず、「*b += DataSrc[a] * Matrix[n]」を 「printf("k:%d n:%d a:%d\n",k,n,a)」に書き換えて その出力を眺めてみればある程度の法則性が見えてくる…かも。 |
新規投稿|この投稿にリプライ|投稿者削除
|
206:Re: 最大値を超えないようにする方法2000/06/16 (金) 17:14 |
コメント数: 0件 |
さ〜 |
http://D5.w3.to/
|
さ〜です。
> という概略なのですが、(k+n)%Maxの部分をどのようにすれば > idivを使わずに済むかが分かりません。
k+nが 2*Maxを超えないという制限をつければ下駄で対処できそうです。
たとえば、Maxの範囲が0-1023だとして、 geta = 1024 -Max と置きます。(getaって・・・) m = (k + n + geta) & 1024; として、m != 0のときにオーバーしているので、 newGeta = (m != 0) ? 0 : geta; で、 a = ((k+n+geta) & (1024-1)) - newGeta; でクリッピングできるような気が。
最初に書いたのがあまりにも間違ってそうな予感が したのでテストしてみたらやっぱり間違ってた(笑)
ということで、テストしたプログラム。 (これはあってるつもりのプログラムです)
for(int i = 10; i < 1023; i ++) { for(int j = 0; j < i*2; j ++) { int n; _asm { xor eax, eax sub eax, i mov ecx, eax add eax, j sbb ebx, ebx not ebx and ebx, ecx sub eax, ebx mov n, eax } int t = j % i; if(t != n) printf("%d, %d, %d, %d\n", i, j, t, n); }}
iがMaxに、jがk+nになるわけですな。 いじょ。でわ。 |
新規投稿|この投稿にリプライ|投稿者削除
|
203:Re^2: 最大値を超えないようにする方法2000/06/16 (金) 14:17 |
コメント数: 0件 |
へるみ |
|
私も今同じようなルーチンをいじってます(^^; Maxが大きいのか、小さいのか、固定なのか不定なのかにもよりますが、 内側の8回程度のループなら全て展開した方が速くなりますよね。
|
新規投稿|この投稿にリプライ|投稿者削除
|
202:Re: 最大値を超えないようにする方法2000/06/16 (金) 09:54 |
コメント数: 2件 |
小次郎 |
|
どーも。久々になってしまった小次郎です。
勢いだけで書いたのであっているかどうか。 ってひどい話ですね。 アイデアレベルでの参考にとどめてください。
for ( i = 2 ; i > 0 ; i -- ) { for ( k = 0 ; k < Max - 8 ; k += 2 ) { c = * b ; a = k ; for ( n = 0 ; n < 8 ; n ++ ) c += DataSrc [ a ++ ] * Matrix [ n ] ; * b = c ; b ++ ; } for ( j = 0 ; j < 8 ; j += 2 ) { //jは2からの方が善いかな〜 n = 0 ; c = * b ; a = k ; for ( l = 8 - j ; l > 0 ; l -- ) c += DataSrc [ a ++ ] * Matrix [ n ++ ] ; a = 0 ; for ( l = j ; l > 0 ; l -- ) c += DataSrc [ a ++ ] * Matrix [ n ++ ] ; * b = c ; b ++ ; k += 2 ; } }
あと、一応、DataSrc [ a + Max ] = DataSrc [ a ]となるように コピーしておいてループ内の処理数を減らすっていう手もありますね。 |
新規投稿|この投稿にリプライ|投稿者削除
|
201:最大値を超えないようにする方法2000/06/16 (金) 07:06 |
コメント数: 4件 |
剣聖炎羅 |
|
初めまして。
とある処理ルーチンをアセンブラで書き直しています。
for(k=0;k<2*Max;k+=2){ for(n=0;n<8;n++){ a=(k+n)%Max *b += DataSrc[a] * Matrix[n] } b++; } という概略なのですが、(k+n)%Maxの部分をどのようにすれば idivを使わずに済むかが分かりません。 ちなみに上のルーチンは、ドベシィ(N=4)の数列Matrix[]を使った ウェーブレット変換のルーチンです。 どなたかお答えいただける方いらっしゃいますでしょうか? |
新規投稿|この投稿にリプライ|投稿者削除
|
198:Re^12: 分岐予測の検証2000/06/06 (火) 20:12 |
コメント数: 0件 |
へるみ |
|
無理言ってPENさんにwin9x用のドライバも書いていただきました。 #ありがとうです。 アップしてよろしいのかしらん>PENさん ちなみにIntel系CPUの人はインテル・アーキテクチャ・ソフトウエア・ディベロッパーズ・マニュアル下巻(ia_s_dv3.pdf)が必須です。
|
新規投稿|この投稿にリプライ|投稿者削除
|
197:Re^11: 分岐予測の検証2000/06/06 (火) 16:57 |
コメント数: 1件 |
さ〜 |
http://D5.w3.to/
|
こんにちわ。
>要は、Ring0でしか動作しないrdpmcを許可するためのドライバなんです。
あ・・・ほんとだ・・・そんな命令があったのですね・・・ うかつな発言をしてしまいました。 アセンブラ1年生の僕はRing0が何かわかりませんが、 普通には使えないのですね、多分。
> >ついでにLinuxでも欲しい。 > >(誰に向かって言ってるんだろう?) > どうやら自分に向かって言っていたようです。
速っ。
> 現在Athlon専用です。ドライバ自体はPIIIでも使えますが、 > 設定方法が分かりません(^^;
僕はP5ファミリ用が欲しいです。 ドライバはP5で動かないのでしょうか?
> PS. > Win9x用ドライバ誰かつくってくれ〜。 同じく(^^;
>この掲示版を読んでるような方ならOSが落ちることぐらい >どうってことない(笑)と思いますが。
メインで使っているマシンはリセットボタンが 押しにくくて困ってます(笑)
教えてくんモードにて失礼します。 |
新規投稿|この投稿にリプライ|投稿者削除
|
195:Re^9: 分岐予測の検証2000/05/29 (月) 21:55 |
コメント数: 3件 |
へるみ |
|
さ〜さんお久しぶりです。 要は、Ring0でしか動作しないrdpmcを許可するためのドライバなんです。 まだ私はこのツールの使い方を分かっていません(^^; 今はWin2k/NT専用ですからWin9x用が凄く欲しいなと。 ついでにLinuxでも欲しい。(誰に向かって言ってるんだろう?)
PENさん、公開する予定はないでしょうか? この掲示版を読んでるような方ならOSが落ちることぐらいどうってことない(笑)と思いますが。 マニュアルは私が書いてもいいです。 |
新規投稿|この投稿にリプライ|投稿者削除
|
|