1 名前:デフォルトの名無しさん mailto:sage [2009/06/22(月) 22:06:29 ] ※回答する人も、質問する人も必ず読んでください これらに当てはまる人のための質問スレです。 1.C/C++は多少理解している。 2.最近DirectXを始めたばかり 3.SDKを見ても、Googleで検索しても、いまいち理解できない人 4.余計な雑談は不要ですよ 【 回答してくださる方 】 ・ できるだけ優しく質問に答えてあげてください。 ・ 優しく教えるのが嫌でしたら、解決するためのヒントだけでも結構です。 「ググれ」「SDK見れ」以外の回答でおながいします。 ・ 神ですら理解不能な質問は無視して下さい。 【 質問する方 】 ・ どんな事で躓いているのか明確にしよう。 ・ 長くならないなら躓いている部分のコードを晒してみれ。 ・ 解決した場合、お礼を言うのは当然だが、何をどうしたら解決したかを明確に書こう。 ・ 回答して貰ったら、出来るだけお礼もしよう。 【C++】 DirectX初心者質問スレ Part23 【C】 pc12.2ch.net/test/read.cgi/tech/1242977486/
263 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 12:49:55 ] >>261 縮退ポリゴンを使わずに、複数のビルボードをStripで描画するってどうやるの?
264 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 12:55:40 ] >>261 いまどきそんな。とか言ったって、DrawPrimitiveUPより早くならなきゃ質問に答えたことにはならないんだぜ? しかも今回は、毎フレーム1回しかUPを呼び出さだないわけだし、どうやってUP以上に「ロックとDrawをまとめる」んだよ?
265 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:01:22 ] >>263-264 ごめんなさい 俺こそが質問者の質問をよく読んでない、ただの馬鹿馬鹿しい男でした
266 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:07:44 ] ちゃんと自分の間違いを謝れる奴は、伸びる奴
267 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:10:27 ] >>256 そこまで試したならついでに、静的なVertexBufferに頂点データ入れてみて 本当に転送が問題なのかも確かめた方がいいかと。
268 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:15:57 ] /j^i ./ ;! / /__,,.. / `(_t_,__〕 / '(_t_,__〕 / {_i_,__〕 / ノ {_i__〉 / _,..-'" / / 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
269 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:23:51 ] だから動的更新ならAGPメモリ使えよ。
270 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:40:13 ] >>263 インデックスバッファ >>264 まず>>259 でロックが遅いなんて書くから、UPでもロックのコストは変わらないと書いた。 「動的な〜」の項読んでみろと。>>253 氏のも乗ってたはず。 で更にUP系でIB使うと、毎回IBの転送が起こるよな? ところが非UP系ならば初期(或いはVBサイズ変更時のみ)コストだけで済む。 で、更に頂点数の転送量は2/3に抑えられる。 もう少しいうと、DrawPrimitiveUP系の場合、計算用のアクセスしやすいバッファの他に、 描画用の配列をメインメモリに取って、更にVRAMにも同じのが出来るわけだ。無駄だと思うがねぇ。 まぁ、好きに実装したらいいじゃないの。なんでそんな必死よ>>265-266
271 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 13:43:23 ] >>252 がDrawPrimitiveUPを連投してるなら それをまずやめるべき。 >>257 方式で、まとめるのが一番良い方法だろうな。 余力と環境があるなら、ジオメトリインスタンシングも 試して欲しいところだが。
272 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:06:50 ] 結局「縮退ポリゴンを使わずに、複数のビルボードをStripで描画する」方法の説明がないわけだが
273 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:11:03 ] インデックスで縮退用のを適当に一枚かますってことか それでなくてもDrawPrimitiveUPにこだわる人は、 描画数増えたときどうするんだろ?
274 名前:デフォルトの名無しさん [2009/07/09(木) 14:24:44 ] 「DirectSoundで鳴らしている音」を録音したいのですが、 どうすればよいでしょうか? 例えば、自作ゲームの「BGM」と「プレイ中に適宜鳴る効果音」の両方を 1つのWAVファイルに録音したいと思っています。 よろしくお願いします。
275 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:27:40 ] 縮退ポリは使わないと言ってるだろ
276 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:39:01 ] なんか大人と子供だな
277 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:40:13 ] そもそも2000〜3000ポリゴン以下ならDrawPrimitive系もDrawPrimitiveUP系も 速度にほとんど差がないんだが、みんな計測した上で話をしてるんだろうか?
278 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:43:08 ] 誰もそこの速度差は問題にしていないけどな
279 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:46:15 ] 259です。 >>270 >UPでもロックのコストは変わらないと書いた 259で書いてるのは「結局(UPと同じくらい)遅いと思うが」という意味です。
280 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 14:54:53 ] >>277 >>278 むしろ本当に3000ポリゴン程度で差が出るなら問題じゃね? 速いほう使った方がいいだろ
281 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 15:07:02 ] たくさんのご意見ありがとうございます。 まず、UPをやめる+INDEX化で転送量が2/3になるのは良さそうです。 やってみます。 さらにINDEXバッファは1回だけ書けば書き換え無用ですから、純粋に2/3になりそうで良いですね。 TriangleStripで〜という方法は、いまいちわかりません。 離れた位置の四角ポリゴン(実際は三角ポリ×2)を描画する必要がある以上、TriangleStripは使えないのではないでしょうか? 縮退ポリゴン(描画されない細い三角ポリゴン)を使うことによる手法も聞いたことはありますが。 AGPメモリというのが最初よくわかりませんでしたが、D3DUSAGE_DYNAMICを指定することなんですね。 こちらも試してみます。 このほかに、下記のような手法も考えたのですが、一般的ではないのでしょうか? 説明を楽にするために、INDEXではない方法での説明とします。 ・「四角形を1つ描画するのに必要な情報」を作る。つまり6頂点分。 頂点データの中にD3DFVF_SPECULARを加え、その領域に「何個目の四角形か」を入れておく。 ・上記の6頂点×描画しうる四角形分の”静的”頂点バッファを作り、情報を書き込む。 その際D3DFVF_SPECULARの領域に入れている「何個目の四角形か」をきちんと適切な値にしておく。 ・パーティクルを表現するには、四角形毎の座標情報を更新する必要がある そこでID3DXEffect::SetVectorArray()で座標情報を渡す ・エフェクト側ではD3DCOLORtoUBYTE4を使って、対応するVectorArrayの座標情報を引き出し、頂点座標に加算する 問題点として、ビルボードをカメラに正面向けにするためのMATRIX変換を頂点シェーダ内でやる必要があります。 (今までは、頂点データ内のxyzを正面向くように調整済みだった)
282 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 15:16:38 ] >>281 長々書いてあるが、テストすれば分かることだから自分でやってくれ。 Index関係の思い出といえば、 Indexバッファを途中から使うための引数の与え方が全然資料が無いことだった。 正しく動作させるまでかなり試行錯誤したな。 一度動けばなんてことないんだが。
283 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 15:24:58 ] >>282 詳しく 前にIndexバッファを途中から使おうとしたんだけど GeForceとIntel系チップセットでは想定通りの動きをしたんだけど ATI系のビデオカードではうまく動いてくれなかったんだよね
284 名前:282 mailto:sage [2009/07/09(木) 15:28:43 ] >>283 逆に、マジかと言いたい。 オレはGeForceで開発した上でIntel系とATI系でも動いてることを確認する形を取ったが、 Direct3DのAPIレベルで互換性が無いような違いが IndexedBufferレベルであるんだろうか?
285 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 15:44:09 ] >>281 全然わからんが、要はこれがしたいのか? FVFが通るか、不安があるけど。 uniform float4x4 g_world_transform[n] = { ... }; static const float4 g_local_position[4] = { ... }; // for box vertices struct vertex_in_t { uint24 transform_index; // 0~n uint8 position_index; // 0~3 }; struct vertex_out_t { float4 positon; float4 color; }; void vp_main( in vertex_in_t iv, out vertex_out_t ov ) { float4x4 world_transform = g_world_transform[iv.transform_index]; float4 local_positon = g_local_position[iv.position_index]; ov.position = mul( local_positon, world_transform ); pv.color = float4(1,1,1,1); }
286 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:34:48 ] 縮退ポリゴンとはなんぞや?
287 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:43:39 ] >>286 面積が0のポリゴン ストリップは数珠繋ぎしか出来ないけど 途中面積が0のポリゴンを繋げれば バラバラに見えるでしょ
288 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:52:37 ] 報告です。 281で提唱した方法だとでかかる時間を1とすると、 AGPメモリに置く方法は2 DrawPrimitiveUPでやる方法は3 となりました。 何の因果か、きれいに1:2:3になりました。 281で提唱した方法だと、実質VRAMへ転送している量はvector4 * particleNumでかなり節約できます。 その他ですと、 float x, y, z; float nx, ny, nz; DWORD color; float u, v; でfloat * 9 * particleNumほど転送しているので、二倍超転送していることになります。 やはりボトルネックはこのあたりなのでしょう。 次は、ストリームを分けることで、AGPメモリに置く方法をとりつつxyzの値しか転送しないようにしてみます。
289 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 17:59:13 ] 1*1のポリゴン用意して トランス演算とDraてPrimitive繰り返せばよくね?
290 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 18:21:59 ] >>281 を見てると「それってInstancingじゃね?」と言いたくなる ttp://msdn.microsoft.com/ja-jp/library/bb174602(VS.85).aspx
291 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 18:48:59 ] 小沢の西松建設問題の時 09/01/21 西松建設社長を逮捕 09/01/21 元西松建設専務 死亡 09/02/24 長野知事の元秘書(西松建設事件での参考人) 死亡 (電柱にロープを巻きつけ首吊り自殺) 09/03/01 「小沢一郎氏と秘書と、ダム工事のただならぬ関係」を追及してきた記者(吉岡元議員) ソウルで取材中に死亡 09/03/03 民主党岩手支部家宅捜索 09/03/04 民主党事務所のある相模原卸売市場全焼 助かった人 小沢氏の第一秘書・大久保容疑者も自殺の恐れが出てきたため、検察が緊急逮捕 鳩山の献金問題
292 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 23:14:37 ] 288です。 288の報告は、いわゆるオンボでの実験で、頂点シェーダがソフトウェアで行われていました。 グラボつき(GF9600)の環境で試したところ、 UP系 5 AGP 8 281法 1 の割合で時間がかかりました。 AGP法のほうが、UPよりも遅くなっているのが印象的です。 >>290 面白い記事ありがとうございます。 まさしくこれですね。
293 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 23:42:09 ] なんかやり方が下手な気がする ソースあげてみ
294 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 23:49:07 ] つかindexbufferも使えない素人のコードによる測定になんの価値があるんだ いつまでやる気だろ
295 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 23:57:00 ] >面白い記事ありがとうございます。 節子…それ、公式サンプルや 一般的な方法がわかって良かったんじゃね
296 名前:デフォルトの名無しさん mailto:sage [2009/07/09(木) 23:59:00 ] まともなグラボならUP使ったほうが早いのは常識だろ 293とか294は典型的な2ch馬鹿だな
297 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:04:24 ] >>293 一番あやしいのは、逆に遅くなってるAGPのやつですよね。 pDev->CreateVertexBuffer( sizeof(D3DVERTEX) * 4 * MAX_SMOKE, D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY , MYFVF, D3DPOOL_DEFAULT, &m_buffer, NULL ); pDev->CreateIndexBuffer( sizeof(WORD) * 6 * MAX_SMOKE, D3DUSAGE_WRITEONLY , D3DFMT_INDEX16, D3DPOOL_DEFAULT, &m_index, NULL ); で生成し、毎フレーム下記のようになっています。 >>294 IndexBufferは使ってますよ m_buffer->Lock(0, sizeof(D3DVERTEX) * 4 * m_smokes.size(), (void**)&vertex, D3DLOCK_DISCARD); m_buffer->Unlock(); pDev->SetStreamSource(0, m_buffer, 0, sizeof(D3DVERTEX)); pDev->SetIndices(m_index); pDev->SetFVF(MYFVF); pDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4 * m_smokes.size(), 0, 2 * m_smokes.size());
298 名前:294 mailto:sage [2009/07/10(金) 00:04:34 ] >>296 は?UP云々なんて一言も言ってないんだがw
299 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:05:10 ] >>296 その根拠は? >>292 動的バッファLock時のオプションは どうしてる?
300 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:14:21 ] >>297 む、こりゃちょっとひどい気がする スレちゃんと読んでないけど、xyzは毎フレーム変化してるんだよな? どのタイミングで更新してるんだい?
301 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:19:30 ] >>299 D3DLOCK_DISCARDですね。 m_buffer->Lock(0, sizeof(D3DVERTEX) * 4 * m_smokes.size(), (void**)&vertex, D3DLOCK_DISCARD); この行が、動的バッファのロックです。 LockとUnlockの間に「ここで頂点情報を書き込んでいます」とか書くべきでした。すいません >>300 え、初心者サイトのサンプルをほぼそのまま使ったのですが、妙でしょうか? xyzの更新は、Lockの前に行っています。 m_smokesというのが、ビルボードの中心座標の配列vector<D3DXVECTOR3>です。
302 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:24:23 ] ちゃんとD3DLOCK_DISCARDでロックしてるし、 動的バッファの取り扱いは、特に問題はなさそう。 へえ、これでUP系の半分の性能なんだ、信じられんw
303 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:29:11 ] >>302 オンボ環境ではしっかりUPのほうが遅かったので、環境によるような気がします。 明日再度オンボ環境の場所に行くので、再度慎重に測り直してみます。
304 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:30:56 ] >>301 うーむ、Lockの前に更新って、矛盾してないか このソースだとDYNAMICでバッファを確保した意味がないよ?
305 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:34:25 ] こりゃ計測方法も怪しくなってきたなw 両方のソース示さない限り無意味だろw
306 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:39:25 ] >>304 すいません。ちょっと更新の意味を取り違えているのかもしれません for(DWORD i = 0; i < m_smokes.size(); ++i) { m_smokes[i].y += 0.1f; } m_buffer->Lock(0, sizeof(D3DVERTEX) * 4 * m_smokes.size(), (void**)&vertex, D3DLOCK_DISCARD); for(DWORD i = 0; i < m_smokes.size(); ++i) { (D3DVERTEX) *p = &vertex[i * 4]; p[0].x = m_smokes[i].x - 0.5f; p[0].y = m_smokes[i].y + 0.5f; p[0].z = m_smokes[i].z; p[1].x = m_smokes[i].x + 0.5f; p[1].y = m_smokes[i].y + 0.5f; p[1].z = m_smokes[i].z; p[2].x = m_smokes[i].x + 0.5f; p[2].y = m_smokes[i].y - 0.5f; p[2].z = m_smokes[i].z; p[3].x = m_smokes[i].x - 0.5f; p[3].y = m_smokes[i].y - 0.5f; p[3].z = m_smokes[i].z; } m_buffer->Unlock(); こんな感じにやっています。 実際は座標のほかに、normal, color, uv もセットしています。 あと、もうちょいマシなコピーの仕方をしています。 >>305 単純に1000フレーム回るまでの時間を計測しています。 描画以外はほとんど何もやっていないのと、座標移動計算はまったくといってよいほど時間をくっていないのを確認済みです。
307 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:41:06 ] >>294 =>>298 =>>305 初心者スレ荒らして楽しい? 他人の足引っ張って立って、自分の価値を高めることにはならないぜ? 無意味だと思うならスルーしてなよ
308 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:43:46 ] 特に問題あるようなソースには見えないな UP系のほうが早い場合があるというのは面白い UPはドライバ側で何かしらの最適化を行っているのかもね
309 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:44:01 ] >>307 連続でお疲れさんw
310 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:45:48 ] 294 indexbufferも使えない素人が!(キリッ!! 297 >>294 IndexBufferは使ってますよ 腹抱えてワロタw
311 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:53:01 ] 久々に有益情報が出てるな 俺は何も考えずにDrawPrimitiveUP使ってた Instancingとやらを使うと速度が5倍になるとかマジパネェから俺も実験してみるわ
312 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:53:04 ] 俺のソースでは、mallocaで確保した一時バッファにデータを作ってから Lock→memcpyでまるごとコピー→Unlock と、 ロックしている時間が短くなるようにしてたな。 なんとなくその方が良かろうと思っただけで、計測してないから鵜呑みにはするな。
313 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 00:57:20 ] 294じゃないけど、よくおまえらそこまで無条件で信用できるな。 煽る気はないけど、ソースのないベンチなんて昔は弾いていた気がするんだが。
314 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:01:39 ] DirectX10使えば縮退ポリゴンもいらねーしデータ転送量も抑えられるしでウハウハ。 SO使えば座標更新もGPUで出来てさらにウハウハ。
315 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:06:14 ] >>312 D3DLOCK_DISCARDを指定すると、 一時バッファを用意してくれるらしいので その処理は冗長と言える。
316 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:16:45 ] 俺もGeforce9600GTなんで、さくっと試してみたよ DrawIndexedPrimitiveとDrawIndexedPrimitiveUP LVetexで位置のみ毎時更新 前者は動的バッファがたまり次第フラッシュ 後者もそれに合わせようと思ったけど、面倒なんでメモリ一括確保 疲れてるんで固定機能でやったけど、1万ポリでも誤差程度 寝る
317 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:20:16 ] >>316 そうなるはずだ。 UP系かそうでないかでそんなに差が出るというのはちょっとおかしいんじゃないか。 プリミティブの座標更新をGPUにやらせることで全体の高速化を図るというのならまだ分かるが。
318 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 01:30:53 ] >>316 結局描画におけるGPUの時間が変わらないからフレーム単位だと時間は変わらないが DrawPrimitive()とDrawPrimitiveUp()だと関数から帰ってくるまでの時間にかなり差があったと思うが。
319 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 02:04:48 ] DirectShowのスレでも質問したのですが、スレの勢いを考えてこちらにも質問させていただきます。 DirectShowでGeekなページを参考に動画再生をするプログラムを作りました www.geekpage.jp/programming/directshow/change-rate.php 参考URLでは『put_Rateの引数を2.0などに変更すると倍速再生になります。 put_Rateの引数に負の値(マイナスの値)を渡すと巻き戻し再生になります』 とありますが、 pMediaPosition->put_Rate(0.5); のput_Rateの引数を負の値にしても大部分のフィルタは逆再生をサポートしていないため実行されません。 そこでIMediaSeekingかIMediaPositionを用いて、または用いなくてもいいのでdirectshowで 動画の巻き戻しをするプログラムを作りたいのですが、どうすればよいのやら困っています。 何か良い考えはないでしょうか? 是非知恵をおかしください!
320 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 04:29:31 ] テクスチャのサンプリングをWrapにして何度も繰り返すような貼り方をすると負荷が高いと聞いたんですが これは本当ですか? 使用するテクスチャが小さくなるから、むしろこっちのほうが良いと思ったんですが 自分の環境( GTX280 )では違いが見られなかったんですが オンボードのような低スペックのビデオカードだと遅くなったりしますか?
321 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 08:27:10 ] うそです。
322 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 08:28:23 ] ゲームの動画再生にDirectShowはいつも使っているけど、再生速度の変更が必要になったことがないから知らない。
323 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 08:34:33 ] AGPっていつの時代だよw
324 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 09:08:50 ] ソース無いベンチなんて意味ないよ ということではあるそうですが、一応報告しておきます グラボつき(GF9600)の環境で試したところ、 UP系 5 AGP 8 281法 1 オンボ環境で試したとところ UP系 10 AGP 9 281法 8.5 くらいの処理時間になりました。 あくまで同一環境内での比率なので、GF9600の数値とオンボの数値には関係性はありません。 まったく同じ実行ファイルで実験しました。 >>316 私の実験と差がありそうなのは下記2つっぽいですね >座標だけ更新 座標だけストリームを分けて、そこだけ更新したということでしょうか? (私のは、座標のほかに法線・カラー・UVも毎フレームVRAMに転送しています) >前者は動的バッファがたまり次第フラッシュ これはどういう方法でしょうか? D3DLOCK_DISCARDではない方法ですかね
325 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 11:36:58 ] 定数レジスタの数について質問があります DX8時代は96 DX9時代は256 というのはなんとなく知っているのですが、これは頂点シェーダのバージョンに依存しているのでしょうか? もしそうだとして 定数レジスタを200個近く使っている状態で VertexShader = compile vs_1_1 vertexShader(); とやったとき、問題なく動作してしまうのが不思議です エラーもでませんし、見た目も問題なく表示されてしまうのです
326 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 12:08:32 ] 最低サイズが だろ? 詳細はcapsで調べれたと思う どのみち最低サイズを守った方が利口だが
327 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 13:03:54 ] ICH10RでSSD2台で7RCでRAID0組みたいです。途中でFDDからRAIDドライバ読み込み必要ですか?
328 名前:デフォルトの名無しさん mailto:sage [2009/07/10(金) 23:54:37 ] >>324 です。 原因がわかりました。 どうやら、>>306 のように、ロックしてからループで書きこんでいくのはよろしくないようです。 >>312 のように、一時バッファを用意して全部メインメモリ上で書きこんでから、Lock。 memcpyでいっきに流し込みすぐUnlock とやることで、UP系と同等の性能になりました。 「これならUPでいいじゃん」って思ってしまいますね…。
329 名前:316 mailto:sage [2009/07/11(土) 12:23:40 ] >>324 なんの工夫もなくロックして位置や色を書き込み memcpy未使用 フラッシュはバッファに溜まったものを吐き出すって意味 今時使わない?俺もロートルか
330 名前:316 mailto:sage [2009/07/11(土) 13:00:33 ] memcpyでもやってみたが同じだな フォーラムをざっと見てきたが、UPはレガシー扱いで間違いないだろう ・UPはハードウェアサポートが約束されていない ・UPは中間バッファを勝手に使うからパフォーマンスが落ちる(チューニングしづらい) 少なくとも2倍から3倍のメモリを使う ・描画命令を出しても、完了してから制御を戻すわけでないので、UPのために確保したメモリがいつまで妥当であるべきかが不定 ・例え変化が無くてもmemcpyが描画命令のたびに呼ばれる(最適化が出来ない) 問題の件だが、冗長なメモリコピーがそのままUPのコストになるので、 扱う頂点数が増えるほどUPは不利になるだろう おそらく結果が逆転してしまうなら、正しく使えてないのだと思う
331 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 13:12:57 ] ロックが長いってだけで、1.6倍の遅延に繋がるとは思えない。 なぜそうなるのか、シナリオが作れない。 誰か説明してくれない?
332 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 13:35:23 ] >>330 ・描画命令を出しても、完了してから制御を戻すわけでないので、UPのために確保したメモリがいつまで妥当であるべきかが不定 流石にこれはないだろ。 UPを呼び出した直後に、確保したメモリーを壊してしまっても大丈夫だよ
333 名前:316 mailto:sage [2009/07/11(土) 14:12:18 ] >>332 さてどうだろうな 描画命令はFIFOで処理されタイミングは不定 投げ入れ側は(Sendではなく)Post扱い そしてUPの場合、向こう側で全コピーが必ず発生している 壊したメモリがたまたま生きていただけかもしれない *大丈夫だった*以上のことは言えないはずだ
334 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 14:15:00 ] UP系は関数から抜けたときにはソースのデータは破棄してOKなはず。 ようするに中でメモリ確保してコピーして保持してるって事だけどな。
335 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 14:21:21 ] ハハ、DrawPrimitiveUPは 何時クラッシュするかわからない ファイナルハゲマル丼的な関数というわけですね。 わかります。
336 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 14:23:18 ] >IDirect3DDevice9::DrawPrimitiveUP に渡す頂点データは、呼び出しの後も保持する必要はない。 >MicrosoftR Direct3DR は、呼び出しから戻る前に、そのデータへのアクセスを完了する。 >>330 の引用元の信用がガタッと減ったな
337 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 14:25:35 ] MSDNの記事くらいは読もうよ。 >IDirect3DDevice9::DrawPrimitiveUP に渡す頂点データは、呼び出しの後も保持する必要はない。 >MicrosoftR Direct3DR は、呼び出しから戻る前に、そのデータへのアクセスを完了する。
338 名前:316 mailto:sage [2009/07/11(土) 14:27:54 ] >>336 こりゃすまなかったな 引用元はよく使うGDevだ しかし全コピーが発生するのは間違いないだろう
339 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 14:30:06 ] >>336 だからこそUP系は遅いんだろ >>318 で既に出ているけど
340 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 14:30:50 ] UP系は中でDYNAMICなバッファのプールに対してLOCK_DISCARDと DrawPrimitiveを必要な数繰り返していると推測できる。
341 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:01:39 ] >>340 その間制御を戻さないならば、CPU時間が減るし、 コピー後に制御を戻すとしても、メモリとコピー時間が無駄なわけだよね。 どう考えてもUP系の方が速くなるはずがないのだけど、 そもそも質問主以外にそんな結果の人はいるんですかね?いないなら不毛な気が・・・。
342 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:16:29 ] 昔、散々会社で似たような検証してたみたいだけど 結局、使い方が悪いだけで変わらない(まあ、当然かw)って結論が出てたなw
343 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:20:01 ] だからといって、ある程度までの頂点数ならUP系でもほとんどペナルティーは無いわけだし、 種々のコンテナが使えるヒープメモリで間接的にレンダリング設定できるのはありがたい。 前作ったライブラリではUP系のみで実装した。 もっとも、現在製作中のライブラリは頂点バッファの確保/Lock込みで実装してしまったのでもう関係ない話だが……。
344 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:20:38 ] >>341 たんなるベンチ風に測れば速度は変わらないでしょ。 UP系は同期関数でUPじゃないほうが非同期って考えれば データ量が多くなってゲームなんかでCPUを使うようになれば差が出てくると思う。 3Dゲームで毎フレーム書き換える頂点データつったらエフェクトくらいしか思いつかないけど。
345 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:23:47 ] 2Dゲー作っててもたまに3Dゲーと同じような演出とかやりたいときあって 結局、UP系特化で作ったライブラリって開発してるとゴミになるぞ
346 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 15:37:54 ] UP系大好きなお前らに悲しいお知らせです。 ttp://msdn.microsoft.com/ja-jp/library/cc627093(VS.85).aspx >DrawPrimitiveUP と DrawIndexedPrimitiveUP はどうなったのですか。 >D3D10 で廃止されました。
347 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 16:16:24 ] >>340 で正解だな。加えて毎回バッファのプールを再作成していたような。 ロックで遅くなるってヤツは、メモリアクセス中にCPUとGPUがバッティングしたらどうすんの。 UP系だって結局中で同じことをせざるを得ない。UP系が未来の技術でない限りは。 しっかし100レス近くも費やす内容なのかねぇ
348 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 16:25:30 ] >>347 まあ、とんちんかんなベンチレポとそれに賛同したり火消ししたりが延々と続いたからな。 ソースをさらしてれば話は早かったんだが。
349 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 16:48:56 ] >>346 やっぱ、意味ないよねw
350 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 16:59:16 ] >>344 変わらないならOKでしょ。むしろ速くなるっていうからさ。 まー質問主というより、無条件で賛同しちゃっている人が悪いな。
351 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 19:25:56 ] 自演だろ
352 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 20:55:16 ] オンボ環境なら俺らが思ってるとおりの速さ順で、 GeForce9600GT下なら逆転する って言ってるのだから、何かしらあるんだろ 面白い事象だと思うがねー
353 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 21:04:14 ] それじゃあ俺クロシコの9600GT入れてるんですけどまずいっすねえ
354 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:05:35 ] >>352 さすがにもう来ないでくれ
355 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:20:58 ] 結局のところ逆転現象が起こる理由について誰も指摘できないわけか
356 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:30:09 ] ソースもexeもなしで何をどう説明できるんですか。
357 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:30:39 ] だから言ったろうに、端からチラ裏レベルの情報なんだから相手にする必要なし ソースコードも出せない怪しげな情報まき散らされると、 まともな初心者さんに迷惑なんですがねぇw
358 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:35:53 ] みんなソースを出せと平気で言うけど そんな簡単に出せるもんかね 誰も、使い捨てのテストプログラム作ってる訳じゃないでしょ そこは、非難する部分じゃない
359 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:40:48 ] >>358 三角プリミティブ表示にDirectDraw使ったら、D3Dと変わらなかったよ。 ソースは出せないけど、コードは絶対間違ってない! なんでこんな結果になるか説明して。環境?もちろん俺環境だお!
360 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:41:43 ] なんでもいいけどさあ あんまり初心者っぽくない人多いよね
361 名前:358 mailto:sage [2009/07/11(土) 22:45:21 ] >>359 同じ現象になる使い捨てのテストプログラム作って そのソースとEXEをアップしろよ
362 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:51:41 ] 色々な要因が絡んでる場合、うまく抜粋してソース出せるとは限らんしな それなりの報告とそれなりの信ぴょう性がありゃとりあえず「本当だとして」アドバイスするよ それが気にくわないならレスしなきゃいい
363 名前:デフォルトの名無しさん mailto:sage [2009/07/11(土) 22:52:40 ] >>361 簡単に言わないでください。非難…批難イクナイ!! ボクの計測結果ならいくらでも出します。ほらDirectDrawの方が速くなりました なんでですか! …という流れだな