C/C++ゲーム製作総合スレッド Part4
■ このスレッドは過去ログ倉庫に格納されています
0001名前は開発中のものです。
2013/08/12(月) NY:AN:NY.ANID:RPqvnGkC元スレ
DXライブラリ 総合スレッド その12
http://toro.2ch.net/test/read.cgi/gamedev/1330000532/
前スレ
C/C++ゲーム製作総合スレッド Part1
http://toro.2ch.net/test/read.cgi/gamedev/1337516528/
C/C++ゲーム製作総合スレッド Part2
http://toro.2ch.net/test/read.cgi/gamedev/1351015269/
C/C++ゲーム製作総合スレッド Part3
http://toro.2ch.net/test/read.cgi/gamedev/1357899040/
0043名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:N+ythJ4Kいつから、push_backとメモリ確保の話がごっちゃになってんだ?
ついでに、>>37 のようなソースでは毎回同じアドレスからstd::vector<INT> vを割り当ててると思うので、
mallocのキャッシュが利いてるはず。これはあまりよろしくないメモリ確保の時間測定に見える。
0044名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:0LNl2nPC予め上限がわかってたらreserve()するのが常套手段だよな
0045名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:gvLEj0CQ0046名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDe#include <Windows.h>
#include <stdio.h>
#include <vector>
#pragma comment (lib, "winmm.lib")
int main()
{
timeBeginPeriod(1);
DWORD t = timeGetTime();
int i,j;
for(j=0;j<100000;j++)
{
std::vector<void*> v;
//v.reserve(100);
for(i=0;i<100;i++)
{
v.push_back(malloc(rand()%100));
}
for(i=0;i<100;i++)
{
free(v[i]);
}
}
printf("%d\n",timeGetTime()-t);
return 0;
}
>mallocのキャッシュが利いてるはず。これはあまりよろしくないメモリ確保の時間測定に見える。
文句があるなら、自分でソースを出せよ。
で、具体的にmallocのキャッシュとやらを測定するソースを出してみろ。
当然、測定した上での発言なんだろ?
0047名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDe256で上限に達したら65536のコスト?
そんな馬鹿な実装のstlがどこにあるのか、後学のために教えてくれ。
0048名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:p8pHPbEqただ、プロのゲームプログラマになるのなら必ずしもSDKに付いてくるstd::vectorの拡張処理が効率的になってるとは限らないということを覚えておいてほしい
reserveなんかいらねぇぜって思ってたらpush_backが毎度1個分ずつ確保する実装だったでござるっていうのもあったから
0049名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:Et8FPqsn0050名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:N+ythJ4K{
std::vector<int> v;
//v.reserve(100);
for(i=0;i<100;i++) { v.push_back(0); }
}
printf("%d\n",timeGetTime()-t);
t = timeGetTime();
for(j=0;j<100000;j++)
{
std::vector<void*> v;
//v.reserve(100);
for(i=0;i<100;i++) {
v.push_back(malloc(100));
free(v[i]);
}
}
printf("%d\n",timeGetTime()-t);
t = timeGetTime();
for(j=0;j<100000;j++)
{
std::vector<void*> v;
//v.reserve(100);
for(i=0;i<100;i++){ v.push_back(malloc(100)); }
for(i=0;i<100;i++){ free(v[i]); }
}
printf("%d\n",timeGetTime()-t);
0051名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:N+ythJ4K171
882
1123
reserve有り
36
746
984
約1.3倍速い
0052名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:xDDIctRwvector::reserveのことなのかmallocに魔法があるとでも
0053名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:gvLEj0CQその結果見ると140ms程度がreserveで改善されてるって感じじゃないの
1回あたり140nsのオーバーヘッド
1フレームで1000回以上呼び出されるようなら無視できないレベルだと思うけど
push_backの使いどころってそんなにあるかね?
0054名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDe>reserveなんかいらねぇぜって思ってたらpush_backが毎度1個分ずつ確保する実装だったでござるっていうのもあったから
具体的にどのstl?
あるかもしれないではなく、「あった」と言っている以上、当然知ってるよね。
>>50
全然mallocキャッシュとやらの検証は出来ていないが、頭は大丈夫か?
そもそも人のソースじゃ無くて自分のソースを出せよ。
当然、以前に自分が検証したソースがあるんだろう?
>>53
140ms/(100000*100)=14ns
0055名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:gvLEj0CQ1000万回か100万回と勘違いしてた
0056名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:3lIk+S6c2つ目のmallocしてすぐにfreeしている版が少し速いから使い回しされている感がある
Windowsはfreeされたメモリ領域を覚えているなど管理がわりと賢い
http://marupeke296.com/cgi-bin/cbbs/cbbs.cgi?mode=al2&namber=2568&rev=&no=0&P=R&KLOG=3#5
reallocは連続した領域があればメモリコピー無しで終る(らしい
mallocもreallocも、実装や実行時の状況次第で所要時間が変わるからコストを評価しづらい
0057名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:xDDIctRw0058名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDe>mallocもreallocも、実装や実行時の状況次第で所要時間が変わるからコストを評価しづらい
だからシステム全体では誤差に埋もれる程度の差しかないと何度も言っているだろう。
実際にはやらないようなあり得ない数を回して、ようやく測定できるレベルなんだから。
0059名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:3lIk+S6c0060名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:p8pHPbEqPS3のstlですな
0061名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDeps3といってもcellのコンパイラや流出したSDKなど色々あるんだが、
具体的にどのSDKのどのバージョン?
0062名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:vaRAcf+l0063名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:cI+F41paこのコストを無視出来るかどうかは、要素数にもよる
push_backで確保できない場合、結局内部的には一定量(実装依存)reserve&コピーされていく。
(例えばVC2012でreserve数の変化は1 2 3 4 6 9 13 19 28 42 63 94 141という感じ)
したがって要素数があらかじめ予想できるならば、最初からreserveしておけば無駄がない。
あらかじめ要素数が予想できない上に、リソースが潤沢なハードなら、reserveせずにvectorの実装に任せてもいいかもね。
0064名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:hhcLBb7Wまたゎいトンのχ
>>42
>>数百程度のキャラクターのデータなら、
>>数百程度のキャラクターのデータなら、
>>数百程度のキャラクターのデータなら、
そんなに威張れる「システム全体」なんか?wwww
もどきの体裁を取り繕う程度の仕様なんじゃね。
短小首尾一貫カッコイイッスネwwwww
0065名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDe>このコストを無視出来るかどうかは、要素数にもよる
こういう発言の何が問題なのかというと、無視できなくなる具体的な数や状況を全く明示せずにソースの提示もしないこと。
そういった前提条件が無くなると議論のしようも無く、正しく宗教論争を起こすきっかけにしかならない。
0066名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:9jJD2zAK奇数手先(相手の手)を評価するの?
それとも偶数手先(自分の手)を評価するの?
0067名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:029MaZhBそのへん全ては自分で決めるもんだと思うよ
0068名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:kxsRXbTmそれを言うなら貴方の言う「システム全体」も漠然としすぎてるんじゃない?
「フルマラソンするには数リットルの給水が必要だ」と言ってる相手に
「通常生活おくるだけならそんなに給水は必要ない」って言ってるように聞こえるんだけど。
0069名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:N+ythJ4Kどこが検証できていないか具体例でよろしく。
第一自分のソースとか関係ない。
単純な繰り返しの場合、速く確保できてるのを示すだけだから。
reserveは行きがけの駄賃。俺なら最初に確保しとくね。
0070名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDe道路に微妙に落ちている砂を事前に払っておかないと、
マラソンのタイムに影響するという方が正しい。
そもそも毎フレーム再確保するという前提自体、
そうしないと完全に測定不能なほど小さい値だからやっているだけで、
普通のシステムなら初期化やシーン切り替え時に確保作業は終わっている。
シーンの切り替えに発生する数マイクロセカンドをどうやって測定するんだ?
そうなると何をどうやっても差が生まれないんだが、
無いものを無いと証明するのは悪魔の証明で不可能だ。
だったら差が生まれる前提条件を明示しないと議論しようが無い。
なぜあると言っている奴が、条件すら書けないんだ?
>>69
mallocキャッシュとやらが効いている場合と効いていない場合で、
結局どれだけ差があるのか数値化できていない。
結果から引き算で求めるというのなら簡単に論破する準備があるから、
具体的な数字をだしてみな。
0071名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:QdFKITVo実装によって異なるみたいだけどSTL自体のソース読めば済む話じゃないのん
せめてやるならMSVCだとかWindowsだとか限定しないとねぇ…
0072名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:N+ythJ4K>>51
0073名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDe限定するとあるある派の逃げ道がなくなるからあえて塞がなかったんだけど。
旧世代のPDAとかリソースが貧弱で、これだけ影響するぞっていうのを期待していたんで。
毎フレームメモリを確保し直すとかいうプログラムの目的は想像がつかないから実例を挙げる難易度は高いけど。
Windowsに限定したらそういうのが無理になるだろう。
>>72
やっぱり答えないと思ったよ。
mallocキャッシュとやらの有無による違いは具体的に何ms?
ノイズが多すぎて検証しようが無いよね。
そもそもmallocキャッシュって何?
ハード側のキャッシュメモリが働くのを期待しているということ?
それともmalloc自体に何らかのキャッシュ機構があるってこと?
0074名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:N+ythJ4K単位はmsなんだから3番目から2番目引いたら出るだろ。
1000万回で(この場合はreserve関係ないけど)有り241msと無し238ms
そう。malloc自体になにかある。同じアドレスは速い。
0075名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDeやっちゃったね、引き算。
ループの数が違うから、最適化やジャンプに引っ張られて検証なんて出来ないよ。
0076名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:zpg6JFDe空いている領域をきっちり調べていることを示すサンプル。
事前にデータが確保されている数が多いほど、探索に時間がかかる。
これも数を極端にしないと、検証できないレベルだけどね。
int main()
{
timeBeginPeriod(1);
int i,j;
DWORD t = timeGetTime();
while(timeGetTime()-t > 2000);//CPU省電対策
/* std::vector<void*> v2;
for(i=0;i<10000;i++)
v2.push_back(malloc(100));
*/ t = timeGetTime();
for(j=0;j<10000;j++)
{
std::vector<void*> v;
for(i=0;i<10000;i++) {v.push_back(malloc(100));free(v[i]);}
}
printf("%d\n",timeGetTime()-t);
return 0;
}
>そう。malloc自体になにかある。同じアドレスは速い。
心霊現象かよ。
0077名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:N+ythJ4Kt = timeGetTime();
for(j=0;j<100000;j++)
{
std::vector<void*> v;
for(i=0;i<100;i++){ v.push_back(malloc(100)); free(v[i]); }
//for(i=0;i<100;i++){ free(0); }
}
printf("%d\n",timeGetTime()-t);
t = timeGetTime();
for(j=0;j<100000;j++)
{
std::vector<void*> v;
for(i=0;i<100;i++){ v.push_back(malloc(100)); }
for(i=0;i<100;i++){ free(v[i]); }
}
printf("%d\n",timeGetTime()-t);
コメントあり
1082
1327
コメントなし
1120
1334
リリースモード、最適化・全体の最適化なしで。
コメントを外した場合、上のほうがfree(0);のコスト分だけ上乗せされるが、
実際はそれでも勝ってる。この結果はどうする?
0078名前は開発中のものです。
2013/08/17(土) NY:AN:NY.ANID:N+ythJ4Kんな妙なCPU対策しないで、倍率可変切れよ。ブレまくるだろ。
0079名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:JMyzqe1I>>77のソースのコメントを外し、1番目と二番目を入れ替え、間にさらに10倍した
std::vector<void*> v2;
for(i=0;i<100000;i++) v2.push_back(malloc(100));
を挿入しても
1344
1133
という結果で、多くても誤差範囲だったぞ。
>事前にデータが確保されている数が多いほど、探索に時間がかかる。
いや、stlの2倍ずつ増やすという例はあるが、いくらなんでもそういうアホな実装はしてないだろ・・・
0080名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:3VI/UU3tたった100程度の配列でも、1ループに付き13回の全要素コピーと、40もの余分な領域が生じるというのに、
実測現れないという曖昧な理由でこれを無視出来るあなたは、ゲームプログラムから手を引くべきだと本気で思います。
0081名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:JYvbxHoe第一スレチなんで他でやってよ
0082名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:+ZBVAlmgループの中のコードを変えたらまともに測定出来ないから、
ループの中身をいじらない>>76の検証用のソースを用意したんだが。
まずはその結果に対する反証や、やり方がおかしいという意見は無いのか?
0083名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:PzCLOwMa0084名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:JMyzqe1Iソースはそのまま、リリース、最適化・全体の最適化ON
事前確保なし 7466
事前確保あり 7187
下二桁はぶれるが数十回測ってもだいたいこんなもん。
事前確保ありのほうが何故か速いが、逆に俺の援護になっちまったんじゃないのか?
0085名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:YlvB6n+h0086名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:7ElO2ftx私はこの議論を楽しく読ませてもらってる。
以前にもnew/deleteのコストの議論があったと思うが、あれも面白かった。同じ人かどうかは知らないが。
しかし
>無いものを無いと証明するのは悪魔の証明で不可能だ。
これは間違ってるのでつっこんでおく。ネット上ではこの勘違いがとても多いんだ。
たとえば、「最大の素数」が存在しないことは証明されている。あるいはアリバイというのは「犯行可能な時刻に、犯行可能な場所に存在しなかった証明」に他ならない。
その他諸々、非存在の証明なんて普通にある。
「悪魔の証明」というのは「非存在証明の方が手続きがめんどくさいんだから、存在を確信できる人がいるなら、その確信できる理由を挙げてもらった方が話が早い」という程度の意味だ。
0087名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:RA3uDiJA探索ってのはアロケートの空き領域探しの事?
そうなら断片化させまくったらメモリ確保の速度が低下する可能性が微レ存?
0088名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:+ZBVAlmgではこれでどう?
プロセスの優先順位の調整と、回数ごとの揺らぎが分かるように変更。
#include <Windows.h>
#include <stdio.h>
#include <vector>
#pragma comment (lib, "winmm.lib")
int main()
{
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
timeBeginPeriod(1);
int i,j,k;
for(i=0;i<10000;i++) malloc(1000);
for(k=0;k<10;k++)
{
DWORD t = timeGetTime();
for(j=0;j<10000;j++)
{
std::vector<void*> v;
for(i=0;i<10000;i++){ v.push_back(malloc(100));free(v[i]); }
}
printf("%d:%d\n",k,timeGetTime()-t);
}
return 0;
}
0089名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:+ZBVAlmgこれで環境ごとに結果が逆転するようなら、私の力量では測定用のコードは書けない。
mallocに無駄がなさ過ぎる。
・ダミーメモリ無し
0:5882
1:5639
2:5639
3:5643
4:5621
5:5619
6:5637
7:5628
8:5641
9:5637
・ダミーメモリ有り
0:5770
1:5746
2:5745
3:5736
4:5746
5:5738
6:5749
7:5749
8:5727
9:5731
0090名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:JMyzqe1Iソースはそのまま、リリース、最適化・全体の最適化ON
・ダミーメモリ無し
0:7833
1:7758
2:7827
3:7884
4:7803
5:7847
6:7854
7:7888
8:7839
9:7809
・ダミーメモリ有り
0:7503
1:7503
2:7500
3:7501
4:7501
5:7501
6:7501
7:7500
8:7502
9:7507
逆転する。が、メモリ確保したほうがえらい安定してる。
そうなると単純にキャッシュの問題ではないような気もする。
キャッシュから引いてるなら差は出ないはずだから。
0091名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:hkaGqM4NWindowsには解放されたメモリ領域をキャッシュする機能はあるって
新しくメモリを確保する時も、以前に同じサイズの領域を確保していたら、そいつとアドレスが入れ替わるとかよくある
reallocでサイズを変更した時は、メモリブロックを移動する必要がある時のみコピーが行われるんだって!常にコピーされるとみなしてコストを計算するのは誤り
お前のプログラムはメモリ確保だけで出来てるのかよw
上限の確実に分かるような配列のみreserve
上限が分からなくとも、頻繁に使う配列はメモリを解放せずサイズを0にして再利用
これで十分だろ気にしすぎ
0092名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:YlvB6n+hvectorに一度1000回push_backしたあとclearして
もう一度1000回push_backした時ってすでにメモリが確保されてるから速くなるんだよね?
じゃあゲームで
毎フレームclearしてからオブジェクトをpush_backしまくる設計でも
じきに負荷が軽くなってくんじゃないの?
0093名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:hkaGqM4Nうん
何処かに取っておけば解放されず消えない
0094名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:JMyzqe1Iごもっとも。俺としてはなんらかのキャッシュがあるというのが真実ならそれでOK。
>>92
なるよ。1000回push_backするとき実装によるが、たしか倍々でreallocするので
拡張できるときは>>91の言うようにコピーのコストはかからない。
最後に無駄なメモリを確保してしまうが、それ以外はreserveを最初にしたのと変わらないよ.。
ただし、push_backするのがintなどならいいが、内部でnewを伴うものを入れるときのコストは結構でかいので
ポインタで持つとか工夫が必要。
0095名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:JMyzqe1I>内部でnewを伴うものを入れるときのコストは結構でかい
ID:+ZBVAlmgに言わせると、誤差範囲なので気にするなと言うだろうw
多少の速度を犠牲にしてもコードの読みやすさを重視するなら選択の一つとしても別に悪くない。
俺の場合はオブジェクトプールを作って、newのオーバーロードで毎フレーム生成してる事が多い。
これなら可読性を損なわず高速化できるし、生newとの比較も簡単にできるしリーク検出にも使えるし
0096名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:YlvB6n+hたぶん
あと、クラスのコンストラクタで、シングルトンデザインの管理クラスに自身を登録するって設計は、他人からみてわかりやすい?
はたからみると
new CKurasu();
とだけ一行で収められててわかりにくかったりする?
0097名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:JMyzqe1Iコンストラクタまで見ないと何をやってるかわからないというのは、こう、ねぇ?
0098名前は開発中のものです。
2013/08/18(日) NY:AN:NY.ANID:RUTCCsLR使うのに中身見ないといけなくてしかもクラス間の依存性高かったら舌打ちするかもしれん
0099名前は開発中のものです。
2013/08/19(月) NY:AN:NY.ANID:QbLSnPSIそれもそうか
でもクラス間依存が少ないクラス設計ってどういうの?
テンプレート使うとか?
0100名前は開発中のものです。
2013/08/19(月) NY:AN:NY.ANID:O9c9TTghとりあえず相互参照とかfriendなければいいんでない
ひとつのクラス読み解くのに芋づる式に謎のクラスが出てくるとうんざりする
0101名前は開発中のものです。
2013/08/20(火) NY:AN:NY.ANID:RYMPR0Rz小機能の修正なのに多数のソースにまたがる変更を見せられたりして
気分が悪い
0102名前は開発中のものです。
2013/08/20(火) NY:AN:NY.ANID:nwPlQ7600103名前は開発中のものです。
2013/08/20(火) NY:AN:NY.ANID:t4onr7Y10104名前は開発中のものです。
2013/08/24(土) NY:AN:NY.ANID:wMH6siS/「あの座標に向かいたい!」ってなった時、どうしたらいいでしょうか?
うまくいかなくて困っています。
1.ワールド座標で、目的地 - 現在地でベクトルを取得する
2.現在の戦闘機の回転をそのベクトルに適用し、戦闘機から見た座標にする
3.座標を見てyが+だったらピッチアップして、yが-だったらピッチダウンするとかで、目標の方向に向く
4.後は適当に前進してれば目標に近づく
って感じなのですが、理屈が間違ってるのか、うまくいきません。
特に2番あたりで、思った通りのベクトルが出なくて・・・
0105名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:pdKwtLJh戦闘機の位置と回転を適用した「戦闘機ローカル座標系をワールド座標系に変換する行列」を用意して、
その逆行列で「ワールド座標系での目的地座標」をトランスフォームしてやれば、
「戦闘機ローカル座標系で見た目的地の座標」が得られる。
0106名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:wOoNNvxiワールド座標系の座標を戦闘機ローカル座標系に変換する行列とは違うものなのですか?
座標系っていうほど大層なものは用意してなくて、戦闘機の正面と右と上の軸しかもってないんですが・・・
0107名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:wOoNNvxi方向を画面に描画してみたら適当な所を指してるような・・・
0108名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:xVpT/5Kvatan2()で返ってくるラジアンを見て、いくつかのラジアンだけ特別な処理に回したい。
で、今のところあるラジアンと==チェックをしてるんだけど、やっぱりときどき誤差が出て==チェックがfalseになってしまうらしい。
すこし幅を持たせればいいと思うんだけど、こういう時の誤差ってどのくらい取ってる?
0109名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:YgD7yi63どのくらいってのはその時によるからあれだけど、そもそも1ラジアンって 180.0/PI だから少なくとも == で結ぶような判定はしないなww
なので幅持たせたかったら… 例えば 4倍くらいして切り捨てた値と比較とか?
この場合、円が90ステップで等分割されてる荒さでの比較になるけど。
0110名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:xVpT/5Kvconst double angle1 = atan2(35.0,69.0);
みたいにいくつかのラジアンを定数で持たせてるんだ。
たぶんいくら小数型に誤差が出ると言っても、atan2(35.0,69.0)自体はいつも同じ答えを出してくれるんだと思ってる。
でも、atan2(35.0*n,69.0*n)の場合はそうとも言いきれないらしい。
こういう場合、どのくらい幅を持って判定したら安心できるかなって。
0111名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:6EDsqIe00112名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:iRMPnQ6Nhttp://cppdiary.blog76.fc2.com/blog-entry-33.html
0113名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:WJdUU9CGまあ小数点以下四桁くらいで切っとけば問題なく動くんじゃない?
根拠はないけど
0114名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:6O/ZQu5dたとえば、その角度が
2Dのシューティングゲームで敵が弾を撃つ方向を表している
と仮定する
角度が1度(π/180ラジアン)ずれた2発の弾の方向の差は
100ドット弾が進んだあたりで1〜2ドット変わるぐらい
( sin(π/180) * 100 ≒ 1.745)
この精度が「荒すぎ」か「細かすぎ」かは、ゲームの仕様とか
作りたいものによって変わると思う
0115名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:xVpT/5Kv詳しい解説のサイトをありがとう。
ただ、私では理解できなかった・・・。
もうちょっとゆっくり調べてみる。
もっとこう、だいたいこのくらい幅取ればおk、みたいなのがあるかと思ってたら、そうでもないのね。
とりあえず、0.0000000001の幅を持たせて判定させてみた。今のところはうまく動いてる。
0116名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:wOoNNvxi0117名前は開発中のものです。
2013/08/25(日) NY:AN:NY.ANID:uNfr7MwE> もっとこう、だいたいこのくらい幅取ればおk、みたいなのがあるかと思ってたら、そうでもないのね。
あぁ?んなもんねぇよ
> とりあえず、0.0000000001の幅を持たせて判定させてみた。今のところはうまく動いてる。
じゃそれで良いだろ
0118名前は開発中のものです。
2013/08/26(月) NY:AN:NY.ANID:5A5RjECE0119名前は開発中のものです。
2013/08/26(月) NY:AN:NY.ANID:UoSBP/+o>>106
> 座標系っていうほど大層なものは用意してなくて、
> 戦闘機の正面と右と上の軸しかもってないんですが・・・
この3軸を表すベクトルが90度ずつの角度になっていて、
更に正規化されていれば
ローカル座標系としてそのまま変換行列にぶち込めるはず。
(2軸を正規化してから外積出せば良いと思うけど)
0120名前は開発中のものです。
2013/08/27(火) NY:AN:NY.ANID:cKzbC9XZint gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll( tmpKey ); // 全てのキーの入力状態を得る
for( int i=0; i<256; i++ ){
if( tmpKey[i] ==1 ){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
} else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
0121名前は開発中のものです。
2013/08/27(火) NY:AN:NY.ANID:s3+G3AjFhttp://msdn.microsoft.com/ja-jp/library/cc364674.aspx
0122名前は開発中のものです。
2013/08/27(火) NY:AN:NY.ANID:ayKx516Lの挙動って変わる?
false と true で変わったように見えんのだけども
0123名前は開発中のものです。
2013/08/28(水) NY:AN:NY.ANID:TJ9nn0/Qありがとうございます
もうちょっと聞きたいんですがDXライブラリスレに行くべき内容なので
そこで聞いてきます
0124名前は開発中のものです。
2013/08/29(木) NY:AN:NY.ANID:hPTXRtdt0125名前は開発中のものです。
2013/08/31(土) NY:AN:NY.ANID:zhbGtGaN0126名前は開発中のものです。
2013/08/31(土) NY:AN:NY.ANID:JzQWrW3K0127名前は開発中のものです。
2013/09/02(月) 15:07:32.19ID:YyXi6Lo9女だろ
0128名前は開発中のものです。
2013/09/02(月) 23:18:46.94ID:74coNmUxhttp://msdn.microsoft.com/ja-jp/library/ee416842(v=VS.85).aspx
0129名前は開発中のものです。
2013/09/07(土) 11:56:42.05ID:jTDeFVwh使ってねテヘみたいなやつが多いから、テクスチャ1枚用意するのも大変なんだけど
DXライブラリみたいな3D関数が用意されたOpenGLのライブラリってないのかな
0130名前は開発中のものです。
2013/09/07(土) 12:48:57.70ID:htv4gya2昔からあるSDLでもダメって話か?
てかテクスチャのローダなんてそんな大変だと思えないが
0131名前は開発中のものです。
2013/09/08(日) 11:57:30.99ID:gfgc7Fmm0132名前は開発中のものです。
2013/09/09(月) 17:00:18.03ID:xAOmQIfgSDLは、2Dですら画像を回転させようと思ったら
OpenGLの関数使って初期設定して、SDLのフォーマットで読み込んだ画像を
GLのテクスチャにフォーマットして、そのテクスチャを板ポリにUV座標指定して貼り付ける
ってところまでやらないとダメじゃない?
0133名前は開発中のものです。
2013/09/09(月) 17:02:10.36ID:BMj2DFdVwindows版だったらただのwin32apiのラッパーなんじゃないの
0134名前は開発中のものです。
2013/09/09(月) 17:13:28.09ID:/3fzHQ85使えるところは使うって設計思想と聞いたような。
0135名前は開発中のものです。
2013/09/09(月) 19:54:26.62ID:xAOmQIfgライブラリのソースコードはマルチプラットフォーム対応するように書かれてるぜ
windows版ってやつはソースをwin用コンパイラでコンパイルして.dllのバイナリとして配布してるって意味だと思われ
>>134
ソース見てみると、一番最初に呼び出されるヘッダ部分で環境変数取得して、それからOSなどを判断して
defineマクロ駆使してそれぞれのmain()を書いてるっぽい(windowsならWinMain()が書かれてる)
ちなみにこの時点でDirectXが使えるならOpenGL使わずにそっちを使うようになるらしい、すごいぜ
0136名前は開発中のものです。
2013/09/09(月) 23:41:39.27ID:L4c5eGnj0137名前は開発中のものです。
2013/09/10(火) 10:03:39.55ID:qOJwyK2zあの上にライブラリ構築したら移植しやすいよっていう土台
だから色々なライブラリがあって、回転のやつとか定番のがあった
ハードウェア支援はあるぞ
0138名前は開発中のものです。
2013/09/10(火) 13:25:05.04ID://nCPrx/みんなはどうしてんの?
0139名前は開発中のものです。
2013/09/10(火) 15:38:00.17ID:IuaaT7AR0140名前は開発中のものです。
2013/09/10(火) 15:39:41.68ID:gIhnnlB1フレームワークのソースを見たり
0141名前は開発中のものです。
2013/09/10(火) 15:56:42.08ID:PbAq3+L00142名前は開発中のものです。
2013/09/10(火) 21:27:09.56ID:V2/hDCSO■ このスレッドは過去ログ倉庫に格納されています