ゲームプログラムなら ..
49:デフォルトの名無しさん
09/01/14 15:49:17
MMORPGのサーバーにするつもりなんじゃないの。
50:デフォルトの名無しさん
09/01/14 17:24:39
>>49
よく見たらサーバーだった・・・orz
よし、じゃぁ責任とってMMORPG作るぞ
ということでWiki作ってきた
URLリンク(www19.atwiki.jp)
51:デフォルトの名無しさん
09/01/14 17:52:13
おいおい、ゲームサーバをWinXPで運用するのか?
52:デフォルトの名無しさん
09/01/14 18:06:12
デーモンつってるし、XPはクライアント環境なんじゃないかな?
53:デフォルトの名無しさん
09/01/14 18:16:44
だったら、要件定義はサーバとクライアントに分けて行なおう。
54:ワカメ
09/01/14 23:48:51
>>44さん Sleep(1)入れないとどうしてもCPU使用率99%になってしまいます。
(´・ω・`)何だか怪しいというので、コードうpします。
確かにじしんがありません。
#define FRAM (1000/120)
UpdateWindow(hWnd);
//////リアルタイム処理
timeBeginPeriod(1);
DWORD dwTime=timeGetTime()+FRAM;
while(TRUE)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
TranslateMessage(&msg);
DispatchMessage(&msg);
}else{
if(dwTime>timeGetTime()){
Sleep(1);
continue;
}
dwTime=timeGetTime()+FRAM;
wait=wait+1;
if(wait>=調整具合){
(キー処理);wait=0;
}
(画面クリア)+(いろんな条件+描画系)+(バック画面切り替え)
if(endkey==1){DestroyWindow(hWnd);break;}
}
}
timeEndPeriod(1);
return msg.wParam;
まだ、コード生成中で、DrawText を使わない方法ためしてません。
55:デフォルトの名無しさん
09/01/15 00:12:14
PeekMessage回してたら100%になるに決まってるだろ
56:デフォルトの名無しさん
09/01/15 02:04:45
>>54
正直言うと、ここ数年ゲーム作ってないんでアレだけど、
ちょっかいかけてしまった手前いくつか。ループ部分だけね。
while(TRUE)
{
if(PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) //(1)
{
if(!GetMessage(&msg, NULL, 0, 0)){break;} //(2)
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
if(dwTime > timeGetTime()){continue;}
dwTime += FRAM; //(3)
//内部処理
if(dwTime < timeGetTime()) //(4)
{
//描画処理
}
}
}
改行多すぎた↓
57:デフォルトの名無しさん
09/01/15 02:05:30
(1) PM_REMOVEは重い。先ずはPM_NOREMOVEで有無だけチェックする。
(2) 元のコードは終了処理が無茶苦茶。ループはここで抜けること。
DestroyWindow→WM_DESTORYを貰う→PostQuitMessage→WM_QUITをGetMessageという流れ。
DestroyWindow(hWnd);break;ではWM_DESTROYすら処理されない。
(3) 今のフレーム+1フレームの時間=次のフレーム。
timeGetTime()+FRAMでは、1フレームに時間が掛かれば掛かるほど次のフレームが遅くなる。
(4) 次のフレームまで、まだ時間がある時だけ描画する。
内部処理に1フレーム時間以上掛かる場合、描画しなくなるが普通問題ないと思う。
心配ならそれ用の判定もつける。
こんな感じでいくらか改善するかと。
CPU99%はよく分からないな。少なくとも自分のプログラムではならない。
間違いがあったらごめんね。
58:デフォルトの名無しさん
09/01/15 02:40:16
アイドル処理を使う場合、暇になったらCPUを解放するのは当然
そのへんの基本的なことも分かってないやつがCPU100%使用するコードを平気で書く
59:デフォルトの名無しさん
09/01/15 03:38:45
CPUの問題をどう解決していたか思い出せないんで昔のコード探したんだが見付からない。
けど、ぐぐってみるとSleep使うって案が大半だった。
もしかしたら自分もSleep使っていたのかもしれない。うそ教えてごめんね。
if(dwTime > timeGetTime()){continue;}
は、元通り
if(dwTime > timeGetTime()){Sleep(1);continue;}
にしてみて。
60:デフォルトの名無しさん
09/01/15 07:42:44
解放するのが目的なら、Sleep(0)でいいんでね?
61:デフォルトの名無しさん
09/01/15 12:36:50
Sleep(0)だとCPU使用率を下げにくいから(1)にしてるんじゃね?
62:デフォルトの名無しさん
09/01/15 23:48:47
見掛けだけCPU使用率が下がっても意味ないんじゃね?
63:デフォルトの名無しさん
09/01/16 00:03:43
>>61
精度高くないから、0のがオヌヌメ
64:デフォルトの名無しさん
09/01/16 02:15:01
1ms って、けっこう凄い時間だよな
65:ワカメ
09/01/16 21:07:43
(´・ω・`)みなさんご意見ありがとう。まだ時間なくて、NO DrawText やって
ない。今日には完成させたい。とりあえず、ファミコン見たく、使う文字だけを、
マップチップのように使うことにした。
コードの件だけど、Sleep(0) もSleep(1)もあまり変わらなかった。Sleep(1)のほうが
やはりCPU使用率が普通になる。56>>さん DestroyWindow(hWnd);break 実は
ここでコールバックで、DirectX 解放させてました。
66:デフォルトの名無しさん
09/01/17 03:03:15
Window 作った後のゲームループだけで 70 行とかコード書いてるわ。(空行含むけど)
67:ワカメ
09/01/18 14:26:51
(´・ω・`)みなさんの暖かいご支援により、ついに完成したでござるよ。
え〜ととりあえず。まとめてみます。↓
文字表示は、40>>41>>さんの言うとおり、DrawTextは遅いので使わない、描画クラス、
または、表示用関数で絵として描く。Celeron 550Mhzでも高速に表示できました。
メインループにつきましては、ググリまして特に問題ないようです。
TranslateMessage(&msg);も場合によっては不要のようです。
PM_NOREMOVEは、軽いが、画面移動できず。フルスクリーンオンリーには、やくにたちます。
PM_REMOVEは、画面移動できるようになります。
とりあえず、この処理を取り入れたデモソフトができたので、Upしようと思いますが。
不要ですか?ほしい人がいたら書きます。
内容:2D背景スクロール理論&NO DrawTextで文字表示&キャラジャンプ理論&敵の移動
キャラクタを操る、基本的な2Dゲームのテスト
68:デフォルトの名無しさん
09/01/18 22:02:56
くれくれ
今更だがアンカーは>>数字の形にしてくれないか
追いにくいんだが
69:ワカメ
09/01/18 23:56:39
URLリンク(a-draw.com)
音、画像等、あれですから、怒られないように、ちょいいじりました。
←:左移動 →:右移動 SPACEKEY:ジャンプ ESC:終了
Celeron 550MHZ以上 DirectX 8.0 VC++ 6.0
単純なデモテストなんで、ソースコード入れてません。 (´・ω・`)
70:デフォルトの名無しさん
09/01/19 00:09:19
PSP向けのソフトの習作なのかな。
こんなけできてればあとはゲーム作るだけだね。
71:デフォルトの名無しさん
09/01/19 00:18:07
>PM_NOREMOVEは、軽いが、画面移動できず。フルスクリーンオンリーには、やくにたちます。
ってどういう意味?
72:ワカメ
09/01/19 00:22:05
>>70 さん実は、もっと速度早く効率的になるんですが、後ろの背景は、時間がかかる
ので、余計な処理をはぶいてます。(´・ω・`) 早く面白いゲーム作りたいですね、
しかし、それにしても、参考書とか買っても、多分これだけだと、挫折してたと思う、
今ネットとかで、調べられるけど、本だけだとどれも、重要な事が抜けてる。
73:ワカメ
09/01/19 00:32:43
>>71 さん、PM_NOREMOVEにしたら、ウィンドウをドラッグ&ドロップすること
できませんでしたが、ちょい処理がスムーズな感じがします。なので、
フルスクリーンオンリーでやるなら、ドラッグ&ドロップすることないから、良いのかと、
でも中にはフルスクリーン切り替えのできない機種もあるので、ちょっと・・
(´・ω・`)わすのサブPC SOTEC E-ONEがそれ、まじでウンコたん。しかもスケルトン。
74:デフォルトの名無しさん
09/01/19 00:43:51
>>73
そんな話聞いたことないな・・・
ちゃんとPM_NOREMOVEでチェックしたあとGetMessageなりPM_REMOVEしている?
75:ワカメ
09/01/19 01:25:25
>>74 (´・ω・`)そっか、GetMessageやってなかったかも、わからなくなって
きた、でもどちらがいいのだろう、どこもこの問題がでてる、
PM_NOREMOVE VS PM_REMOVE どちらが早い?だれかおすえて。
76:デフォルトの名無しさん
09/01/19 01:38:31
>>75
普通にベンチマークとってみてくれ
それで俺にも教えてくれ
77:ワカメ
09/01/19 01:42:56
URLリンク(wisdom.sakura.ne.jp)
ここに、くわしく載ってました、(´・ω・`)
つまりリアルタイム処理は、PM_REMOVE メッセージを使う処理WM_PAINT
WM_KEYDOWN その他など、PM_NOREMOVE でOK?
78:ワカメ
09/01/19 01:44:52
>>76 さんいろいろ実験してみます、(´ω`)でも眠いので明日にするで
ござる。
79:デフォルトの名無しさん
09/01/19 02:28:03
ソースさらせばみんなにたたいてもらえるよ。
80:ワカメ
09/01/19 20:20:53
(´・ω・`) こににちは、あれからいろいろ実験したが、どっちも同じ感じ、
またそれ相当のベンチソフト見つからない、前に進めないんで、このままソフト
作りに入ります。
81:デフォルトの名無しさん
09/01/19 23:01:43
ソースなしって、ゲ製でやれよ、そんなの。
ム板ならむしろバイナリ無しのプロジェクト一式だろう。
それと参考書どうこう言ってたが、ちょっとした分野なら、一冊で全て分かるなんてないから。
書籍もWebの記事も沢山読んで沢山勉強してくれ。
まあ頑張れ。
82:デフォルトの名無しさん
09/01/19 23:34:32
題材レリクスって・・・いいオッサンだな
83:デフォルトの名無しさん
09/01/20 03:13:47
>>1
新卒でゲーム会社狙ってんだけど、
C++の基本書の他には何を読めばいいかな?
84:デフォルトの名無しさん
09/01/20 03:45:55
>>83
「ゲームプログラマーになる前に覚えておきたい技術」は業界の間でも割りと好評。
あと「実例で学ぶゲームAI」
85:デフォルトの名無しさん
09/01/20 04:02:54
このスレってなんでゲ製作板じゃなくてここに立ってるの?
86:デフォルトの名無しさん
09/01/20 04:23:30
ゲ製作技術はスレ建てするにはまとめサイト先に作る事が前提とかなんとかいう制限が
87:デフォルトの名無しさん
09/01/20 06:01:31
>>84
サンクス
姉妹書の「実例で学ぶ数学3D」に異常に惹かれた
88:デフォルトの名無しさん
09/01/20 19:19:30
>>87
それ買うなら
ゲームプログラミングのための3Dグラフィックス数学
のほうがいいと思うぞ
89:デフォルトの名無しさん
09/01/20 21:30:40
「ゲームプログラマーになる前に覚えておきたい技術」 を読む際には
C++ の入門書も持っておいた方がいいよ。
というか、今、この本かなり品薄なんだよな・・・。
90:デフォルトの名無しさん
09/01/20 21:46:22
>>88
なぜ?
91:デフォルトの名無しさん
09/01/20 22:17:08
「ゲームプログラマーになる前に覚えておきたい技術」は買ったけど、
タイトル通り、プログラムを作る前段階の基礎知識をおさえるための本だね。
セガの人が書いたから、もっとリアルな話があるかと思ったけど、
ものすごく基礎的、かつ、抽象的なところに終始してる。
(まあ、守秘義務とかあるだろうから、書けなかったのかもしれないけど)
新人とかの集合教育をやれば分かるけど、プログラム作成の経験者も
いれば、スタート地点にすら立ってないレベルとかもいる。
最低限のレベルを揃えるためには、いい本だと思う。
92:デフォルトの名無しさん
09/01/29 09:18:31
>>91
>(まあ、守秘義務とかあるだろうから、書けなかったのかもしれないけど)
本人の日記や講演の記事をみたら守秘義務云々以前の問題なんじゃね?と思ってしまう
93:デフォルトの名無しさん
09/01/29 23:01:00
新人教育に使うために作ったような本だからね
94:デフォルトの名無しさん
09/01/30 00:21:23
>83
まぁ、ゲーム関係のプログラミング知識はあるに越したことがないんだけど、
大学での研究とかベーシックな内容を問われることも多いから、今まで何やってきたかとかのほうが重要になるかもな。
あの本は就職が内定してからでも遅くはない。
95:デフォルトの名無しさん
09/01/30 23:17:23
元ネタ◆URLリンク(jp.youtube.com)
僧侶版◆URLリンク(jp.youtube.com)
元ネタ◆URLリンク(jp.youtube.com)
僧侶版◆URLリンク(jp.youtube.com)
96:デフォルトの名無しさん
09/01/31 23:43:00
if(diks[DIK_UP] & 0x80) {
m_dir = FOR;
Sleep(500);
}
DirectInputでキーボードから入力値を取得しています
Sleep()を抜くととてつもない速さでカーソルが移動してしまいます
Sleep()を使うとほかの処理も止まってしまうので
他の処理をとめないで同じようなことできる方法ありませんか?
97:デフォルトの名無しさん
09/02/01 02:02:18
キーがOFFの状態からONの状態になったときのみ押された処理をする。
98:デフォルトの名無しさん
09/02/01 11:53:26
毎フレーム入力を取る場合、少なくとも前フレームの押下情報をとって置かないと
押されたのか(OFF→ON)
離されたのか(ON→OFF)
押しっぱなしなのか(ON→ON)
押されてないのか(OFF→OFF)
の判断ができないよ
99:デフォルトの名無しさん
09/02/02 16:31:42
エッジトリガの割込みで処理すればおk
100:デフォルトの名無しさん
09/02/21 07:47:03
セガの新人教育カリキュラムから生まれたゲームプログラミングの解説書
ゲームプログラマになる前に覚えておきたい技術
URLリンク(www.shuwasystem.co.jp)
101:デフォルトの名無しさん
09/02/21 11:11:08
マルチすんな
102:デフォルトの名無しさん
09/03/08 23:51:53
プログラムの基礎を覚えるゲームならこれなんかどう?
URLリンク(www.geocities.jp)
ただしウォーズマンを知っている人に限るw
103:デフォルトの名無しさん
09/03/20 03:28:05
ゲーム開発時の映像表示ライブラリは何使ってる?
104:デフォルトの名無しさん
09/03/20 04:03:13
WINならDirectXかXNAかOpenGLしかねーだろ。
105:デフォルトの名無しさん
09/03/20 05:42:59
WPFもあんだろ
106:デフォルトの名無しさん
09/03/23 13:11:53
むかし、VB で GDI でマリオカートっぽいのがあって
それがけっこう面白くて
なんだかいろいろ負けた感をあじわったことがあるw
107:デフォルトの名無しさん
09/03/29 04:28:43
ゲームプログラマーのコミュニティってなんかない?
108:デフォルトの名無しさん
09/03/29 04:41:59
ゲームプログラマの人に聞きたい 34問目
スレリンク(prog板)
109:デフォルトの名無しさん
09/04/14 14:01:49
ここをそのコミュニティにしようぜ!
まずは盛り上げていくことが重要だ。
ということで>>107は燃料投下よろしく。
110:デフォルトの名無しさん
09/04/14 16:14:12
おまいが燃料投下しろよ
111:デフォルトの名無しさん
09/04/14 17:50:51
いやいや、おれが・・・
112:デフォルトの名無しさん
09/04/14 23:45:27
尊敬するゲームプログラマーを上げよ
113:デフォルトの名無しさん
09/04/15 00:04:07
遠藤!
114:デフォルトの名無しさん
09/04/15 07:19:35
木屋!
115:デフォルトの名無しさん
09/04/15 10:06:36
内藤
116:デフォルトの名無しさん
09/04/15 11:12:10
時浩
117:デフォルトの名無しさん
09/04/15 12:13:13
スピンドリル
118:デフォルトの名無しさん
09/04/15 14:57:50
ピーター・モリニュー
119:デフォルトの名無しさん
09/04/17 21:06:07
堤さやか
120:デフォルトの名無しさん
09/04/17 22:45:44
>>1
エロゲって開発で、どんな言語使ってるの?
各メーカーで操作性が似ているのは、
専用のスクリプトを使っていると聞いたことはあるけど。
121:デフォルトの名無しさん
09/04/20 14:54:56
ベースはC/C++、スクリプト言語はメーカーによりオリジナルの適当な奴。
122:デフォルトの名無しさん
09/04/20 15:21:16
エロゲならパイソンのような低速言語でも十分だな
123:デフォルトの名無しさん
09/04/20 17:16:45
まっとうなスクリプト言語でエロゲつくってどうすんだよ。
紙芝居つくるならプログラミングさせちゃ生産性わるくなるだろwww
124:デフォルトの名無しさん
09/04/20 17:54:37
当然、スクリプト言語で紙芝居言語を作るんだろ。
125:デフォルトの名無しさん
09/04/20 22:54:59
ばかばっかw
126:デフォルトの名無しさん
09/04/25 01:57:42
まあ、悪くない発送ではある。
127:デフォルトの名無しさん
09/04/25 10:39:48
吉里吉里なんかまさにそうだしな
128:デフォルトの名無しさん
09/04/27 19:47:04
URLリンク(www6.atpages.jp)
ブロック崩しを作ってみたんだが、ボールがラケットやブロックをすり抜けることが時々ある。
どこかおかしなところがあるのか教えてほしい。
129:デフォルトの名無しさん
09/04/27 19:50:16
玉とラケットのベクトルを、2元連立一次方程式を解けば交点がでるよ。
その交点で反射させるように書き直せば絶対すり抜けん。
130:デフォルトの名無しさん
09/04/27 20:50:58
>>129
言ってることがよくわからんが、
y=-x
y=(ラケットの座標)
を解けばOKということ?
131:デフォルトの名無しさん
09/04/27 23:02:03
続きはWebで!
132:デフォルトの名無しさん
09/04/28 00:06:32
マリオみたいなアクションゲームが作れる言語教えてくれ
133:デフォルトの名無しさん
09/04/28 00:53:22
ほとんどの言語で作れますよ。
134:デフォルトの名無しさん
09/04/28 07:51:11
>>128
>>if(rx < ballx + (ball_sizex / 2 ) && ballx + (ball_sizex / 2 ) < rx + r_sizex)
対称じゃないのはおかしくない?
●
[racket] これは当たる
●
[racket] これは当たらない
135:デフォルトの名無しさん
09/04/28 09:19:32
>134が何を言いたいのかは分からないが、ball側の条件判定が右端のみで行なわれているように見えるのはおかしいと思う。
136:デフォルトの名無しさん
09/04/28 14:37:09
その一行見た限りだとrxとballxはそれぞれスプライトの左端の座標だと思う
137:デフォルトの名無しさん
09/04/28 15:35:34
とりあえずこうじゃねえのか
経験的にelseが続くif文はクソ
if(ballx < 0)
{
ballx = 0;
speedx = -speedx;
}else if(ballx > 256){
ballx = 256;
speedx = -speedx;
};
if(bally < 0){
bally = 0;
speedy = -speedy;
}else if(bally > 256 - r_sizey){
if(rx <= ballx + (ball_sizex / 2 ) && ballx - (ball_sizex / 2 ) < rx + r_sizex)
{
bally = 256 - r_sizey - ball_sizey;
speedy = -speedy;
}else{
alert("ゲームオーバー");
return;
}
};
138:デフォルトの名無しさん
09/04/28 19:38:45
>>137
それだとボールの左端とラケットの右はじの座標が重なった時もヒットしたと判定されない?
139:デフォルトの名無しさん
09/04/28 22:10:54
経験的にインデントしないヤツはクソ
140:デフォルトの名無しさん
09/04/28 23:53:42
あらゆる可能性を検討しない奴はプログラマに向いてない
141:デフォルトの名無しさん
09/04/29 01:36:39
>>140
あらゆる可能性を検討できる人はすなわち神。
普通はできないので正常系以外はすべて例外として組めばよかろう。
142:デフォルトの名無しさん
09/04/29 01:39:19
検討するだけして、その結果がアレなんじゃないの?
ちなみにあらゆる可能性を検討する奴もプログラマに向いてない。
143:デフォルトの名無しさん
09/04/29 01:43:32
枝葉にこだわるお前が向いてない
144:デフォルトの名無しさん
09/04/29 06:22:41
>>139
それは2chのシステムに文句言えよw
145:デフォルトの名無しさん
09/04/29 08:24:48
HTMLだろ
146:デフォルトの名無しさん
09/04/29 08:49:04
>>144
2chのシステムとインデントしないことに何か関係があるのか?
147:デフォルトの名無しさん
09/04/29 09:51:29
あほすぎる
148:デフォルトの名無しさん
09/04/29 09:53:58
>>146
お前のきれいにインデントされたプログラムをあげてみろ、わかるから
149:デフォルトの名無しさん
09/04/29 10:09:02
>>137はわざわざ消してるように見えるけどな
タブ
空白
>>149 ソース見なくても専ブラでポップアップさせれば見える。
150:デフォルトの名無しさん
09/04/29 11:32:33
とりあえず、遊べるレベルまでなおしたよ
URLリンク(www.csync.net)
diffとれないんで、変更点は適当に
・parse_map()の中
・MoveBall()の中身全般
・keydownのfunction()の中
>>138
わりい意味わかんね
>>149
わざわざ消したった。俺のブラウザじゃみえねーから
151:デフォルトの名無しさん
09/05/01 19:28:45
スペースは に置換すればインデントできるよ。
つか、インデントされたコードって書き込みされてるじゃん。
152:デフォルトの名無しさん
09/05/01 19:30:46
ミスした だ。
153:デフォルトの名無しさん
09/05/02 01:24:36
テスト
テスト
テスト
154:デフォルトの名無しさん
09/05/08 07:18:15
C++とDXライブラリを使い方、全100ステージのアクションゲームを作りました。
ソースは一からきちんと書いていきました。
来週発表があるのですが、胸を張って「一から作りました」なんて言っても大丈夫でしょうか?
仮にもDXライブラリを利用したので、完全自作とまで言えないような気がします。
スレ違いでしたら申し訳ありません
155:デフォルトの名無しさん
09/05/08 09:02:52
「DXライブラリを使い、一から作りました」と言えば宜しい。
156:デフォルトの名無しさん
09/05/08 09:54:58
おそらくどこのゲーム開発でも既存のライブラリか、
あるいは社内で独自に開発するかして、何らかのライブラリを使ってるだろうしな
155でおk
157:デフォルトの名無しさん
09/05/08 10:59:40
>>155ー156
ありがとうございました
158:デフォルトの名無しさん
09/05/08 13:20:45
1からって言葉にこだわる必要がそもそも無いんじゃないの?
ビクビクしてまで1からって言いたいの?
159:デフォルトの名無しさん
09/05/08 13:47:42
>社内で独自に開発
これは「一から作りました」に当たるんじゃないか
160:デフォルトの名無しさん
09/05/08 14:30:22
>>154
ステージ100まで作ったならそれはそれで大きい売りだな。
時間が許せば、調整なんかをしっかりやりたいところだけど、まぁそこまではいいか。
可能であればアドバタイズをしっかり作ったり、2D系の見栄えよくしておくと印象がよかったりする。
161:デフォルトの名無しさん
09/05/08 19:13:21
つーか誰に発表するのか、どんな100ステージのアクションかも分からずに
よく語れるなお前ら
162:デフォルトの名無しさん
09/05/08 19:24:41
いや、なんとなく新卒の就職活動用ゲームかと。
時期が時期だしな。
163:デフォルトの名無しさん
09/05/08 21:17:05
別にそこはなんら重要なポイントではないしなぁ
タダゲー厨乙ってやつ?
164:デフォルトの名無しさん
09/05/08 23:09:18
アドバタイズって一般用語だっけ?
165:デフォルトの名無しさん
09/05/09 03:04:58
URLリンク(www.google.com)
他社は知らんが、これ見る限りでは一般的じゃねーの?
166:デフォルトの名無しさん
09/05/10 08:06:31
昔からの疑問に思ってる素人な質問なんだが、
シューティングゲームとかで、複数のキャラが同時に動くのって、
どうやってるの?1キャラ毎に別スレッドになってて動かしてるの?
167:デフォルトの名無しさん
09/05/10 08:18:05
>>166
描画する前の移動の処理で全部動かせばいいじゃない
168:デフォルトの名無しさん
09/05/10 09:03:02
画面ってのはスタティックに表示されてるわけじゃなくて、
スキャンレート(30枚/秒とか)で表示されてるわけだから、
その合間にやった処理のぶんは同時に動く。
169:デフォルトの名無しさん
09/05/10 09:09:00
ゲームのデザインパターンの一つにタスクシステムと言うのがあってな〜
170:デフォルトの名無しさん
09/05/10 09:12:17
タスクシステムの話はゲーム製作技術板のタスクシステムスレで。
171:デフォルトの名無しさん
09/05/10 09:16:29
あそこは、素人が紛れ込むと、ズタボロにされるぞw
172:デフォルトの名無しさん
09/05/10 10:02:18
タスクシステム厨の隔離スレだからな
173:デフォルトの名無しさん
09/05/11 10:12:22
タスクシステムって、関数へのポインタが詰まったリスト構造だべ?
174:デフォルトの名無しさん
09/05/11 13:27:12
一番単純なのはそんな感じ
175:デフォルトの名無しさん
09/05/11 22:44:42
で複雑にしてデバッグ不可能になると
176:デフォルトの名無しさん
09/05/12 12:15:33
お前じゃ無理かもナw
177:デフォルトの名無しさん
09/05/12 12:21:24
お決まりのやりとりが始まったな。
早くこっち↓に移動してくれ。
スレリンク(gamedev板)
178:デフォルトの名無しさん
09/05/12 18:09:38
ロスブラみたいに広大なマップ走り回るのって、マッブポリゴンの管理どうやってんの?
あのポリゴン数だったら一気に読み込むのも描画するのもきついだろ。
キャラと同じで遠方はローポリかな。
179:デフォルトの名無しさん
09/05/12 22:54:08
ロスブラって何よ
180:デフォルトの名無しさん
09/05/13 03:03:47
どうやんのも何もないだろw
181:デフォルトの名無しさん
09/05/13 03:19:02
>>178
LOD とキャッシュだよ。
182:デフォルトの名無しさん
09/05/13 03:30:51
キャッシュ?
183:デフォルトの名無しさん
09/05/13 09:33:43
あれだけハイスペックなPC要求するんだから特に小細工ないんじゃないの
184:デフォルトの名無しさん
09/05/13 11:28:44
なんだよ小細工って
185:デフォルトの名無しさん
09/05/13 12:53:26
動的LODじゃなくてミップマップみたいに事前に用意しておくタイプだよね?
186:デフォルトの名無しさん
09/05/13 22:56:42
おまえらレスに重みなさっすぎw
187:デフォルトの名無しさん
09/05/14 19:19:33
洋ゲーでそのへんのインタビューがあったハズだが、 spin てもう無くなったのか。
188:デフォルトの名無しさん
09/05/15 18:36:01
>>178
遠方ローポリってことはあのマップが分割されまくってるってこと?
189:デフォルトの名無しさん
09/05/15 19:40:22
おまえはここになにしにきてんの?
190:デフォルトの名無しさん
09/05/17 16:13:39
唐突だが、何歳まで現役プログラマーで仕事できると思う?
海外なんかはけっこういい年までというか生涯現役みたいなプログラマーが多いが、日本では少なくとも他業種で40ぐらいのプログラマーは割りと少ないように見える。
ゲーム業界の仕事スタイルは比較的欧米に近いスタイルだと思うのだが、実際何歳ぐらいまで現役としてやってるのかなー?
知ってる範囲では40ぐらいまでしかいないんだが。
・・・というか、会社そのものにそれ以上の年齢の人がいないので、正直わからんのがホンネ
191:デフォルトの名無しさん
09/05/17 16:22:19
大きい企業は管理職にされちゃうからいないだけ。
中小にはそれなりに50近いひととか普通にいますよ。
192:デフォルトの名無しさん
09/05/17 16:38:16
現場で若手に抜かれたら基本終わり。
特殊技能を持ってるか年下の指示でも仕事として一定品質出せれば残留の可能性はあり。
俺は下が育ってないから強制現役w
193:デフォルトの名無しさん
09/05/17 16:44:13
管理職飽きたー
会社作って現場に出たいわ・・・
194:デフォルトの名無しさん
09/05/17 19:51:31
>>190
25名くらいのゲームではない中小だが、
俺の右隣りの席のお方は、60近いな。
386BSDの頃に鳴らしたという。
今の上長も現役で、掛け持ちで3つのプロジェクトの
リーダやってる50過ぎの人だね。
さて、うちの会社は定年あったんだろうか?
両者とも役員兼任のためよくわかんねw
195:デフォルトの名無しさん
09/05/17 20:20:59
特別に役員の定年制を決めないと。
普通の定年制は役員には当てはまらない。
196:デフォルトの名無しさん
09/05/17 20:53:45
>>195
そうなんだよね。
50代以上は、4人くらいいるかな
役員じゃない人は一人いたような。
197:デフォルトの名無しさん
09/05/18 09:23:47
ゲームプログラマの人に聞きたい 35問目
スレリンク(prog板)l50
マの話はマの板で。
198:デフォルトの名無しさん
09/05/22 07:46:08
シューティングゲームの処理速度アップのための
計算の簡素化とかはここで聞いてOKですかね?
199:デフォルトの名無しさん
09/05/22 09:55:57
テーブル参照にしても変わらんぞ
精度が落ちるだけでほとんど意味無い
素直に三角関数使え
200:デフォルトの名無しさん
09/05/22 10:42:48
まあまず手を入れる前にプロファイルとるところからだな。
201:デフォルトの名無しさん
09/05/22 11:10:59
atan系関数を使わず、自機と敵の角度を求める方向はありますでしょうか?
202:201
09/05/22 11:12:02
方向じゃなく方法でした。
203:デフォルトの名無しさん
09/05/22 11:41:00
あるよ、荒ければatanより早い場合があるけど、
細かく調べると断然遅い。
昔のアクションゲーム(10年以上前)はatanは使わずにやってたよ。
204:201
09/05/22 11:52:37
>>203
そうなんですか。
軌道変更に関しては別方法があるのは知ってるんですが
問題は画像の回転処理のためにどうしても角度が必要でして・・・
205:デフォルトの名無しさん
09/05/22 12:17:26
なんでatanじゃ駄目なんだ?
206:201
09/05/22 12:29:26
>>205
駄目というわけではないんですが、別の方法で軽くできるならと思いまして
低速移動の弾幕系のゲームなので結構切り詰めないと厳しいんですよね
207:デフォルトの名無しさん
09/05/22 12:39:38
なんですぐバレるような嘘つくかなぁ。
これでも使ってろよ。
int GetDir(int srcx, int srcy, int dstx, int dsty) {
int absx = abs(dstx - srcx);
int absy = abs(dsty - srcy);
return (dstx == srcx) ?
(dsty > srcy) ? 0 : 180
: (dsty == srcy) ?
(dstx > srcx) ? 90 : 270
: (dstx > srcx) ?
(dsty > srcy) ? 90 * absx / (absx + absy) : 180 - (90 * absx / (absx + absy))
: (dsty > srcy) ? 360 - (90 * absx / (absx + absy)) : k = (90 * absx / (absx + absy)) + 180;
}
208:デフォルトの名無しさん
09/05/22 12:42:06
一箇所誤りがあったので訂正
int GetDir(int srcx, int srcy, int dstx, int dsty) {
int absx = abs(dstx - srcx);
int absy = abs(dsty - srcy);
return (dstx == srcx) ?
(dsty > srcy) ? 0 : 180
: (dsty == srcy) ?
(dstx > srcx) ? 90 : 270
: (dstx > srcx) ?
(dsty > srcy) ? 90 * absx / (absx + absy) : 180 - (90 * absx / (absx + absy))
: (dsty > srcy) ? 360 - (90 * absx / (absx + absy)) : (90 * absx / (absx + absy)) + 180;
}
209:201
09/05/22 12:44:23
>>207
嘘はついてないですってw
某ゲーム機の自作アプリなんでハードウェアの性能の上限が決まってるので
あれこれ工夫しないと厳しいんです。
210:デフォルトの名無しさん
09/05/22 12:44:24
コスト高そうだな
211:デフォルトの名無しさん
09/05/22 12:49:33
>>209
PSPはnewlibのatan2で問題ない
DSならテーブル参照版ATAN2を作れ
212:デフォルトの名無しさん
09/05/22 12:51:33
改善する意味があるほど atan が遅いということは、計測して確かめたの?
言語は何?
毎フレームじゃなく、生成時と、その後4フレームおきとかにすると計算量が 1/4 になるかもよ。
方角が右回りか左回りかで十分なら(九十度回転させて)内積が使えるかもね。
ゲーム機なら精度はx/1000程度で十分だから自前でテイラー展開するとよい。
回転機能にラジアンを渡すなら atan だが、行列を渡すなら正規化するだけで sin, cos が出るのでこちらを使う。
つーか情報小出しにしすぎだろ。
213:201
09/05/22 12:52:12
>>211
なるほど
じゃあ後はホーミング弾の画像を回転処理しなくても辻褄があう
単なる○とかにするしかないんですねえ。
そうすれば画像を回転させるためのatanなくなりますんで
214:201
09/05/22 12:54:41
>>212
>毎フレームじゃなく、生成時と、その後4フレームおきとかにすると計算量が 1/4 になるかもよ。
これはすでにやってます。
60fpsなんで演出上もなんとかごまかせる範囲でホーミングしてくれてます。
>回転機能にラジアンを渡すなら atan だが、
この辺は土台として某所で最近使われだしたDXライブラリのPSP版を使ってるので
どうしてもラジアンである必要があるんですよね。
ライブラリ上で動くのでチューニングしにくいのもあるんですけどね。
215:デフォルトの名無しさん
09/05/22 12:59:57
>>210
いまどき携帯ゲーム機ですらプリフェッチを備えているのに分岐しまくりだしねぇ
もしDSだったら、除算命令が無いので更にコスト増
216:デフォルトの名無しさん
09/05/22 13:00:51
>>213
atan2で問題ないっつってんのになんでそうなるんだよ
テーブルの作り方知らないの?
217:デフォルトの名無しさん
09/05/22 13:03:12
また東方厨かよ・・・
218:201
09/05/22 13:05:38
>>216
atan2で問題ないということは現状以上の速度アップはできないということになるので
改善するには画像の回転という演出をやめるしかないという結論なんですが・・・
219:デフォルトの名無しさん
09/05/22 13:11:01
つまりどこにボトルネックがあるのか
本当のところはわかってないと
220:デフォルトの名無しさん
09/05/22 13:12:37
PSPのようなクロスで開発する場合プロファイリングできるんだっけ?
221:デフォルトの名無しさん
09/05/22 13:50:15
非公式環境でも普通にpsp-gprof提供されてるし。当然できる。
222:デフォルトの名無しさん
09/05/22 14:54:00
スレリンク(gameurawaza板:874番)
>874 :シューティング大好き ◆hvhkrhIMnI :2009/05/22(金) 06:19:31 ID:w31tRwU1
>>>862
>ボトルネックなのは弾幕の演出上必要となる計算処理とかですかねえ。
>今はごまかしてますが、ホーミングの軌道修正計算も負担だったりします。
なるほど…
223:デフォルトの名無しさん
09/05/22 15:00:21
まあ、ソースをみる限り
atan2はcosやその他超越関数より
はるかに軽そうだがな。
これをボトルネックとみるのは
どうかな。
224:デフォルトの名無しさん
09/05/22 15:04:43
ライブラリ側のソースも見てるが回転機能が付いてる描画関数は
sinとcos使ってるからどうしても処理を軽くできないなら回転をやめるのは
ある意味正解かもしれん。
225:デフォルトの名無しさん
09/05/22 15:08:52
まぁそれでも、あらかじめ回転した画像を用意するだけの話ではあるがな
226:デフォルトの名無しさん
09/05/22 15:19:27
今時それは非効率すぎないか?
227:デフォルトの名無しさん
09/05/22 15:24:54
効率的に目的を達成する方法があるなら提示してあげればいい
228:デフォルトの名無しさん
09/05/22 15:40:39
>>227
重たいロジックを入れない->回転やめる
229:デフォルトの名無しさん
09/05/22 15:41:58
まぁそれも、あらかじめ回転した画像を用意するだけの話ではあるがな
230:デフォルトの名無しさん
09/05/22 15:44:43
分岐のコストが低いプロセッサならCORDICどうかな?
やってみたことないからうまくいくかわからんけど。
231:デフォルトの名無しさん
09/05/22 15:46:50
画像を用意する場合はどのくらいの分解能
引っ張ってくる画像を判断するための処理ロジックのコスト
無駄が多いな
232:デフォルトの名無しさん
09/05/22 15:50:35
| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| スンマセン、直ぐに連れて帰ります
|__ ________
__∨______.__.__
, '"――‐, '"―‐ ヽ`l:1
./ ∧_∧ //'~ ̄ ̄|.||::| | ∧_∧ アヒャ
.i (´Д`;.) i ! _,._|.||::| | ( ゚∀。 ) ←>>201
[;].!_っ⌒'と _0[;],l | f _..┘|| | :|__( つ つ___n____n
~l!=;:,...二二....,:;=iヨ.'ー''"~ . __ !|:| :|lー‐―i iー‐―i iー‐―i iー‐―l i|
li..,._.  ̄。 ̄. _.,..!.| ........~ノ,!;|__|l__!_!__!_!__!_!__l__!|
il_`}≡≡{´_E|..::' /⌒ヽ'ヽl|!=イ二ll二二ll二/_/ ⌒ヽヽ(ニ(]
. {=i:::::::[二]:::::::i=i::」 |i.(*).i;;;;|ii□□::(ニ三ニ)::::|;;;;;;|ii.(*) i;;;|
 ̄ ̄ゞ三ノ  ̄ ̄ ̄ゞ_ノ ̄ ゞゞ三ノ  ̄ゞゞ_ノ~ ≡3
233:デフォルトの名無しさん
09/05/22 15:56:33
駄々こねても困るのは東方厨だから別にかまわんけどね
234:デフォルトの名無しさん
09/05/22 15:57:48
一応プログラミングの話題で議論してるのに
関係ないスレにまで出張してくるアンチはしねばいいのに
235:デフォルトの名無しさん
09/05/22 16:01:20
>>234
で、流石にもうプロファイルはとったよな?
どこにボトルネックがあったんだ?
まだとってないならpspDebugProfilerEnableという手もあるぞ
236:デフォルトの名無しさん
09/05/22 16:38:32
タイヤが回ると車って前進するじゃないですか
この仕組みがよくわかりません。
タイヤの回る力が並進する力に変わるプロセスってどうなりますか?
タイヤと路面のすべりは0だとすると、
1、タイヤにトルクを加える。
2、タイヤに角加速度が発生。
3、タイヤと路面の接触点(面)に加速度が発生。
4、??? <-このプロセスがわからない
5、タイヤの重心に加速度が発生。
6、タイヤは回転しながら並進する。
237:デフォルトの名無しさん
09/05/22 17:06:49
>>236
接してる面だけしかない場合は軸を円周方向の角速度の逆に蹴ってる。
単なる棒で接してるなら軸は真っ直ぐ前ではなく倒れてしまうけど
タイヤという円形なので連続して蹴るために軸は同じ高さを保ったまま
ベクトルとしては水平方向に進む?
238:デフォルトの名無しさん
09/05/22 19:48:01
>>237
その棒の例えは、感覚的にはわかるのですが
原理的にあまりよくわかりません。
これがわかれば、球の前進も理解できそうな気が
するんですが。
すべり0の路面とは、接触した点はX-Yのどの方向にも
動かすことは出来ないということ。つまり速度=加速度=0の拘束を受ける。
タイヤが角加速度を発生すると、接触点に加速度が発生するはずであるが
さきの拘束がある為、加速度=0になる。その帳尻合わせる為?代わりに
接触点以外の質点の加速度をマイナスする。。のかな、ん〜よくわからない。
239:デフォルトの名無しさん
09/05/22 21:19:16
なんか中学生の疑問ぽいな
壁に向かって力を押せば、反対側に進む
作用・反作用の法則だ
タイヤの場合もそんな感じ
240:212
09/05/22 21:47:48
>>201
DXLibralyPortable 見てみた。
DrawRotaGraph() の類を使っているのだな?
リストの線形探索というとても効率の悪い GraphHandle2Ptr() を、
一枚描画するたびに何度も呼ぶことになっているが、同じ画像を
使う描画をまとめることで、実は一度だけでよいようにできる。
当然、SetTexture() も一度でよくなる。
また、sceGuGetMemory() を毎回呼び出しているが、事前に枚数が
分かっているのなら、これも一度でよい。
ついでにいうと、GuListSafety() はうんこだ。
sceGuGetMemory() の直前に必要量が足りるかを判定して、足り
ない場合に不ラッシュするようにすべきだ。
さらにいうと、この処理を見れば分かるように、パケットエリアが
足りなくなると sceGuSync() を呼ぶことになるが、これは処理速度
の観点から好ましくないので、sceGuGetMemory() 直前に、パケット
エリアが足りなければ assert() するようにした方が良いかも知れない。
メモリ効率が重要ならリングバッファに。
double は論外。
どうしても必要な場合だけにしなさい。
float <-> double の変換だけでかなりの時間を使う。
まず間違いなく、atan は無罪だ。
DrawRotaGraph() を引数を含めて最適化したほうがずっと効果が
高いだろうと思われる。
あとお前、212 のテイラー展開とか正規化で sin, cos とか無視しやがったな。
進行方向修正だけなら(九十度回転)内積だけで済むとかも。
241:デフォルトの名無しさん
09/05/22 22:01:50
DXlibってド素人向けゴミクズライブラリの分際でPSP用とかあるのか
242:デフォルトの名無しさん
09/05/22 22:04:21
ゴミ以下な>>241より人気あるしな
243:デフォルトの名無しさん
09/05/22 22:19:22
開発者 「スレで開発すればプログラムの勉強になるし名声とかも得て一石二鳥♪」
実際 PSP独自の関数とか絶対他で使んねぇのに開発とか超受けるんですけどww
2ちゃんで開発とかwwずっと乞食共に食われてろよw
自身のブログで公開してアフェリエイトでも期待してた方がまだマシだなw
名声?まあ、そのくらい分かるよなw
そもそも完成しないのに開発って矛盾しすぎww
っていうかなんでパスつけてんの?優しい優しい開発者が乞食のために公開してんじゃなかったの?
いいよ、俺が教えてやるよPASSは601だwww
一生このスレで乞食の相手やMの奴隷でもやって、くたばっちまいなぁwww
乞食 「やべwwPSPで東方ができるwwダウンロードっと」
実際 「はぁ?こんなの東方でもなんでもねぇよ、くそつまんねぇ〜
でも、そのうち本物と同じくらいの出来が来るかもしれないから毎日来るか」
こんなスレにずっといると精神腐っちゃうぞ☆
将来のためにお勉強した方がよっぽどいいよ、マジで
244:憂煉 ◆yreeen/0R2
09/05/22 23:28:51
>>240
わざわざ私のソースコード呼んでくれてありがとうございます。
次のバージョンあたりで線形探索とかsceGuGetMemoryとかの最適化も含めようと思います。
バッファ足りなくなった時点でassertですか・・・それもありですね。双方に利点欠点があるので適宜切り替えられるようにしようかなと思います。
リングバッファはPSPSDKの設計上難しそうです。
引数にdoubleが存在するのは本家ライブラリに合わせているのが原因です。これもプリプロセッサか何かで対応しようかと思います。
的確な指摘本当にありがたいです^^
245:憂煉 ◆yreeen/0R2
09/05/23 00:06:26
>>240追記
進行方向修正で左右を判別するなら90度回転して内積つかうよりも直接外積使った方がいいですよ。
正確には2Dでは外積そのものは定義できないので「外積の大きさ」を使うことになりますが。
atanは無罪ですね。でもatanよりatan2使った方が良くないですか?
atanだと第一象限と第四象限の角度しか返さないので補正に一手間必要ですが、atan2だと全象限カバーできますし。
そのあたり実際にベンチマークが必要ですね・・・
246:デフォルトの名無しさん
09/05/23 00:24:04
なんか伸びてると思ったら最近あちこちで利用されてる龍神録関係か
数学はあまり詳しくないんだが確か龍神録のホーミングは360度
軌道修正できる感じだったので内積とか外積は関係ないんじゃないか?
247:デフォルトの名無しさん
09/05/23 01:39:05
>>245
わかってるなら初心者に東方もどきを作らせずに自分で作れば良いと思うのだが
248:デフォルトの名無しさん
09/05/23 01:57:21
>>247
私は実際のプログラムよりライブラリを作る方が性に合ってるのでw
実のところ纏まった時間も無いですし、ゲームの開発はしばらく人任せにしようかと思ってます。
249:デフォルトの名無しさん
09/05/23 13:56:00
あばばばば
250:212
09/05/23 14:23:21
>>244
assert の話は利用側への話。
psp sdk を軽く見てみたけど、リングバッファにもできそうだ。
デメリットもあるからメモリ効率を追求するのでなければ不要だが。
GPU の処理負荷はどうだ?
GPU が原因で処理落ちするようなら、パケットエリアのダブルバッファを検討
すべきだ。
今の構成では、多分 GPU が遊んでる時間が結構あるし、フレームの最後の方で
大きなプリミティブを描画すると処理落ちの危険が不必要に高まると思う。
double を使うと本当に重い。
-S オプションでアセンブリリストを出力させ、double 変換関数が呼ばれて
いないか調べなさい。
変換関数の名前は覚えてないから、テストプログラム作ってリスティングして
調べてくれ。
sprintf() などの可変引数に渡すときや、float から long への代入時に暗黙
の格上げがあったりするので注意。
>>245
カチンときて何か言わずに済まなくなったのか。
atan の話で、テイラー展開の話を理解していないことがわかる。
自前の atan を実装しろという話なのだから、標準ライブラリの atan() を使え
と言っているわけがない。
標準ライブラリの atan() は double なのだから、double を論外とする人がそれ
を使えというわけがない。
実際に標準ライブラリの atan()/atan2() を使っていたのなら、すぐに atanf()
か atan2f() に直すべし。
251:212
09/05/23 14:24:17
>>245
> (略)直接外積使った方がいいですよ。
君は自分がなにをしなければならないかを知っているが、俺の言ったことは
理解していない。
ベクトル (x, y) を九十度回転させて (x', y') にする操作は、
(x', y') <- (-y, x) である。
一般の回転は (x*cos - y*sin, y*cos + x*sin) であるが、今回は九十度
なので cos(90) == 0, sin(90) == 1 であり、結果 (-y, x) となる。
ではこれを使って、九十度回転したベクトルとの内積をとってみよう。
ベクトル A と B の内積を Ax * Bx + Ay * By とすると、九十度回転した
A(-Ay, Ax) との内積は Ax * By - Ay * Bx となる。
おや、何か外積と似てるね。
さて君は外積の大きさを使うと言ったが、具体的にはどのようなことだろうか。
(Ax, Ay, 0) と (Bx, By, 0) のベクトルの外積をとって、出てきたベクトル
の各成分の二乗和の平方根と解釈して良いだろうか。
このとき、当たり前だが、外積の結果は、x 成分と y 成分がゼロである。
元の二つのベクトルの z 成分がゼロであるから、これは当然である。
であれば、最初から z 成分だけ計算すればよいのであり、だとしたら、その
計算を外積だと主張するのは、間違いではないがピントが外れていると言えない
だろうか。
それに、ベクトルの大きさならば負の値をとらないから、その点でも説明不足
な表現といえるだろう。
252:デフォルトの名無しさん
09/05/23 14:26:36
245 は分かっているだろうが、ライブラリを使う側の話なので、折角だから進行
方向の更新処理についても説明する。
弾の位置から自機の位置を引いたベクトルを A、ホーミング弾のフレームあたり
の移動量(進行方向)のベクトルを B としたとき、B と九十度回転した A との
内積の値は |A||B|sin となる。
ここで角度を得るためには |A||B| で割ればよいのだが、平方根と除算が必要に
なる。
平方根自体は psp ならば浮動小数点ユニットに実装されているはずだから、
目くじら立てるほど遅いということは無い。
しかし平方根や除算を消せるならそれに越したことはない。
ホーミングの進行方向修正を考えた場合、必要なのは、右に回転すべきか
左に回転すべきか、それとも正対すべきか(向きの差が回転性能未満の場合)
ということを判断するのに十分な情報だけである。
右か左かというのは、sin の符号でわかるので、回転性能未満かどうかの判定
について説明する。
ベクトル A 同士の内積、つまり Ax * Ax + Ay * Ay の結果は、|A| * |A|
である。二乗和であるから当たり前だが。
件の内積の結果であるところの |A||B|sin を二乗すると、
|A| * |A| * |B| * |B| * sin * sin となる。
これを A の二乗和と B の二乗和で割ると sin * sin が出るのだが、今回は
比較に使うだけなので割る必要はない。
a > 0 かつ x > y のとき、 ax > ay という法則があるので、これを利用する。
a を |A| * |A| * |B| * |B| とするわけだ。
また |x| > |y| の時、x * x > y * y を利用して、回転限界の sin の二乗
と、A と B のなす角の sin の二乗との比較を行う。
253:212
09/05/23 14:27:27
回転限界を r 、その sin を sr、さらにその二乗を sr2 とすると、
outerp = Ax * By - Ay * Bx; // |A| * |B| * sin
outerp2 = outerp * outerp; // |A| * |A| * |B| * |B| * sin * sin
alen2 = Ax * Ax + Ay * Ay; // |A| * |A|
blen2 = Bx * Bx + By * By; // |B| * |B|
limit2 = alen2 * blen2 * sr2; // |A| * |A| * |B| * |B| * sin(r) * sin(r)
if ( fabsf(outerp2) < limit2 ) /* 回転限界未満 */;
else if ( outerp < 0 ) /*右回転*/;
else /*左回転*/
というようにして、除算も平方根も無いばかりかコンパイラがスケジュール
しやすそうなコードが出来上がる。
前述の法則から、fabsf(outerp2) < limit2 は結局 sin*sin < sin(r)*sin(r)
と同じ結果になることが理解できるだろう。
回転限界未満では atan などを使うことになるが、テイラー展開で自前で実装
したバージョンを利用するなら、asin の方が収束しやすいので、平方根で割って
でも asin を使った方がいいかもしれない。
これは実測しないとどちらが有利かはわからない。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5495日前に更新/123 KB
担当:undef