なぜVBは扱いが低いのか
C#とかVBでわざわざポインタを使うのはdllとの繋ぎ目くらいだろ。
(JavaのJNIも同様)
繋ぎ目を隔離したラッパークラスを通さずに直接ネイティブを呼べば面倒なのは当たり前。
いたるところでガベージコレクションをロックするかのようなことを書いて、
GCが邪魔だと呟いているのは実に意味不明だ。 cZuhgiqX
どうやらロックの意味は理解できたようだな。ひとつ勉強になっただろ。
では逆に問う。君はGCの利点として何か実感できるものがあるのか?
GCのある言語とそうでない言語で同じ動作をするプログラムを組んだとして、
あきらかにGCの優位性を感じる場面に遭遇できるのはどのようなケースだ?
ちなみに自分はVB5からのユーザーだが、APIは当たり前のように使っている。 直接ネイティブを呼びまくること自体が低脳のすることだといってるのに
ロックの意味もわかってないからあちこちでロックしまくってるわけだろ。
普通の人はそんなことしないので、ロックするといわれてもわかりません。
DLL、SQLとかVBの外にあるものは隔離して
VBのみで完結しているように設計を作るのは基本。
>APIは当たり前のように使っている。
Win32のことか?DirectXラッパぐらい作ってから言えよw
>GCの利点として何か実感できるもの
スマートポインタ(参照カウンタ)を使うようなケース。 DirectXライブラリならDX7ベースのものを作った。ところで、その口ぶりなら当然
自分もそのぐらいは作ったんだろうな。CPUで演算したデータをバック・スクリーン
サーフェスに転送する場合、ロックもかけず、APIも使わず、どーやーって
転送しているんだ?おしえてくれよ。
スマートポインタ使うと、アプリの速度が上がるとでも言いたいのか?
俺が聞いたのはコーディングの話じゃない。実行上の有利性だ。 >いちいちロックしないと いけないので、面倒極まりないんですけど。
>俺が聞いたのはコーディングの話じゃない。アプリの速度だ。
生産性の話をしていたのに、突然実行速度の話に変わったな。
GCは主に生産性の向上を目的として導入されているのに、おかしな話だ。
まあGCが得意なパターンにマッチすれば速くもなる。
C++でRAIIだと重いdelete()が集中しがちだが、
GCだと実際に解放するのを後回しにして、
負荷が軽い頃合に並列GCが少しずつ解放してくれたりする。 >DirectXライブラリならDX7ベースのものを作った。
ならライブラリを使っている限り、アプリケーション層ではAPI(dll)を呼ぶ必要はなく、
従ってロックなどしないはずだ。そうでなければライブラリに存在意義がない。
ライブラリを作ったような妄想に浸っていただけだったというオチだな。 馬鹿だなあ、ライブラリ自体をVBで作ったんだ。
バックサーフェスのLockメソッドを実行して、引数の構造体からポインタを
取得し、APIの movememory を使って転送する。
ちなみにDX9のフレームバッファに直接書き込む場合は、メソッドがあるので
APIは使わないようだが、ロックはしなければならない。
おまえさんのライブラリではどーやってんのかなあ?答えてないぞ。
なにしろ>>152で「DirectXラッパぐらい」って言ってんだから、「ぐらい」なんだろ。
簡単にできそうじゃねーか?当然作ってあるんだろ
強がっても本当はDirectXライブラリなんて作った事ないんだろ。まあ昨日までロックを
知らなかったんだから無理も無い。
そのくせ態度だけはでかいんだよな。ヒトを低脳よばわりとかして…
GCが効果を出すのはごく限られた状況だけ、ほとんどは余計なプロセスが動くだけで
STGなんかを作る人からは嫌われている。
GCがメモリをいじくりまわしても、無造作にメモリ使いまくるコード組んでりゃいつかは
足りなくなってスワップするし、ようはスワップがちょっと遅れて来るぐらいの効果しか期待できない。
とりあえず自分で「ぐらい」と言った「DXライブラリ」作ってみそ。そしたら少しは認めてやるわ。 俺はお前の先生じゃないからな。
初心者に1から10まで教えたりはしない。
あと話がコロコロかわるわ、分散するわ、人の書いたことが理解できないわ、
そんなお前と話をしても漠然と広がるばかりで一向に収束しない。
理由は単純、ID:wVU/jdLoがなりふり構わず言い返したいだけだからだ。
何がしたいの?そんなにくやしかった? 「DXライブラリなら作ってある!!」と言い返せないんだな。
そして「ロックを使わずにピクセルデータをバックサーフェスに転送できる!!」とも言えないんだな
くやしいのう。くやしいのう。
>俺はお前の先生じゃないからな。
>初心者に1から10まで教えたりはしない。
じゃあひとつだけでいいよ。
ロックを使わずにピクセルデータをCPUからバックサーフェスに転送できる方法
とやらを教えてくれ。
コードを表示してこっちで試して正しく動作したらオマエの勝ちでいい。
できなければオマエの負け。
オレはロック使わないと絶対にできないと思ってる初心者だから、先生よろしくたのむよ
…しかしコイツ本当に一度でもDirectXのコード組んだことあんのかよ?
APIも使ったことないんじゃねーの?
どっちが初心者だよまったく…バカじゃねーの? 何言ってんだこいつ。日本語が不自由な上に統合失調症の傾向がある。
ロックするとか意味不明だし、プログラム向いてないから病院いっとけ。 >ライブラリ自体をVBで作ったんだ。
こんな事書いてる辞典でお前がライブラリなんか作れないことは自明のこと。
一個一個ロックしてコールバック呼ぶ間抜けな姿が目に浮かぶわw
DirectXで頂点バッファとかVRAM転送に関するロックと
マネージコード(VB, C#, Java)のGCに関するロックは全く違う話だってのもわからないだろ?
初心者が強がったところでまたひとつ恥をかいてるよ。バカじゃねーの? >オマエの勝ちでいい。
そうだな。俺の完全勝利ってこと。
普通にロックなんて誰もしないものw
おかしな知ったかぶりでGCを批判するぐらいなら
全部C++で書けばいんじゃないの?
ロックせずにコールバック呼べるよ〜?w そう、ID:wVU/jdLoは完全に負けたんだよ。
俺のC#ライブラリを使う限り、誰もGCロックなんてしないし、
SlimDXやMDX、XNAなど普通のライブラリやフレームワークはみ〜んなそう。
ついで抽象度を高めればDirectXのロックもライブラリ層で消せますな。
低脳ライブラリではコールバックの名前が変わっただけで隠蔽性も何もなく、
ロックしてまわるそうです。一体何のためのライブラリなのか謎ですな(苦笑) オマエ…DirectX7を知らないのか…絶句…アホ。 ネイティブコードに関する規模の大きいライブラリを作るなら、
dll(C)側とコネクタとなるマネージコード側の両方を書くのは必須。
これ知識というより普通は気付く。
低脳にも理解できたかな? ひとつ勉強になっただろ。
先生にありがとうございましたって、しっかり頭下げとけよw こっちはDX9のDirect3Dを前提に話をしているが、
DirectDrawでも話の芯は全く同じだ。 じゃあオフスクリーンサーフェスにピクセル配列を転送するコード
を書いてみろ。 >>156でも書いたが、取得できるのはポインタだぞ。その後どうするつもりだ? ハハハ、まだそんなこといってるのか。
DirectXなんて時間かかって面倒くさいだけで、
可能・不可能を論じれば誰でもできる簡単なことだからな。
完全勝利 >オフスクリーンサーフェスにピクセル配列を転送するコード
言い回しが古すぎるね。
Direct3D9ではIDirectSurfaceを直接操作せず、IDirect3DTexture経由で事足りる。
以下、テクスチャを1ドット毎白く塗りつぶす例。
D3DLOCKED_RECT lockRect;
pTexture->LockRect(0, &lockRect, NULL, D3DLOCK_DISCARD);
for(int y=0; y<h; y++)
{
for(int x=0; x<w; x++){
DWORD color = 0x00ffffff;
BYTE* p = (BYTE*)lockRect.pBits + lockRect.Pitch*y + 4*x
memcpy(p, &color, sizeof(DWORD));
}
}
pTexture->UnlockRect(0); ライブラリを作るなら、例えば次のようにラップされ、
ライブラリユーザーは"ロックなど不可視"なはずだ。
virtual void FillTexture(int rgbColor) = 0; あっちゃ〜、こりゃまた完全勝利してもうたわぁ〜。
低脳にも理解できたかな? ひとつ勉強になっただろ。
先生にありがとうございましたって、しっかり頭下げとけよw ID:wVU/jdLoが顔真っ赤にして唇を噛み締め、悔し涙を流すのも無理はない。 ではこちらはデータ転送部分だけだが、オレの書いたコードをあげよう
void __stdcall s2sp15MoveMemory32SSE2( long ptrSrcZeroDTSC, long ptrDstZeroDTSC, long SrcWidth, long LinePlusByte,long StartTop, long WorkHeight )
// 同サイズでの32ビットカラーデータ転送。サイズは送り側 SrcWidth を、8の倍数にすること。
{
__asm
{
mov ebx,LinePlusByte
mov esi,ptrSrcZeroDTSC
mov edi,ptrDstZeroDTSC
mov eax,SrcWidth
movd mm0,eax
shl eax,2 // 32ビットなので4倍
mov ecx,StartTop
mul ecx
add esi,eax // ソース開始アドレス
movd eax,mm0
shl eax,2 // 32ビットなので4倍
add eax,ebx // LinePlusByte
mul ecx
add edi,eax // デスティネーション開始アドレス
movd eax,mm0
shr eax,2 // 4点ずつ処理する
movd mm6,eax
mov eax,WorkHeight
add eax,ecx
movd mm5,eax // エンドライン
mov eax,ebx
or eax,edi
test eax,0xf
jnz LL201 // アライメントNG LL101: // アライメントOK
movd eax,mm5
cmp eax, ecx
je LL99
movd mm7,ecx
movd ecx,mm6
LL102:
dec ecx
js LL120
movdqa xmm0,[esi]
movntdq [edi],xmm0
add esi,16
add edi,16
jmp LL102
LL120:
add edi,ebx // ダイレクトXでのライン加算
movd ecx,mm7
inc ecx
jmp LL101 LL201: // アライメントNG
movd eax,mm5
cmp eax, ecx
je LL99
movd mm7,ecx
movd ecx,mm6
LL202:
dec ecx
js LL220
movdqa xmm0,[esi]
movdqu [edi],xmm0
add esi,16
add edi,16
jmp LL202
LL220:
add edi,ebx // ダイレクトXでのライン加算
movd ecx,mm7
inc ecx
jmp LL201
LL99:
emms
}
return;
} movntdqは、ライト時にCPUキャッシュへの書き込みをキャンセルする命令だ。
書き込みを高速化できる。 誰も聞いてないし、何の目的があってそんな糞を貼ったんだ?
ところ構わず糞を垂れるのは痴呆なのだろう。病院逝っとけ。 >書き込みを高速化できる。(ドヤ
やはり病人のようだな。相手し切れん。 貼っとくか
アスペの特徴
@勝ち負けに異常にこだわる (常に生と死や○か×かの極端な二択)
A性的なことで相手を罵倒するのが好き (性への異常な執着)
B相手を知的障害者や奇形児と罵倒する (生理的に苦痛などの一般的な感情の欠落)
C揚げ足 (自分では分析・考察ができないため周囲の言葉を借り「それはお前」とオウム返し)
D個人情報や姿・容姿への一方的な思い込み (「相手は○○であるから△△である」という決め付け)
E自分は常に被害者である (周囲が自分の意見を分かってくれないのは周囲が悪いという自己中心的な考え)
F粘着質 (少しでも気に入らない相手には徹底的な誹謗中傷を行う)
G感情的になると幼稚な言葉や短文での罵倒 (うんち、お漏らし、死ね、臭い等の言葉の連投)
http://logsoku.com/thread/hayabusa.2ch.net/livejupiter/1280374335/ wVU/jdLoが問題にしてるのは、VB側で確保したヒープを、DLLなりに渡す方法じゃないのか?
>>171のコメントってずれてないか?
>>161のコメントって脱線してないか?
>>157で言ってる話をころころ変えてるのって、どっちの方だ?! >wVU/jdLoが問題にしてるのは、VB側で確保したヒープを、DLLなりに渡す方法じゃないのか?
そうだよ。俺はDLLにヒープを渡す際に行うGCのロックについて回答した。
しかし回答に対してwVU/jdLo(>>153)が突然、
DirectXでサーフェスのVRAMをロックする仕方を教えてくれと言い出した。
以後、彼はGCとDirectX、2つの話を同じ話とした誤った前提をもとに得意面で執拗に追及しはじめる。
またwVU/jdLo(>>153)はGCのロックが面倒だという当初の題目(>>146)を覆し、
「俺が聞いたのはコーディングの話じゃない。実行上の有利性だ。(実行速度) 」
などと捏造する。
その後も謎の要求を繰り返す。
「オフスクリーンサーフェスにピクセル配列を転送するコードを書いてみろ。」
「コードを書いたらオマエの勝ちでいい。 できなければオマエの負け。」
しかたがないので、wVU/jdLoが繰り返し要求していたコードを書いた(>>171)。
何か意味や目的があるのかしらないが満足したらしく、
ID:wVU/jdLoは意味もなく >>175->>178 を張ったということだ。 読解力のないお馬鹿さん友達なのはよくわかった。
だが俺のせいにされても困るな。頭のおかしい人が1人で暴れてて、
こっちは二転三転する話に付き合ってやっただけだから。 頭の中の藁人形に勝利宣言するのって気持ちいいのか?www 久方ぶりに来てみたら、なにやら人が沢山いるな。VBそっちのけでw
まあ、.netのガベコレに苦労してる人が多いのは分かった。
メモリー管理は初心者には相変わらずの鬼門だな。
でもさ、.netではAPIのかわりになるような命令がいっぱいあるから、
API呼び出す必要はほとんど無いような・・・
>>146
>Vistaのせいかな?あのころ、メモリ不足でパフォーマンスが落ちるPCが多かったからな。
>でも .net って Vista より先じゃなかったっけ?
メモリーの断片化はもっと昔から問題になってたわけだが?
とにかく動的メモリーを使いまくると正体不明でアプリが落ちるわ、
落ちた後でもOSが不安定になるわで動的メモリー管理は敷居が高かった。
まあ、断片化しないようにメモリーを使えば問題ないわけだが。 そうそう昔は、動的メモリーを多用してるアプリケーションを平行して
何個も動かしていた場合にも、メモリーの断片化が発生していたな。
メモリーの虫食い現象と呼んだ方が分かりやすいかな?まあ詳しい話は
フラグメンテーションでぐぐれ。こればっかしは、ガベコレを使わない限り、
メモリーを増やした所でアプリが落ちるのを延期するぐらいの意味しか無い。 あと、初心者だとメモリー管理に関してはスワップファイルが
何とかしてくれると勘違いしているようだが、スワップファイルを
ページングで何とかなる容量は32bitだと2Gバイトまでなんだよな。
64bitOSの場合だとHDDの許す限り何とかしてくれるんだろうけど。 動的メモリの確保と解放は難しいのではなくミスを招く。
数をこなしてる上級者でも忘れたり、ちょっとしたポカをする。
だから上級者でもガベージコレクションはかなりありがたい。
.netやjvmのメモリコンパクションはあまり期待できない。
あとメモリリークではなく断片化でアプリ落ちるか?
>>191は仮想メモリのアドレスサイズの話だろうか。 断片化が最終段階に達すると、空領域があるのにもかかわらず、突然メモリーの取得や再取得に失敗するようになるんだよ。
あとはメモリー破壊へとまっしぐら。もしくは例外終了かな? >.netやjvmのメモリコンパクションはあまり期待できない。
これは初めて知った。んー、VBはメインで使う言語じゃないから気にしないでおくか。
>>>191は仮想メモリのアドレスサイズの話だろうか。
そうだよ。 簡単にお金が稼げる方法興味ある人だけ見てください。
グーグル検索⇒『来島のモノノリウエ』
UD63T2V610