1 :
名無しさん@お腹いっぱい。 :
2000/09/27(水) 01:07 おもにDirectXに間してのFAQ
2 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 01:16
VC6.0+DirectX7SDKでプログラムしています。 フルスクリーンでダブルバッファを用いたゲームを作っているのですが、 環境によってリフレッシュレートが変わり、ゲーム速度が変わるために困っております。 これを解決するために、まずゲーム開始時にリフレッシュレートを取得して 1フレームごとの移動量を計算しようと思っているのですが 肝心のリフレッシュレートを調べる方法がわかりません。 知っている方が居れば教えてください。
>これを解決するために、まずゲーム開始時にリフレッシュレートを取得して >1フレームごとの移動量を計算しようと思っているのですが ここら辺がよく分からんけど FlipのかわりにBltを使いタイマーでタイミングを取るってのじゃ駄目なのか?
4 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 01:26
>2 難しく考えすぎ、タイマかパフォーマンスカウンタで制御すればいい そういう資料もってないなら上記のキーワードで検索してくれ
5 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 01:42
ようはFPSが求められればいいんだろ? メインループの中にカウンタを作って通過するたびに+1 タイマーを使って1秒過ぎるたびにカウンタの値を取って0に初期化 を繰り返せばOK
6 :
2 :2000/09/27(水) 01:44
レスありがとうございます。 タイマを使う方法も以前に試して見ましたが、どうもカクカクして使い物になりませんでした。 上の移動量を計算〜…ですが、仮にFPS=60のときxが1ずつ進むなら、 FPS=75の場合はxは0.8ずつ進むようにしたいということです。
7 :
2>5 :2000/09/27(水) 01:45
できればもっと正確に、しかも時間をかけずに求めたいのですが… デバイスから現在のリフレッシュレートを取得するといった感じで。
8 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 03:30
リフレッシュレートって昔はドライバーによって嘘返してきたりつかえなかったけど
最近はマトモになったのか?
>>6 キャラクターの座標を256倍とかして管理するんだよ
60FPSの時は +256、 75FPSの時は +256*60/75
で表示する時は 内部座標/256ね。これでスムーズに動くよ
9 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 04:23
x += vx * dt; y += vy * dy; サンプルのDonutsのソース見てみるといいんでないかい。 方法の1つに過ぎないけどね。 >リフレッシュレートって昔はドライバーによって嘘返してきたりつかえなかったけど >最近はマトモになったのか? なってません。うちのGeForce2MXも返してこないし Forced Refresh Rateすらちゃんと効きません。てめーNVIDIA!!!!
10 :
9 :2000/09/27(水) 04:24
s/dy/dt 鬱だ死のう。
11 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 09:37
つーかVSYNCなんてシカトしようぜ。 どうせWindowsモードではSYNCできねーんだからさ。 無理するこたーねぇ、意外とティアリングなんて気になんねーぜ。
12 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 10:33
GetTickCountあたりで解決するほうが楽な気がする。
13 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 13:46
14 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 22:59
DEVMODE devmode; devmoce.dmBitsPerPel = 16; devmoce.dmPelsWidth = 640; devmoce.dmPelsHeight = 480; devmoce.dmDisplayFrequency = 60; devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY; ChangeDisplaySettings( &devmode, 0 );
15 :
14 :2000/09/27(水) 23:01
devmoce -> devmode 逝ってきます。
16 :
名無しさん@お腹いっぱい。 :2000/09/27(水) 23:23
>14 それってどの環境でも動作するんですか? ChangeDisplaySettings()は動作が不安定だって聞いたことあるんですけど。 (2ちゃんで聞いたから、もしかすると嘘かもしれない)
17 :
名称未設定 :2000/09/27(水) 23:30
みんなで動作試験してみるってのはどうだ?
18 :
名称未設定 :2000/09/27(水) 23:32
ちゃんと動くようにするのはMS(とビデオカードのメーカー)の仕事だよなあ・・・。 DirectXできちんとリフレッシュレート変更できるようにしやがれ!
19 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 00:07
リフレッシュレートは変更しないでー モニターの相性によっては画面うつらなくなることもある そのへん考慮するのも良いプログラムの条件だろ それとなんでリフレッシュレートにこだわるかな
20 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 00:42
>17 確認用のexeを作って、どっかにUPして。
21 :
>19 :2000/09/28(木) 02:12
>それとなんでリフレッシュレートにこだわるかな そりゃ、同期映像と非同期映像は明らかに品質が違いすぎ、 完全な(時間軸の誤差ゼロの)同期映像を得る現実的な手段は リフレッシュレートの変更しかないからです。 実は2、3ほど他の解法も考えてるけど、研究中なのでしばし待たれぃ。 #VSyncMAME萌え〜
22 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 02:31
>>19 ゲームの映像は、アニメやCGと同様に1フレーム単位の芸術だから(3DCGもフレーム単位でいじくったりしてるのだ)その1フレームの時間がバラバラだと困るんスよ。
冲を掛けるやり方は、実はある程度日常的な物理法則が働く場面にしか使えないんだけど、見過ごされがちなんだよなあ。
23 :
22 :2000/09/28(木) 02:34
あ、1フレーム単位の芸術ってのは、カプコンの対戦格ゲーあたりが特に顕著なので、そのあたり観察してもらえるとお分かりいただけるかと・・・。
24 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 02:56
FPS調整の話をしてるの?
25 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 04:12
19 > 21,22 & 23 2が質問でリフレッシュレートの設定でDirectXのVSyncの頻度が 変わるからゲームの速度がたもてないよーって質問があったんですよ それならばタイマかパフォーマンスカウンタを使えば 前回の更新からどのくらいの「時間」が経過したかを計算できますから モニターのリフレッシュレートにわずらわされることもなく ゲームのフレームレートもウェイトをかけて調節可能ですし 3Dならば時間単位での計算をすればいいんでないかということ だったんですが リフレッシュレートとアニメーションのフレームは同一の単語だとは 知りませんでした モニターのリフレッシュレートを無視した映像更新はノイズがでるから だめってことでVSync待ちして更新するんだとおもってましたが 違いましたか
<VSYNC待ち きょうび、プログラムが意識する必要は無いとおもうけど。
3Dのゲームは場面やマシンスペックによって1フレームの画像を 作るのにかかる時間が何十倍も違っちゃうからねぇ…
28 :
>26 :2000/09/28(木) 05:56
んなわけないない。絶対にないない。思いっきり否定させてもらおう。 ていうか、Windowsユーザーが垂直同期取ってない映像に 慣れてしまっただけでしょう。 ゲーム機やアーケードのゲーマーには、 PCのゲーム動きがカクカクしていや〜んって嫌ってる人結構見かけますよ。 弾幕系2Dシューティングに至っては非同期だと完全にプレイに支障が出るし。
29 :
>27 :2000/09/28(木) 05:58
それと同期取りの問題とは違うと思うです。 まあ、確かにブラウン管が画面を1回走査する間に フレームを1回確実に更新しないと 単なるティアリング防止にしかならないわけだけど。
>まあ、確かに 意味通じてんじゃん(藁
>26 Flip()使えばいいんでないの?
33 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 07:03
論点がちがうんだってば PCではVSyncの頻度は変更できるからVSyncはモニターの更新同期に使えってことで ゲームのフレームレートなんかはタイマー使えってことです ゲームの画像生成とモニターへの映像更新は別ってことで それとタイマーにGetTickCountやSetTimerは使ってはだめです
34 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 07:19
>33 論点は1つだと思ってない? リフレッシュレートをフレームレートに一致させる話も出てるんだよ。 VSYNCを変える話はここでも出てるから関係無いわけないだろ。 あと、フレームレートが保証できる場合の話と保証できない場合の話も出てるし。
35 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 08:07
33>34 そうでしたか、すみません
36 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 09:25
>それとタイマーにGetTickCountやSetTimerは使ってはだめです なんで? Windowsのメッセージループを通るたびにtimeGetTimeで時間を調べて 今すべきイベントをメッセージキューに投げる、ってわかりやすくて よくない? っていうか私の作ったゲームは全部これを使ってるよ。
37 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 09:35
単に、GetTickCountの精度問題なんとちゃう?
38 :
36 :2000/09/28(木) 09:41
あ、GetTickCountとSetTimer限定の話なのか。 鬱だ。
39 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 09:42
家庭用ゲーム機やアーケードのゲームはほぼすべて、ブラウン管の垂直帰線をそのまま実行速度の調整に使用している。リフレッシュ・レートは60Hz前後で固定だから実にシンプルなもので、走査線が1回画面を走査するごとにゲームの処理を1ステップ進めて、1回フレームを更新するわけだ。処理負荷が一定を超えない限り、同じフレームが2度走査されたり、飛ばされたりすることはない。結果、得られるのはブラウン管の毎秒60回の走査と完全に同期した60fpsの動画であり、すなわちこれは通常のテレビ放映と同等の滑らかな映像ということになる。 ……というところまではいいッスか? 分かります?>たぶんWindowsオンリーな方々
40 :
>31 :2000/09/28(木) 09:46
だから、PCではリフレッシュレートが一定じゃないから /* ゲームループ */ while (true) { ... Flip(); } はダメなんですよ。
41 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 09:48
>28 >弾幕系2Dシューティングに至っては非同期だと完全にプレイに支障が出るし。 はっきり言って、VSYNCに同期してるゲームの方が支障おおアリ。 60Hzでスピード調整してるから85Hzのモードでは速くなっちゃったり、 逆に極端に遅くなっちゃったり、スピードは変わらないけど85Hzで 60回だけ更新するからカクカクしちゃったり。 VSYNCをON/OFFできる設定が付いてるゲームでは、絶対OFFに した方がプレイしやすいもの。
42 :
31>40 :2000/09/28(木) 09:58
VSYNCをタイマーがわりに使う話でなくて、Flip()使えばVSYNC の回帰中に切り替えてくれる話なのだ。
43 :
>41 :2000/09/28(木) 10:04
うう、やっぱりPC系の方にはなかなか話が通じにくいですな(笑)。 慣れてるんでいいけど。全部クソゲイツのせいだし。 >はっきり言って、VSYNCに同期してるゲームの方が支障おおアリ。 >60Hzでスピード調整してるから85Hzのモードでは速くなっちゃったり、 あたしは同じ60fpsで同期の場合と非同期の場合を比較してるのであって、 実行速度が変わっちゃっちゃあそりゃ問題外です。 >逆に極端に遅くなっちゃったり、スピードは変わらないけど85Hzで >60回だけ更新するからカクカクしちゃったり。 そう。それは非同期なせいで支障が起きてるわけでしょ? >VSYNCをON/OFFできる設定が付いてるゲームでは、絶対OFFに >した方がプレイしやすいもの。 そのかわりティアリングが起きてますがな(これも非同期の支障)。 そこで、リフレッシュレートを60Hzにしてフレームの更新と同期できれば すべて解決するわけでしょ? 理論的にも最高品質の映像が得られます。
44 :
>42 :2000/09/28(木) 10:13
dtを掛ける方法使います? 2Dだとイベントの発生タイミングの誤差やら デモやリプレイなんかの問題やら、難題山ほど抱え込むことになると思う。 それこそDirectXのサンプルのDonutsのようなゲームにしか 通用しないでしょう。 結局ティアリング無視して60fpsくらいしか方策ないのかもね。
45 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 10:18
内部処理15300fpsという荒業を考えてみたが、どうだろうか。 ちなみに60と75と85の最小公倍数だ。 リフレッシュレート70Hzとか80Hzの人は死んでくれ(w
46 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 10:29
キーフレームを20fpsくらいの頻度で入れとくってぇのは?(だれに逝ってるか自分でわからんが…)
47 :
魁!名無しさん :2000/09/28(木) 10:29
>>45 ・・・5100じゃないのか?>最小公倍数
48 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 12:46
うーん、VSYNCを基準タイマーにした場合、重いシーンだと60fpsに 間に合わなかった場合、そのままコマ落ちするんじゃないの? プレイヤーからはゲームの進行が遅くなったように見えるように。 特に最近のネットゲームの場合、1/60secでデータの交換が終わる わけはないので、どうしても非同期にせざるを得ないような気がする。 俺は素人なんで間違ってたらつっこんで。
49 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 13:58
>>逆に極端に遅くなっちゃったり、スピードは変わらないけど85Hzで >>60回だけ更新するからカクカクしちゃったり。 > >そう。それは非同期なせいで支障が起きてるわけでしょ? こういうのって、やっぱ、見ててわかるもんなんですか?
50 :
49 :2000/09/28(木) 14:03
あ、なんとなくわかった。 たとえば、リフレッシュが80Hzで、フレームレートが最高60fps までしか出せないような場合、リフレッシュ4サイクルに3フレーム 切りかえるくらいなら、リフレッシュを60Hzに落とすとか、じゃ なかったら、フレームレート40fpsに落としてでも、2サイクル に1フレームとした方が見てて気持悪くないヨ、っていうような 話ですか??
51 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 14:14
わかる。以上。 細かく言えば、いまのゲーム映像文法では絶対に分かる。 解決のためには、やっぱ、Vシンク60hz決め打ち法案を可決するか、 あらたなゲーム文法を開発するしかないね。 とにかく、ソフト内部のフレーム更新周波数とディスプレイの周波数が違う場合、 なれてくれば絶対にわかってしまう。 この辺が理解できないのは、やっぱ、Winゲーマーが洗脳されてるんだろうな。
>>51 ゲーム映像文法というか、認知心理学の領域というか。(^^;
人間の目って時間が均等に割られていない動きにはかなり敏感です。
特に3D CGのような輪郭のはっきりした画像はね。
逆にいうと均等になっていて、blurがかかっている画像だったりすると
フレーム数が少なくても割とごまかせたりするんですけどね。
53 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 19:11
DirectXのサンプルファイルをコンパイルしようとすると、 2001リンクエラーがどわーっと出てきます。 プロパティの設定で.libの設定はしたし、SDKへのパスは通しました。 VC++6.0 SP4 Win98 DirectX7.0a タコな質問で住みません。
54 :
名称未設定 :2000/09/28(木) 20:13
結局、ChangeDisplaySettingsは使えるのか? 使えないのか?
55 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 20:34
>54 使えないというか、絶対使っちゃダメ。(マジレス!)
56 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 20:41
>43 >そこで、リフレッシュレートを60Hzにしてフレームの更新と同期できれば >すべて解決するわけでしょ? 理論的にも最高品質の映像が得られます。 PCではVSYNC固定が不可能だから議論してるんじゃ〜ん。 今は120Hzとかが主流みたいだけど、今後はこの数値もどんどん 大きくなっていくだろうし、とにかくVSYNCに依存するような アルゴリズムは危険なのだ。
57 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 21:30
なーんか どっから60Hzってでてくるかな 最近のゲームにでも毒されてるんじゃないのか VSyncとれないハードだったらどうすんだこいつら 「VSyncとれないんでこんなハードじゃゲームつくれませーん」て上司に泣き付くのか こんなやつらばっかりか最近のプログラマって。理屈ばっかりならべて。
58 :
名無しさん@お腹いっぱい。 :2000/09/28(木) 23:59
ハードの問題をプログラマがうだうだ言ったってなにも進展しないね(ワラ
59 :
pipi :2000/09/29(金) 00:28
現在、WinSDKにてシューティングゲームに挑戦しております。 DirectXは使ってないのですが、フルスクリーンで表示することは 可能でしょうか?
60 :
59> :2000/09/29(金) 00:45
可能です
61 :
60 :2000/09/29(金) 00:46
鬱だ…
62 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 01:13
どうでもいいけど、BeOSのフルスクリーンウィンドウは
デフォルトのリフレッシュ・レート60.1Hzが保証されている模様。
さすがだぜメディアOS。
>>57 ,58
そりゃその通りだけどさ、これってはっきり言って
まともなリアルタイムゲーム作るには致命的な問題だぜ。
今日ゲーセンで改めてマーベルvsカプコン2とか見て確信したよオイラは。
皆でゲイツに訴えるという手もある気がするんだが、その辺どうなんかな。
63 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 01:17
そもそも、リフレッシュレートなんつーものがある 今のモニタがタコな気がしてきたんだが、どうよ? リフレッシュレートレスなモニタとか作れないのか? 毎秒n回画面を上から下に電子ビームで走査して……って、 冷静に考えてみると、これで動画として見えてるらしいのが不思議だ。
64 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 01:17
>60 方法を教えてください。(土下座)
65 :
45 :2000/09/29(金) 01:27
>・・・5100じゃないのか?>最小公倍数 かたじけない。その通りだ。 嗚呼嗚呼嗚呼最小公倍数の求め方忘れてるなんて鬱だ死のう
66 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 01:27
>64 本気で言ってんの?
67 :
Be名無しさん :2000/09/29(金) 01:31
>64 ChangeDisplaySettingsで目的の解像度に変更して画面を覆うサイズの ウインドウを作れば可能です 上の方で使うなって言われてますが 解像度変更だけならOK ただしこの場合は DirectX みたいにかってに元の解像度に戻してくれないので プログラム終了時に同じくChangeDisplaySettingsでもとに戻してね
68 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 01:31
64>66 あ、「フルスクリーン」か。 解像度変更と勘違いした。土下座損。
69 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 02:31
冗談か本気か知らないけどさ ちゃんとtimeGetTime()使って調整しているよね?
70 :
>69 :2000/09/29(金) 03:17
誰に言ってるの?
71 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 05:53
で、結局どうすりゃええの?
72 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 06:06
格ゲーオタクは逝ってよしってことだ
73 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 06:51
なんだ、そっか。
74 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 07:08
適当にまとめ ・CRTを使う限りVSYNC以外のタイミングでの flipは映像にうねりが生じる。 PCの場合はこのVSYNCの間隔がハードウェア、 解像度によりまちまち。逆に専用機は固定に できる。 例えばVSYNC間隔を1/60sec固定にし、全ての 描画が1/60secに間に合うのであれば問題は ないはず。が、実際問題それはありえない。 格闘ゲームの場合、描画対象がほとんど固定の ため、fpsの低下は少ないがもっと一般化された 3D空間の描画にはシーンによりかなりのfpsの 変動が発生する。描画対象が少ないときは 100fps、多いときは20〜30fpsってことはよく ある。
75 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 07:08
長いので分割 なのでPC環境ではdt間隔をVSYNCと別のタイマー で用意してflipをVSYNCのタイミングで行うことが 多いはず。(もちろんVSYNCのタイミングを外して 行うことも可能)ただし、この場合人間が見て 不自然さがないかどうかってことが問題になるの かも。(十分速いPCであればそう問題は無いはず) あと、FPS系(1人称シューティング)のゲームでは 少しでもfpsをかせぐ方がよいので、画面がうねって でもfpsを上げるセッティングにするのが普通。
76 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 22:09
一つの妥協策としては、プログラム開始時にリフレッシュ・レートを計測して、60HzであればVSYNCを基準タイマーに、そうでなければパフォーマンスカウンタを基準タイマにしてティアリング無視で動かすってのがあります。で、同期映像が欲しい人は、自分でForced Refresh RateかDirectX診断ツール>DirectDrawのリフレッシュ・レート上書きを60Hzに設定してくれとドキュメントに書いておく。これが精一杯のとこかと。 ChangeDisplaySettingsについては吾輩も分からんので誰か調べてちょ。他の周波数ならともかく、勝手に60Hzに設定して問題のある環境があるとは思えないんだが、なんせWindowsだからね。結構恐い。
77 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 22:10
ま、これってハードではなくOSの仕様の問題だし、DirectXレベルでどうにかして欲しいもんではあります。Xboxのラインも生まれることだし、もう少し日本のゲームメーカーもMSに声を伝えるべきだと思う。外国のデベロッパーとかNVIDIAとかに任せてたらいつまで経っても解決しないんじゃなかろうか。 困ったちゃんなのは、ビデオカードの性能を云々する以前の段階で映像品質を大幅に向上させる手段が存在するのに、それが思いっきり見過ごされてることでしょう。ゲームだけでなく、DVDのフルスクリーン再生なんかも、モニタと非同期やったら全然意味ないやんって感じなんだけれども。
78 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 22:11
>この辺が理解できないのは、やっぱ、Winゲーマーが洗脳されてるんだろうな。 同期映像見たことないんちゃうかって危惧はありますね。エミュレータの話でアレですが、NESticleを動かせる人は、Settings>Vsyncをチェックして、FrameskipをAUTOではなく1に設定してみて下され。それで完全な同期60fpsが体験できるはず。 とりあえず、ゲームプログラミングスレの幕開けにふさわしい話題ではあった。
79 :
名無しさん@お腹いっぱい。 :2000/09/29(金) 22:33
>76 だれもタイマー使うときにVSync無視するっていってねーじゃん ちゃんと読めよ >78 >同期映像見たことないんちゃうかって危惧はありますね。エミュレータの話でアレですが、NESticleを動かせる人は、Settings>Vsyncをチェックして、FrameskipをAUTOではなく1に設定してみて下され。それで完全な同期60fpsが体験できるはず。 >とりあえず、ゲームプログラミングスレの幕開けにふさわしい話題ではあった。 おまえが一番わかっていない
で、ビデオカードってホントに割り込みしてるの?
81 :
名称未設定 :2000/09/29(金) 23:14
>ビデオカードの割り込み PROGRAMMER'S GUIDE PC&PS/2 VIDEO SYSTEMSによると、 PC/AT互換機の仕様としては必須ではないようです。 VSYNCの検出はできないとまずいみたいですが。
82 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 01:20
>プログラム開始時にリフレッシュ・レートを計測して んで結局どうやって計るのですか?
83 :
>79 :2000/09/30(土) 04:07
キミが一番話の流れ読めてないと思うが……。
84 :
>82 :2000/09/30(土) 04:12
プロセスの優先度を最大にして、 数秒間Flipのループを回して実測するしかないんじゃないかな。 メーカーロゴでも表示してる間にやりますかね。 Win環境だと59Hzとか61Hzとかはないわけだから、 ある程度判定に遊びを持たせといて。
85 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 04:17
>>78 >Forced Refresh RateかDirectX診断ツール>DirectDrawのリフレッシュ・レート上書き
ちなみにそこの設定、レジストリの
HKEY_LOCAL_MACHINE\Software\Microsoft\DirectDraw\ForceRefreshRate
に保存されてるぞ。こんなこと書いたらまだ潔癖なPC主義者に怒られそうだが(w
いや、当然のことながらユーザーに無断で書き換えたりはしないがね。
86 :
76>>79,83 :2000/09/30(土) 06:17
えっと、たぶん吾輩のミスのせいです。訂正しときますので険悪にならないでぇ。
・パフォーマンスカウンタ→マルチメディアタイマ
・ティアリング無視で→(削除)
>>85 なんだ、それなら60Hzにする方法あるんじゃん(もちジョークよ)。
87 :
79 :2000/09/30(土) 07:33
>>86 パフォーマンスカウンタは存在しますし使われていますので気にしないで
QueryPerformanceCounterとQueryPerformanceFrequencyのセットを使って
マルチメディアタイマよりも高精度の時間計測が可能です
悪いのはすべて私 私が馬鹿でした♥
みんなリフレッシュレートを60Hzに設定すればなにも問題はないんだよね
60Hz以外に設定してるユーザーなんて糞 無視無視 ゲーム遊ぶ資格なし
ユーザーの用意された環境なんて糞くらえだ
もしゲーム中にリフレッシュレートの変更なんかしやがったら
ハードディスククラッシュの刑に決定
CPUに俺のゲーム以外の無用な負荷かけるアプリはプロセスkillだ
みんなこれからは安心して60Hz固定でゲームつくろうぜ
だからーFPSゲーマーは60fpsじゃ足らんのよ なんのために金突っ込んでCPUとビデオしょっ中 アップグレードしてると思ってんのよ。
89 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 08:57
だからー、ゲーム作るときはさ、 どんなFPSでもいいんだけど、 まず、デザイン段階から、とにかくFPSを決め打ちしなきゃ ダメなのよ。 でもって、ソフトの内部FPSと、ディスプレイ側のFPSが 一致しなきゃダメなのよ。 まあ、80Hz決め打ち、なんて奇特なゲームメーカーが現れる ことを祈ったら?
90 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 08:59
100Hz決め打ちで作れたらどんなに爽快だろう。
>でもって、ソフトの内部FPSと、ディスプレイ側のFPSが べつに内部の更新回数とディスプレイに表示する回数が一致しなくてもいい 内部で10回更新して1回表示でもかまわない そのときそれが必要でありそう決めておけばね ゲームにもよるけど
92 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 09:48
とりあえず、IDirectDraw7::SetDisplayModeの引数dwRefreshRateは 何のためにあるのか、なんでこいつが事実上使用不能なのか DirectX開発者チームに詰問してみたい気はする。
93 :
92 :2000/09/30(土) 09:50
あと、Forced Refreah Rateをどういう意図で用意したのかってのも。 本当は問題あるのは分かってるけどハードベンダに強制できない…… なんてことはないよなあ。MSの政治力を考えれば。
94 :
名称未設定 :2000/09/30(土) 11:44
やはりガイジンはティアリングとかあまり気にしないんだろうな。 Macゲーム開発者はリフレッシュレートにはうるさいぞ。 OS X公開ベータではVSYNC割り込みがまともにかからないらしくて騒いでるし。
MacってVSYNC割り込みあるんスか? いいなあ。
96 :
名称未設定 :2000/09/30(土) 16:06
>95 ありますよ。 でもiMacのおかげで、いまいち使えなくなっちゃいましたけど。 iMac以外は、CRTに問題なければ640*480*60Hzに設定できるんですけど iMacの640*480モードは117Hz固定なんですわ・・・・・。
97 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 22:52
>iMacの640*480モードは117Hz固定なんですわ・・・・・。 ほら。こうゆう事があるから、リフレッシュレートに頼れないのよ。 今後発売される新ハードでまともに動かないかもしれないゲームなんて 作りたくないでしょ?
98 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 22:54
>63 >リフレッシュレートレスなモニタとか作れないのか? 液晶モニタ。
99 :
名無しさん@お腹いっぱい。 :2000/09/30(土) 22:58
>89 >まず、デザイン段階から、とにかくFPSを決め打ちしなきゃダメなのよ。 2D時代の話ね。 3Dゲーはマシンのスピードに合わせてfpsが変化できるような アルゴリズムにしましょう。
100 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 01:36
>>98 そうそうPC98のノートとかで初めて知ったときは
「いや〜んVSyncウェイトがきいてなーい」とかで人前で恥かいちゃったよ おぢさんは
101 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 02:51
>97 117/2=58.5なんで、それほど問題なかったりします。 ちょっと遅くなる程度。 厳しいゲーマーの方ならわかるかも。 Apple、というかジョブズはゲームなんてどうでもいいと考えてるんで 先の事を考えてもどうしょうもないです。 PCでの話に戻しましょう。
102 :
>97 :2000/10/01(日) 03:38
>ほら。こうゆう事があるから、リフレッシュレートに頼れないのよ。 こういう事があるから、じゃなくってさ(ほらって言われても(^^;)。 そういう事が起こらないように、ゲーム開発者がハードベンダに モニタとの完全同期の重要性を訴えるべきなんでしょうが。 「正しいWindowsアプリ」というお題目で妥協してちゃ、 いつまで経ってもユーザーに最高レベルの娯楽を提供できないじゃない。
103 :
>99 :2000/10/01(日) 03:42
>3Dゲーはマシンのスピードに合わせてfpsが変化できるような >アルゴリズムにしましょう。 ひょっとして、同期映像ならそれができないとか思ってます? マシンパワーが十分にあれば60fpsで完全同期の滑らかな映像、 処理が間に合わなければVSYNC同期のままで フレーム落ちってこともできるんですよ。
104 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 04:03
俺はどうせPCではシミュレーションか ネットゲーしかやらないから垂直同期逝ってよし。 同期映像はコンシューマ機で好きなだけ堪能してください。
105 :
名無しさん@偽山岡 :2000/10/01(日) 05:05
WindowsがMacが専用機が言うまえに そこにある環境のなかでうまいこと表現してみせるのもゲームプログラマ の腕の見せ所なんではないですか? それとも自分のプログラムしやすい環境でないとゲームつくれませんか? 高い学費払って入学した専門学校ではそういったこと教えてないんですか? 高い金払って購入したゲームプログラム入門にはかいてませんか? たしかに最高の素材で料理するのがベストなんだけど そればっかりやってちゃ料理する側の工夫が失われないか? その工夫を研究するスレッドとしてのゲームプログラム相談室 じゃ駄目ですか?
106 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 09:23
だから102は格ゲーヲタクなんだって
<103
>ひょっとして、同期映像ならそれができないとか思ってます?
>>99 はそうは思ってないと思うけど。
108 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 13:17
だからハードの問題をプログラマがうだうだ言ったところでなにも進展しないし、ハードメーカーに文句言ったってどうしようもないんだからいいかげんその話打ち切ろよ!!!
打ち切ろよ! → 打ち切ろうよ!
110 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 13:19
>105 あなたの言う事もわかるんだけど、 できるものをできない状態にしているメーカーにも非はあるぞ。 だいたいDirectXって、環境に依存せずにゲームが作れるように してくれるものだったはずなのに、余計混乱を招いてるし。
111 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 13:23
>できるものをできない状態にしているメーカーにも非はあるぞ。 だからってここでうだうだ言ったところで何が解決するわけでもなし・・・ >だいたいDirectXって、環境に依存せずにゲームが作れるように >してくれるものだったはずなのに、余計混乱を招いてるし。 そこまでMSを盲信できるあなたがうらやましい
>だからハードの問題をプログラマがうだうだ言ったところでなにも進展しないし だから、ハードではなくDirectXの問題なんだって。 Hardware T&Lやらvertex programやら 新しい仕様を続々と盛り込みまくりながら、 最も重要なところが何年も放置されたまま。 これって、"模範的な"Windowsプログラマが、文句も言わず バカみたいに大人しく従ってるからじゃないかと思うんだが。 そりゃ今の環境では妥協策を採らざるを得ないのは事実だし 俺も仕事ではそうやってるけど、それだけじゃ それこそ永久に何も進展しないじゃんか。 FC、PCE、MD、SFC、PS、SS、64、PS2、DC、アーケード基板、 MSX、X68000、Windows、この中で仲間ハズレはどれよ一体。 とりあえず"模範的な"Windowsプログラマに対して俺が思うのは、 Windowsローカルの不完全なやり方を、ゲームプログラミングの 王道でもあるかのように提示するのはやめて欲しい。 良かれ悪しかれDirectXは今のゲームプログラマの入り口なわけで そこで1フレームの価値を軽視する連中が量産されている現状には 非常に危惧を覚える。ゲーマーとしても、開発する側としても。 この話題は確かに終了させるべきだと思うのでsage。
うーむ、主張したいってことはわかるんだけど、結局 「1フレームの価値」の重要性って何? これが伝わってこないのでどうでもいいことにこだわって 一生懸命主張してるように見える。 最後にこれだけ答えてちょうだい。
114 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 18:33
それは、汎用 OS である Windows でうごく通常のプログラムに ゲーム専用機の能力を期待しているからではないのかな? 逆に Windows(というか汎用 OS)の上で動かすべきアーキテクチャ 機能、アイデアを持ったゲームを考えるべきでは? 異なる物を同じ土俵で考えている姿のほうがみっともない。
115 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 19:21
関係ないけど面白い話があります 簡単に実験出来るので試して下さい。 単に画面上に小領域を乱数で指定した回数(3〜15)だけ点滅させます。 その後回数を確認し、正解・間違いを内部で判定します。 この点滅周期も測定毎に変更します。 当然速くなると回数を数え間違います。50%を敷居値としましょう 色によっても違いますが、 点滅は認識してるけど、数えられないという領域があります。 人によってはわずか1秒に3回程度の点滅速度で数えられなくなります 音なら1秒10回でも数えられる人なのにですよ
116 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 21:57
>111 別に盲信なんてしてねえよ。 なんであの書き込みから盲信と決めつけられるのかなあ。 理解に苦しむよ。 確かにここでうだうだ言ってても解決しないかもしれん。 でも発言を目にしてくれた人の中には、おおそうだったのかと 考えてくれる人がいるかもしれない。 俺の言う事が無駄だと思うなら、あなたのレスも無駄だから せめて黙っててくれないかな? よろしくお願いします。
117 :
名無しさん@お腹いっぱい。 :2000/10/01(日) 23:17
>115 意味がわかんないの。説明して欲しいの。 数当てゲームみたいな感じ?
118 :
名称未設定 :2000/10/02(月) 03:03
>111 前向きな話をしようぜ。 煽りたいだけなら去れ。
119 :
魁!名無しさん :2000/10/02(月) 19:44
>>117 「人間の目なんて細かいことは分からないんだから、
fpsの多少のずれとかリフレッシュ・レートの違いとかには
そんなにこだわる必要なんてないんじゃない」ってことでは?
クッキーが効いてた… ええい、好きなだけ煽ってくれ鬱だ氏脳…
121 :
計測君 :2000/10/02(月) 19:54
とりあえず、メーカー毎にリフレッシュレートを 固定できる・できないという情報を集約して、ビデオカードメーカーや Microsoftに連絡するというのはどうだろうか。 我々技術者が動かないと、メーカーは動かない気がすんのよ。
122 :
名無しさん@お腹いっぱい。 :2000/10/02(月) 21:37
これを目指せ! というサンプルコードか、 ゲームはありませんか? リフレッシュレートの問題を巧みに解決していると 思われるソフトです。
いきなりスレッドからはずれちゃうけどOpenGLベースだと どうなるもんなんでしょうか って自分で調べろよ>おれ
Windows限定の話で申し訳ないけど リフレッシュレートの設定項目があるのってDirectXだけじゃない? OpenGLにもSDLにもなかった気がするけど
125 :
名無しさん@お腹いっぱい。 :2000/10/03(火) 12:59
>122 早い話、パクりたいのねん。
126 :
名無しさん@お腹いっぱい。 :2000/10/03(火) 17:42
MFCのCStringをunsigned char*型に変換したいのですが、C++形式のキャストをまともに使うと const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(static_cast<LPCTSTR>(str))) みたいになってうざいです。 もっと、簡潔に記述する方法はないですか? #それにしても、なんでODBC関連の関数は入力引数でも非constなんだ‥‥‥
127 :
名称未設定 :2000/10/03(火) 17:44
OpenGL使って2Dゲーム作るのであれば 同じ問題はついてまわる。
128 :
>126 :2000/10/03(火) 18:04
#define hoge(p1) (const_cast<unsigned char*>(reinterpret_cast<const unsigned char*>(static_cast<LPCTSTR>(p1)))) hoge(str) defineがどうしてもイヤならインライン関数ででもどうぞ‥ つーか、いちいちそのていどでウザがんなさんな
129 :
126 :2000/10/03(火) 18:17
ん〜。と言うか、キャスト一発で済むような方法を探してるんですけど。無いのかな? マクロにせよ、インラインにせよ、この程度のことで三回もキャストしていることがうざいので。
なんでそれがうざいかなぁ‥ タイプ量が多いわけでもあるまいに 気分やさんなんだからぁ、もぅ!
よく見たら、思いっきりスレ違いやん! う〜む、ギコスレに書いたつもりだったんだがな。 鬱山車脳。
132 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 03:41
このスレッドに書きこんだ人のうちの何人かは PCゲーム系の職業プログラマもいるんだろうな。 自分の理解できるやり方に固執し、 低脳なプログラミングしかできないのを環境が悪いせいにする。 国産PCゲームが腐るのは当然だな。
133 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 05:12
またそうやってあおるんだからぁ‥場が荒れるじゃないのさ。 やめてよね。
134 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 08:00
CStringをunsigned char*にすることなんであるんだ。
>>134 だから、ODBC系の関数が文字列の入力引数にunsigned char*を要求してるんだって。
unsignedなのはまあいいとして、なんで非constなんだよ‥‥‥
#スレ違いなんで、下げます。
#ギコスレで仕切り直そうかな‥‥‥
136 :
名称未設定 :2000/10/04(水) 13:01
>132 逝ってよし
137 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 17:58
CString::GetBuffer()なんてーのは?
ああ、すいません。
レスくれるのは嬉しいんですが、スレ違いなので下げてください。
>>137 GetBufferは嫌いだ。情報隠蔽の利点を打ち消してる。
それに、あくまで入力パラメータとして使いたいので、出力を前提に
した関数の使用は避けたいです。
139 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 18:51
以下のソースでDirectDrawCreateExが未解決と出ます。どうしてですか? LPDIRECTDRAW7 pDDraw; LPDIRECTDRAWSURFACE7 pPrim; LPDIRECTDRAWSURFACE7 pBack; HRESULT hr; DDSURFACEDESC2 ddsd; DDSCAPS2 ddscaps; hr = DirectDrawCreateEx( NULL,(VOID**) &pDDraw, IID_IDirectDraw7, NULL ); if(hr == DD_OK) { hr = pDDraw->SetCooperativeLevel(Handle, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); if(hr == DD_OK) { hr = pDDraw->SetDisplayMode(640, 480, 8,0,0); if(hr == DD_OK) { ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX; ddsd.dwBackBufferCount = 1; hr = pDDraw->CreateSurface(&ddsd, &pPrim, NULL); if(hr == DD_OK) { ddscaps.dwCaps = DDSCAPS_BACKBUFFER; hr = pPrim->GetAttachedSurface(&ddscaps,&pBack); if(hr == DD_OK) { return; } } } } } }
140 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 19:25
>139 環境は? ライブラリは追加した?
141 :
名無しさん@お腹いっぱい。 :2000/10/04(水) 21:23
突然話題が変わったのね...
142 :
名称未設定 :2000/10/05(木) 00:39
>141 それでいいと思う。 VSYNCの件については、各自宿題という事にしましょう。 MS関係者をご存知の方は、怒ってる連中いるぞとお伝えください。 そういえばこの件、Bioの人達はどう思ってんのかな???
143 :
名無しさん@お腹いっぱい。 :2000/10/05(木) 08:59
で、
>>115 の結果はみなさんどうでした?
私は、ちょっと恥ずかしい数字だったもので・・・
144 :
>142 :2000/10/05(木) 11:22
ディスプレイとビデオカードの問題をMSに文句言ったって解決なんかしません
145 :
名称未設定 :2000/10/05(木) 19:12
>144 いちいちうるせえって。 死ね。
146 :
名称未設定 :2000/10/05(木) 23:25
キャラのタスクをバカスカ生成して そのうちいくつかを消したい場合、どうするのが一番効率いいですかね?
147 :
↑ :2000/10/05(木) 23:52
日本語を先に勉強するのが最も効率がよい。 なにがききたいのかわからん
148 :
名称未設定 :2000/10/06(金) 00:12
シューティングゲームでいうところの、 敵の弾だけ消すような処理がしたいという事です。
そんなもんでタスク生成するな。つーか、ふつータスクっていうか?
150 :
奈津美 :2000/10/06(金) 05:05
HTMLとCGIでやっとホームページが作れるくらいの初心者ですが、最近違うプログラム(ゲーム系)を作ってみたくなたので質問します? (趣味で、クイズゲームを作り、CDかFDで友人に配りたい) たとえば制限時間付きのクイズ3択のようなものを作り、正解率30%でまあまあ60%で普通90%以上でよく出来ましたなどと評価するゲームが、ONラインでよく見かけます。 それを、自作し、OFFラインで遊べるソフトを作ってみたいのですが、出来ればCDで焼いて、友人に配りたいのですが、初心者には無理でしょうか? (要するにCGIやJAVAではないやつ) 普通のCDのゲームのように、Winならすぐ動くようなものは、やはり、マクロですか? やはりゲームなんかを作るには開発ツールとかいるのでしょうか? あくまでも趣味の範囲で作るくらいの簡単なものでいいのですがやり方が解かりません、どなたかヒントだけでも・・・ 最初と最後に画像は入れたいのですが、後は文字だけです。
151 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 05:19
うーむゲーム方面ではタスクって言うだろ DOS時代からの言葉だろう でテーブルで管理してると思うんだけど、 弾専用のテーブル作って、一括消去する 専用テーブルが駄目ならIDふって判定するしかないだろ または逆に、全弾消去ってなフラグを作って タスク側から判定する。毎ループ判定が入るから頭悪い
152 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 05:20
テーブルは共用でも、弾のタスクナンバーを控えた配列作るとかな
153 :
魁!名無しさん :2000/10/06(金) 05:33
>149 例えば、キャラ生成、会話イベント発生、背景の演出開始など、 現れては消えて行く処理を「タスク生成」のよーな概念でくくることはある。 プログラマの趣味次第で、C++のTaskクラスの派生として作ったりとかな。 >148 普通のゲームは、描画関係の処理が全体の90%を占める。 キャラ生成などの内部処理は君にとって制作しやすい(効率よい) 方法を優先すべきだ。
154 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 06:34
>>150 マクロとか言ってるようなのでHTML+Appletくらいでいいんでないかな
Flashとかそっちの方はよくわからん
155 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 06:44
156 :
松屋のセット440円は無敵 :2000/10/06(金) 10:34
ツリー構造(ていうかCompositeパターン)のタスクマネージャ作って使ってます。 敵弾を全部消すなら、敵弾のぶらさがってるノードに削除メッセージを送ります。
157 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 11:58
Arrayで十分。Pentiumをなめるな!
158 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 18:45
>151 ありがとうございます。その頭の悪い方法で実装してました。 自律して動くのを優先させたため、外部からは削除しにくくなってるんです。 テーブルは優先順位はありますが、敵と弾は共用しています。
159 :
150 :2000/10/06(金) 21:48
160 :
名無しさん@お腹いっぱい。 :2000/10/06(金) 22:41
>松屋のセット440円は無敵 もう.. 終わっているよ。
なにーーーーーッ!? それは由々しき事態だ。
ゲームぐらいならキャラクタの上限きまってるし、Arrayのほうがいいと思う。
163 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 19:43
例えばキャラを1個出す時に、空いてるワークエリアを探したりしてねえだろうな?
164 :
松屋のセット440円は無敵 :2000/10/07(土) 23:23
空きワークエリアをスタックに積んでおけば、確保・解放のコストを最小&一定にできるよ。んで、タスククラスのnew演算子をその配列ワークから確保するようにしとくのが好みかな。 フラグメンテーション起こんないし、ゲーム向き。ムキムキッ。 ところで、セット440円まだやってたぞ。 終わったのはキムチのほうじゃない? うちの近所だけ?
165 :
名無しさん@お腹いっぱい。 :2000/10/07(土) 23:52
キャラクタ1こ出すのに空いてるエリア探すくらいどーってこと無 いと思うけど… ま、配列の要素でリスト作って、使わなくなったエリアをフリーリスト に繋ぎ変えておくらいは昔やったけど、それでも10MHzのV30 くらいだと、たいして変らなかったなぁ。
166 :
名無しさん@お腹いっぱい。 :2000/10/08(日) 07:41
ま、今のWindows機なら誤差範囲内になってしまうのは確かやね。 なんかつまらんなあ。
167 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 11:37
>163 >例えばキャラを1個出す時に、空いてるワークエリアを探したりしてねえだろうな? 探してまーす。 でも100程度の配列のサーチなんてギャバンの変身時間より短いって。 そうゆう事を気にする時代じゃないのよぉ。
169 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 12:52
>>167 >ギャバンの変身時間より短いって
いいなあ、無駄な最適化している奴がいたら言ってやろう。
170 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 13:46
でもまだまだ遅い環境もあるしなあ・・・。 86系相当の3MHzとか、Z80と6502の合いの子みたいのとか。 不確定要素はなるべく排除したいので、僕はスタック積んでます。
171 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 15:22
> 167 オイオイ、ギャバンの蒸着くらい時間がかかるんだと、重いんじゃないのか。 せめてシャリバンの赤射蒸着の時間ぐらいには収めないとな。
172 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 16:57
>171 具体的にどのくらいの長さだっけ?>ギャバン、シャリバン
173 :
名無しさん@お腹いっぱい。 :2000/10/11(水) 17:17
>>171 オイオイ、勝手に話を変えるなよ。
「ギャバンの変身時間より短い」であって
「ギャバンの蒸着くらい時間がかかる」じゃないぞ。
だから既にシャリバン並かも知れない。
って言うか既にストップウオッチじゃ無理。
174 :
171 :2000/10/11(水) 18:43
> 173 おっと、こりゃ申し訳ねえ。 比較対象が0.05秒では値がデカすぎるって意味で取ってくれれば嬉しいが。 60fpsだとすると1フレームは16.6ミリ秒なんで、1ミリ秒単位でも結構キビしい。 最初からストップウォッチとかの次元じゃないんだってば。 ちなみに蒸着が0.05秒で、赤射は1ミリ秒な。
175 :
でびふじん :2000/10/12(木) 00:54
どなたか、WinGLにDirect3Dを初期化して、 更に関数のラッピングもしてくださらないかしら。 でないと、ワタクシにはDirect3Dは難しいんですの。 報酬はワイドショーで話題にする、という事で ひとつよろしくお願いしますわ。 日曜こぃづかさんたら、要望が多いにも関わらず 取り組もうとなさらないんですのよ。幻滅してしまいますわ。
176 :
でびふじん :2000/10/12(木) 00:55
どなたか、WinGLにDirect3Dを初期化して、 更に関数のラッピングもしてくださらないかしら。 でないと、ワタクシにはDirect3Dは難しいんですの。 報酬はワイドショーで話題にする、という事で ひとつよろしくお願いしますわ。 日曜こぃづかさんたら、要望が多いにも関わらず 取り組もうとなさらないんですのよ。幻滅してしまいますわ。
177 :
名無しさん@お腹いっぱい。 :2000/10/12(木) 13:13
マシン語秘伝の書みたいな質問のしかたするなよ それとBio100%で言ったほうが早いんじゃないのかそれ
178 :
名無しさん@お腹いっぱい。 :2000/10/12(木) 13:31
>173 >ちなみに蒸着が0.05秒で、赤射は1ミリ秒な。 サンクス。また一つ賢くなった。
179 :
173 :2000/10/12(木) 14:03
>>174 だからあわてなさんなって
60fpsで処理する必要はないかもしれんだろ。
個人的には15fpsで十分だと思いますわよ。
それ以上は「スゴイと言われる」だけ。
↑ それはゲーム次第だけどね... 2Dアクション物なら最低25fpsは欲しいね、やっぱり。
181 :
名無しさん@お腹いっぱい。 :2000/10/14(土) 23:01
> 177 マシン後秘伝の書<懐かしいな、その本。まだあるよ。
せめて40fpsにしようぜ。リフレッシュ・レートのこと考えなくても 割とうまくアニメーションでき、 しかも皆が見慣れてる30fpsより滑らかなので たぶん錯覚でそれ以上に滑らかに見えるらしい数字だ。
183 :
173 :2000/10/15(日) 07:49
184 :
名無しさん@お腹いっぱい。 :2000/10/15(日) 10:35
いやしかし、15fpsはさすがに少なすぎないか? 昔のBASICのゲーム並みだろう。
185 :
>176 :2000/10/15(日) 11:58
DirectXが無くても動作するという仕様がじゃましているのでは?
186 :
名無しさん@お腹いっぱい。 :2000/10/15(日) 20:26
> 179 世の中があなたみたいな人ばっかだと、オレたち少しは楽になるんだけど。 ひょっとしてアートディンクとかフロムの人ですカ?
187 :
179 :2000/10/15(日) 21:25
チガイマスヨ
188 :
名無しさん@お腹いっぱい。 :2000/10/16(月) 00:51
>186 アートディンクはともかく、フロムはわりとがんばってねーか? KF系は首ひねっちまうけど、 AC系はPSもPS2でもよくできてると思うが。 まあ、スゴいってほどじゃないけど。
189 :
名無しさん@お腹いっぱい。 :2000/10/16(月) 00:56
カルネージハートが好きでした。
190 :
名無しさん@お腹いっぱい。 :2000/10/16(月) 01:26
>99 具体的にはどんな設計すりゃ良いでしょうねぇ。 >3Dゲーはマシンのスピードに合わせてfpsが変化できるようなアルゴリズムにしましょう。 いや、あおりじゃなくて、今実際悩んでいるもんで。 とりあえず前回のフレームにどんだけ時間かかったかを、計測しておいて、前進スピードが 60fpsのとき1.0f/flameだとしたら、Forward(1.0f*(60.0/delta))(Forwardは前進する処理の関数。 deltaはその瞬間のfps)ってなことをあらゆるところでやってやれば良いんだけど、それってめちゃめん どいじゃないですか。うまい方法無いかなぁ、と。
191 :
名無しさん@お腹いっぱい。 :2000/10/16(月) 01:28
あ、全レスで見てたから、化石レスなのに気づかなかった。 打つ出し能。
192 :
名無しさん@お腹いっぱい。 :2000/10/16(月) 03:47
へー、40fpsか。なるほど φ(_ _) 60はきついけど30だとカクカクでいやーんな時に良いね。
193 :
名無しさん@お腹いっぱい。 :2000/10/16(月) 11:21
かなりのシューターでも50と60の区別はつかないよ。 コマとばしちゃんとやってれば。 実験した。 50切ると分かるようになってくる。 それなのに、ティアリングがどうとか言ってるやつ…… ぶつぶつ。
194 :
名無しさん@お腹いっぱい。 :2000/10/16(月) 11:35
コマとばしって何?
195 :
>193 :2000/10/16(月) 11:43
それ、非同期の50と非同期の60で実験したんスか? それだとたしかに大差ないです。同期見ないなら50や40あたりで十分かも。 逆に、非同期の60と同期の60の違いはシューターなら誰でも分かるでしょ。
196 :
名無しさん@お腹いっぱい。 :2000/10/16(月) 12:08
60で作ったものを40や50で見れば それは当然違いますよ
ですが60で作ったものを120や75で見ても違和感ありますか?
もちろんゲームの更新頻度は調整してですよ
>>193 ティアリングの事を言っているんではないと思いますよ
197 :
名無しさん@お腹いっぱい。 :2000/10/21(土) 05:32
だからぁ〜 ディスプレイは下のように書き換えてるだろ? *** = 画面描画中 --- = スキャンポジション移動中(っていうのか?) --------***--------***--------***-----> っで *** の現れる周期を VSYNC ってんだろ? 単純にタイマでやってると *** の時に書き換えちゃわないか?ってのが いままでの VSYNC 争いなんじゃないの? 俺は素人なんでティアリングって言葉はしらんかったけど. だからフレームレート云々はちょっとずれてんだよ. たとえ 120fps 叩き出そうとも *** の間に画面書き換えちゃったらおしめぇなんだよ. 逆に 30fps でも --- の間に書き換えられれば綺麗な画面なんだってば. じゃあ確実に --- の間に書き換えるためには?ときた時に一番確実なのは 昔からある VSYNC インタラプトじゃん,なんで使えるようになってね〜んだゴルァ. ってのを 112 はずっといってんじゃないの? ど〜よ? > 112
198 :
名無しさん@お腹いっぱい。 :2000/10/21(土) 06:16
>>197 ゴルァって言うな
それとディスプレイは ---*---*---*---*--->
- = 走査
* = ブランク
なんじゃないの? 違った?
モニタのトレースの終わりにVSyncと呼ばれているものが発生するから
ブランクの間に映像を更新すればティアリングは発生しないんじゃないの
通常では別に描画領域を用意して表示領域のトレース中に描画しておいて
VSyncが来てからブランクの間に表示領域と描画領域を切り替えるんでしょ
やっぱりリフレッシュレートとティアリングは関係ないよ
199 :
198 :2000/10/21(土) 06:49
200 :
名無しさん@お腹いっぱい。 :2000/10/21(土) 09:28
フルスクリーンなら普通に flip すればティアリングはおきないと思うが。 ウィンドウモードだと大変。VSync 取れなくもないけど、 うまくいかないこと多い(VSyncきてからBltが間に合う保証はない) オーバレイサーフェイスでflipできるやつもあるけど、 こんどは動作するハードが限られる(ColorKey 付き Overlay楽しい:)
うわははは、両方でやってるよ(w
202 :
名無しさん@お腹いっぱい。 :2000/10/21(土) 17:13
フルスクリーンでもVSync取らないとティアリングは起きるよ。 画面の真ん中あたりまで走査した時にフリップしたらどうなる? おまけ: PC/AT互換機というか、VGA互換カードの規約上、VSync(というかVBLANK)の検出は必須だけど、 VBLANK割り込みは必須ではありません。 いろんなカードが出てた頃、DOSで試したけどできるやつとできないやつとあったよ。 今はどうか知らん。 検出できれば問題ないから、間違いでもない限りこの件で突っ込まないでね。
203 :
名無しさん@お腹いっぱい。 :2000/10/21(土) 22:23
>>202 VSyncとらねーって言ってねーじゃん 同じような書き込み繰り返すなよ
204 :
名無しさん@おっぱい。 :2000/10/21(土) 22:32
DDのFlipなら勝手に同期とるんとちゃうんかゴルァ!
205 :
名無番長 :2000/10/22(日) 12:00
>画面の真ん中あたりまで走査した時にフリップしたらどうなる? 次のVSyncが来るまでウエイトがかかります。
206 :
名無しさん@おっぱい。 :2000/10/22(日) 13:42
DDraw+DIBでゲーム作ってます。 P2-400MHz+Win98で60fpsOverがでるのに、 Duron-600MHz+Win2000だと50-54fpsくらいしかでません。 いろんなマシンで調べてみましたがWin2000のPCは全体的に遅いです。 ボトルネックになっているところはDIBからBackサーフェスにBitBltしている部分で、 Win98だと3msくらいで済みますが、 Win2000だと10-20msくらいかかってしまいます。 Win2000でもWin98と同程度のパフォーマンスを出す方法はありませんか? PixelFormat毎にアセンブラで書くしかないのかな・・・
207 :
名無番長 :2000/10/22(日) 20:55
>206 微妙に遅いよね、Win2000だと。あとWAVサウンドの終わりにプツって 音がするし、MIDIを開くのが異様に遅いし、問題多すぎ。 Win95シリーズはWinMEで終わりだから、今後の事を考えると 2000用に作りたいんだけどさ、どうにかならないもんだろうか。 市販ゲームも2000に対応してないのがほとんどだけど、このままじゃ いけないと思うわけよ。どうよ?
208 :
名無しさん@お腹いっぱい。 :2000/10/23(月) 01:31
>206 どうもシステム・ビデオメモリ間の転送が遅いらしいって話があったよ。 アセンブラでもきびしいかも。
209 :
名無しさん@お腹いっぱい。 :2000/10/23(月) 01:59
私のPCはWin2000だとパレットを使ったゲームが全滅状態です。
210 :
名無しさん@お腹いっぱい。 :2000/10/23(月) 02:06
DirectX8からはWin2000への対応が必須じゃなかったっけ? 対応ゲームが増えるといいんだけど
211 :
197 :2000/10/23(月) 02:36
>> 198 あ,そっちの絵の方があってる. その VSync は割り込みじゃなくってポーリングで検出できるって話? なら同期描画はできるんだね.
212 :
名無しさん@お腹いっぱい。 :2000/10/23(月) 04:14
>210 対応させるのは誰の仕事になるんだろう・・・。 1:DirectX8を使えば、Windows9x/Meでも2000でも動く! 2:あいかわらず環境の違いを、ゲーム開発者が吸収せねばならない。 さあどっち!
213 :
198>>197 :2000/10/23(月) 05:18
Windowsなどでは直接ハードウェアをいじれないため割り込みではなく ポーリングして信号検出をしています 検出してからページを切り替えるまで多少タイムラグはあるでしょうが ほとんどの場合ブランク以内におさまると思いますし 同期した映像更新は可能だと私は思いますよ
214 :
206 :2000/10/23(月) 06:23
>>208 ,
>>209 ある意味対処法無しって感じですか・・・
システム・ビデオ間の転送中に
なんか余計なことでもやってるんですかね?
215 :
名無しさん@お腹いっぱい。 :2000/10/23(月) 13:37
>>206 別にアセンブラはいらないけど、ピクセルモードは一致させないと遅くなるよ
216 :
名無しさん@お腹いっぱい。 :2000/10/23(月) 19:02
>212 当然開発者の仕事でしょう。 DirectX以外にも、APIで95系とNT系で動作が違うものもあるし。 開発はNT系でやってテストは95系も含む、ってのが基本だな。
217 :
212 :2000/10/23(月) 22:32
>216 やはりそうなっちゃいますかね。 既存のものはあきらめるとしても、8で両対応にするために 余計な仕事が増えてない事を祈るのみです。
218 :
名無しさん@お腹いっぱい。 :2000/10/24(火) 01:30
ゲイチュ「オマエラ!2000で動くようにしないと、DX8は使わせないぜ!」
>>218 DX8が動かないなら2000買ってやらんぞ!
220 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 03:22
ここってゲームプログラミング相談室ですよね? ちょっと質問なんだけど、加算半透明か、もしくは加重平均の半透明 を使って、コーヒーゼリーって表現できないですかね? 宝石でいうと黒曜石みたいなの。コーヒーゼリーの方がわかりやすいか。 あと、よくアニメである黒い光とかってどうやって表現したらよいでしょうか? 白い光は加算半透明でテクスチャ貼っつけるだけなんですが・・・。
221 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 09:58
222 :
名無しさん@お腹いっぱい。 :2000/10/26(木) 18:43
>221 >オイオイ、黒い光ってどんなんだよ。 >光を反射もしくは放射してないから黒いんじゃねーか。 その表現がわからないから、コーヒーゼリーとか なめたこといってたんですが、紹介してくれたところに書いてありました。 ありがとうございます。減算かなるほど。
223 :
名無しさん@お腹いっぱい。 :2000/11/05(日) 07:58
色々知りたいのでage EasyLinkLibraryは初心者にもオススメですか?
224 :
ポエマー :2000/11/05(日) 08:37
黒い光: 黒胡麻の油で灯したランプ。 梟が昼間に掲げて飛ぶらしい。
225 :
厨房 :2000/11/06(月) 03:29
作る予定があるわけじゃないのですが、ふと思ったので質問です。 42.195kmフルマラソンのゲームをつくるとします。(シミュレートするだけでもOK) 選手の位置ってどう表すのがベストなんでしょうか? 位置というのは画面内で選手が表示される位置ではなく、コース全体から見た選手の位置です。 横5列までとか決めておき、その選手がどの列にいるかの情報と、あとは今いる場所 (走った距離)があればOKなんでしょうか?
226 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 03:34
>>225 どんなゲームだ?遊びかたが想像できない。さすが厨房。
一回テレビ中継見たら? 本物知らなかったら、シミュレートなんて出来ないよ。
228 :
225 :2000/11/06(月) 03:52
遊び方は別にどうでもいいんですよ。(だからシミュレートでOKと書いた。 けどシミュレートってのも捨ててください(笑 ) 例えばレースゲームや競馬ゲームなんかでは、走っているキャラの位置情報 をそれぞれにどうやって持たせているんでしょうか?
229 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 03:57
>228 気を悪くするかもしれないけど、もうちょっと簡単なゲームを 作ってみるとかして、経験積んでからでないと 解答しても理解できないと思う。
230 :
225 :2000/11/06(月) 04:08
1人の選手のスペースが縦2m、横1mだとすると…とか考えたのですが、 フルマラソンだと42.195*1000メートルなので、けっこうデカい数値に なりますよね。こういうもんなんでしょうか。 でもきっと229がおっしゃってるように、厨房にはわからない別の方法で やってるんでしょうね・・・
231 :
229 :2000/11/06(月) 04:11
大まかな管理情報を持つとか、 分割して管理するとか、そういう発想は出ませんか?
232 :
>228 :2000/11/06(月) 04:16
遊び方も決まってないのに、どう表すと 「ベスト」なのかなんて決まりませんよ。 何か勘違いなされているのではないでしょうか?
233 :
(* :2000/11/06(月) 04:37
>>232 「遊び方」ってルールのこと?関係ないんじゃないの?
そういう意図での質問ではないみたいだし。
231の答えで充分だと思いますが。
234 :
>233 :2000/11/06(月) 04:48
遊び方=ルール=操作と考えるなら○ しかし遊び方というのは、演出であるとか なにを楽しむのかということまで含むので それによって何がベストなのかは変わってあたりまえ
おれなら、コースをブロックに分割(曲率の変わるあたりを基準に)して、 ランナーの位置はブロック番号とブロックの始点からの道のりの距離、道路の 端からの距離で管理するな。
236 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 10:37
以前PC98上のDOSでへぼいシューティング作っていたのですが、 練習もかねてまずAT互換機のDOSに移植してみたいと思います。 Winでできればいいんですが覚えることが多くいきなりできる自信がないので順を追ってやろうと思ってます。 それで、AT互換機の割り込みやポート等 ハードウェアについて参考になりそうな書籍やWebサイトをご存知なら教えていただけなでしょうか?
一応、言語はCでやるつもりです。
238 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 10:42
>>236 最終的にWindowsでやりたいなら、AT機のDOSの知識なんて
何の役にも立たないのでWindowsで勉強するのが良いのでは?
239 :
238 :2000/11/06(月) 10:49
追記。俺はPC-98x1のハード(以下98)はよく知らないから何とも 言えないが、98とAT機のDOSプログラムの違いなんて、いくつか のI/Oポートの違いと画面周りだろう(音に関しては無視した くなるくらい種類が多い)。 I/OポートはWindowsのシステムのプロパティ見れば判る。 画面周りはVGA BIOSかVESA BIOS EXTENSION(VBE)辺りをキーに 検索すれば何かヒットするかも。 Allegroだったかな?ゲーム作成のためのライブラリがあるので それを利用するのも良い。
>>239 98のI/Oポートは1バイト飛ばしでアクセスする必要があったりして
結構めんどうだよ。
画面もVGA BIOSなんか無い。
#AT互換機もどきの98を除く
241 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 13:12
>236
ああ、昔やったなあ。Windows普及で無意味になったけど。
音以外は簡単に移植できる。BEEPだけなら別。
GRCG/EGCと、VGAのGCの使い方は違うので、描画まわりでちょっと悩むかもしれません。
確かGCには4プレーン同時読込み(逆だったか?)がないんで、
そこを直すくらいですけど。
うろ覚えの俺の話を聞くよりは、ここにそのものがありますんで
参考にされては? PC-98x1で開発されてるなら、これでじゅうぶんでしょう。
http://www.yo.rim.or.jp/~sawara/stg/index.html
242 :
241 :2000/11/06(月) 13:22
どうしても書籍がほしければ、以下の2冊は必携かと。 ●「THE Programmer's PC SOURCEBOOK」トム・ホーガン著 SE編集部訳編 ISBN4-915673-63-4 5200円 翔泳社 アスキーから出ていたPC-9800テクニカルデータブックのような本。 絶版のような気がする。 ●「PC&PS/2 VIDEO SYSTEMSプログラマーズガイド」リチャード・ウイルトン著 SE編集部訳編 ISBN4-915673-49-9 6000円 翔泳社 MDA/CGAからVGAまでのビデオカードの扱い方や、ビデオBIOSの使い方、 基礎的なグラフィックのアルゴリズムまでカバーしている。 こっちも絶版かな? サウンドについても書籍がありましたが、個人では買いませんでした。 書名とかも忘れてます。買っておけばよかったなー。
243 :
VBプログラマ(三級) :2000/11/06(月) 17:18
DirectXの知識はほとんどないのですが、 DirectXオブジェクトはオブジェクトを作成したスレッド以外の スレッドから参照できるのでしょうか? ちなみに、VC6を使用しています。
244 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 21:48
VGAって480x480なら16色じゃなかったっけ? 素直にDirectX使ったほうがいいと思うけど
245 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 21:48
あう、間違い640x480
246 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 22:05
>244 VGAはニゴロだよ。16色はEGA。
247 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 22:14
>244 236は読みましたか? >246 EGAのは640*350*16色。 640*480*16色モードは、VGAにしかありません。 PC-9801のゲームを移植するならこのモードを使うしかない。 VGAには320*200*256色モードもあるけどね。
248 :
名無しさん@お腹いっぱい。 :2000/11/06(月) 22:47
MIDIの演奏について質問です。 MCIで演奏させてるのですが、MIDIをファイルとしてではなく、 リソースとして持たせて演奏させる方法はないでしょうか? ネット上はそれなりに検索してみたのですが、見つかりませんでした。 ファイルがたくさん散らかるのは嫌なので、できればMIDIもまとめてしまいたいのです。
>>248 邪道ですが・・・
リソースとして取りこんだものを必要なときのみHDにコピーし演奏。
不用になったら削除。
251 :
248 :2000/11/07(火) 00:52
>250 ありがとうございます。 それも考えたんですが、まともな方法があるなら知りたいと思いまして。 やはりMIDIはファイルで置いておくしかないんでしょうか。
252 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 05:47
>リソースとして取りこんだものを必要なときのみHDにコピーし演奏。 ほう、んで、そのプログラムは途中でPCをリセットするたび MIDIファイルを残してくれると・・・
>>238 -239
Win 上でやったほうがよいというのは確かにもっともだと思います。
興味という点でもDOSでやってみたくもありますが
もう一度考えてどうするか決めようと思います。
PC98と違うグラフィックチップでの描画動作がネックみたいです。
そのチップ名で検索してみます。
>>241 ええ、GDと処理が全然違うそうですね。
教えていただいたサイトではキャラの描画がどうも1ドットごとのようですね。
当時は話にならないくらい遅いから直接メモリに書込んでいたのにうーん、今のCPUなら確かに楽勝か。
これも参考にさせていただきます。
>>242 あ、テクニカルデータブックを98の参考にしてました。
その本がちょうどよさそうですね。
ありがとうございます。本屋と図書館あさってみるとします。
254 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 08:05
>途中でPCをリセット これにきっちり対応してるソフトって、あんまりなさそうだが…
255 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 08:34
Temp に残るのなら仕方ないんじゃないか? わかる奴は消すし。 注意書きにこういう形式のファイルが残るかもって書いておけばいいんじゃないかね。
256 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 08:35
MCIはファイルを扱うことが前提の関数だから、これを使ってる 限りリソースから直接扱うのは無理でしょ。 DirectXのスレッドなんで、DirectMusic使いなさい、と言っておこう。
257 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 08:48
>254 >255 かなり強烈な理論だと思う。 ちなみに何MBまでなら許せる範囲?
>>252 途中でリセットって、そんなことを日常でやってたらどんどんファイルが壊れていくぞ
そんなことを考慮する必要性無し
259 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 12:34
>そんなことを考慮する必要性無し しかし、世の中には限度をしらん連中というものがいるのだよ。 あるエロゲで圧縮した画像ファイルを1度Bmpファイルに直して ロードするというなんとも奇妙な奴がいたのだよ、そんでそのソフトに バグがあって決まって同じようなところで止まるのだね。 そのたびに始末されてないBmpファイルが溜まってって100MBに なってたよ。
260 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 12:46
>259 何てソフト? 同人? そんなソフトは名前公開しちゃえ。
261 :
VCのオプティマイズは :2000/11/07(火) 13:46
すごいっすな。 DEBUG...30FPS RELEASE...45FPS こんなに変わるもんか・・・俺のコードがへぼいんかなぁ・・・
>>259 どちらかというと、限度を知らんのは作った奴だと思う…
263 :
( ´∀`)さん :2000/11/07(火) 14:52
>261 デバッグコード(シンボルや置き換え)が無い分キャッシュの効率が上がるから コードのヘボさ以外にも要素はあるよね。 アプリでは最適化OFFが鉄則だけど...
>>263 >アプリでは最適化OFFが鉄則だけど...
ローカルルールを鉄則にするな
265 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 15:58
ローカルな鉄則なんだろ
266 :
名無しさん@お腹いっぱい。 :2000/11/07(火) 18:29
>261 FPS可変式でプログラムしてるの? 3Dゲーかな。
267 :
名無しさん@お腹いっぱい。 :2000/11/08(水) 11:56
Win自体はサイズ最適化でビルドしてるってどっかに書かれてたな・・・
268 :
名無し!!! :2000/11/08(水) 20:42
>>261 MFC使うともっと変わるよ。あと、上位版の最適化
オプションもかなり効く。って、みんな使っているのは
上位版?
>上位版 (゚д゚)ハァ?
270 :
>>268 :2000/11/09(木) 00:19
? Professional Edition(通常版) と Enterprise Edition(上位版) の コンパイラに差があるの?俺知らなかったんだけど Standard Edition(学習教材)の 最適化機能が省かれてるという話なら それは全く別の問題だからパスな
271 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 00:56
PCゲームの開発でSTLを使ってますか? 速度・消費メモリ・ヒープの断片化その他で 問題になることがありましたら教えてください。
272 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 01:15
>271 不用意に使った場合のコードサイズが最大の問題
Standard Edition 使ってるから最適化ってやったこと無いんだけど、 やった場合とやらない場合ってどれくらい違うものなの?
274 :
VC6.0Pro>273 :2000/11/09(木) 02:44
void strcpy( char *dst, const char *src ){ int i; for(i=0;;i++){ dst[i] = src[i]; if(dst[i]=='\0') break; } } 最適化有り ?strcpy@@YAXPADPBD@Z PROC NEAR ; strcpy, COMDAT ; File C:\usr\vc\sample\strcpy\strcpy.cpp ; Line 5 mov edx, DWORD PTR _src$[esp-4] mov eax, DWORD PTR _dst$[esp-4] mov cl, BYTE PTR [edx] ; Line 6 test cl, cl mov BYTE PTR [eax], cl je SHORT $L280 sub edx, eax $L270: ; Line 5 mov cl, BYTE PTR [edx+eax+1] inc eax ; Line 6 test cl, cl mov BYTE PTR [eax], cl jne SHORT $L270 $L280: ; Line 9 ret 0 ?strcpy@@YAXPADPBD@Z ENDP ; strcpy 最適化無し ?strcpy@@YAXPADPBD@Z PROC NEAR ; strcpy, COMDAT ; File c:\usr\vc\sample\strcpy\strcpy.cpp ; Line 2 push ebp mov ebp, esp sub esp, 68 ; 00000044H push ebx push esi push edi lea edi, DWORD PTR [ebp-68] mov ecx, 17 ; 00000011H mov eax, -858993460 ; ccccccccH rep stosd ; Line 4 mov DWORD PTR _i$[ebp], 0 jmp SHORT $L270 $L271: mov eax, DWORD PTR _i$[ebp] add eax, 1 mov DWORD PTR _i$[ebp], eax $L270: ; Line 5 mov ecx, DWORD PTR _dst$[ebp] add ecx, DWORD PTR _i$[ebp] mov edx, DWORD PTR _src$[ebp] add edx, DWORD PTR _i$[ebp] mov al, BYTE PTR [edx] mov BYTE PTR [ecx], al ; Line 6 mov ecx, DWORD PTR _dst$[ebp] add ecx, DWORD PTR _i$[ebp] movsx edx, BYTE PTR [ecx] test edx, edx jne SHORT $L273 ; Line 7 jmp SHORT $L272 $L273: ; Line 8 jmp SHORT $L271 $L272: ; Line 9 pop edi pop esi pop ebx mov esp, ebp pop ebp ret 0 ?strcpy@@YAXPADPBD@Z ENDP ; strcpy
275 :
NANASHI :2000/11/09(木) 02:53
>>261 MFCってどのへんに使うの?
使ったこと無いからわからん・・・
>>271 自分はSTL使いまくりです。
一番良いなと思う部分は安全性ですかね。
ツールとか作る時はifstreamやsstream等のクラスも便利です。
問題点は
>>272 さんと同じ。テンプレートだから。
テンプレートなんだから、コードサイズがでかくなる のはまぁ仕方が無いと思うけどね。 ただ、STLのソースに神経割くデバッグ作業ってのは 考えるだけで萎えてくるものがある。 #俺、あのソース読んでるとドッと疲れが溜まるんだよね
277 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 12:40
STLが安全ってのが分からない。 あとsstreamが便利ってのも分からない。
278 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 16:57
279 :
吾輩は名無しさんである :2000/11/09(木) 18:13
何かあったとき、あんなソース読みたかねーよってのがアレですな>STL というか、どっかに読みやすいSTLがあれば済む話なのか?
280 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 21:47
>275 私はstream関連のものよりvectorやlistやstringクラスが 最強でステキだと思いました。 STL嫌だよ派がいるみたいですがC言語で配列などを使って やるよりゃよっぽどいい気がするのですが・・・。何が駄目なのでしょうか?
281 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 21:58
>278
この人さ、お話楽しいのはいいんだけどさ、たまにめちゃくちゃな
こと書いてない?例えばこの↓CB回ってめちゃくちゃじゃないか?
http://www.sun-inet.or.jp/~yaneurao/rsp/ yaneGameSDK2ndは、まあ、何も知らん人なら
参考程度で止めとけって、感じか?
ビデオボードと喧嘩する時代でもネ−べ。
もしどうしてもシステムメモリオンリーで逝くなら
アセンブラでMMX必須だし。それでもあんまりあれだけどな。
282 :
名無しさん@お腹いっぱい。 :2000/11/09(木) 22:32
>280 vector, list, stringなどは自作で実装してしまった方が 軽くてサイズも小さいです。この辺のクラスはライブラリ製作の 勉強には持ってこいですしね。
>>281 DirectMusicの話のところも、かなり勘違いが入っている上、
偉そうにSDKのソースを見ろと書いてあるので見てみると、
読み込んで再生するだけのクラスしか無い
あれじゃタイミングがどうこう以前に再生と停止しかできないじゃん
284 :
NANASHI :2000/11/10(金) 04:15
>>282 vectorの実装ってそんなに無駄あった?
どの辺が軽くなるのかな?
確かにクラス宣言自体は大きいけど・・・
うむぅ・・・パワーアップできるならやっときたいなぁ。
stringは他のクラスとの連携があるからあんま改造しようとは思えない。
285 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 05:57
>282 うーん、勉強にもってこいっていっても、問題はみんなで使うライブラリに 自作のvector,list,stringなどを入れること自体が害だと思うんだよね。 別に軽いとかそういう問題じゃなくて、できるだけ自分で作る部分を少なくする のが目的だからねぇ。自分で作ると思いもしなかったバグとか出るでしょ?必ず。 それに比べて、STLならバグがあったらもう他の人に報告されてるでしょ?
286 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 08:47
>284、285 っていうか、listやstringのためだけにSTLをインクルードするのは 無駄があるって話じゃないの?特にゲームの場合は。 ウチの会社ではその辺の基本的なクラスは全部自社製だけどね。 デバッグもしやすいし。
287 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 10:27
>listやstringのためだけにSTLをインクルードするのは >無駄があるって話じゃないの? 無駄があるって何が?STL呼ぶとなんかおきるの? >全部自社製だけどね。 この開発費こそ無駄じゃねん?
288 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 11:28
>デバッグもしやすいし。 現時点でこれ、重要だな。 はやくデバガ、進歩すれ (´ー`)ノ
289 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 11:59
290 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 13:50
つーかstringクラスなんて一日で作れるじゃん。
291 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 14:03
>>290 うわー、パワフル。とてもそんなに自信ありません(煽りにあらず)
std::string並の性能と機能を実現して、きちんとテストケースを書いて、
デバッグまで含めたら... タイヘンだと思うんですけどねぇ。
292 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 14:05
まずはSTLを使って書いて、アルゴリズムの正当性を確認する。 他の部分も一通り作ってから、性能測定する。 遅いところの原因がSTLだったら、自作クラスで置き換えて行く。 というぐあいに進めようと思ってます。プロジェクト完了してないので 脳内で終わるか、実績になるかはまだ謎。
293 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 14:50
>289 なるほど、キチだったのか・・・ >290 きみは間違い無く天才だ。まじで。
VC++5.0の頃のstring実装は結構ダメダメだったような気がするのだが 最近VC++6.0試したら早くなってるのに気付いた。 確か昔は、代入やアペンド演算で、既に保持しているバッファで サイズ的に足りていようが足りていまいがおかまいなしにバッファを 再構築しており、reserve()は何の役にもたっていなかったはず。 今のやつはちゃんとしてるね。 for (i = 0; i < 100000; ++i) s = "hello, world"; は、charバッファにstrcpyするのにくらべて速度的に 遜色が無かった(さすがに全く同等の速度は出ないが)。
295 :
吾輩は名無しさんである :2000/11/10(金) 17:41
それはテスト手法にモンダイあるような……。 というか、そもそもリアルタイムゲームにstringは使いたくないよう。 OS自体がリアルタイム用途じゃなければ(Windowsとか) どうでもいいのかも知れないけれど。
296 :
吾輩は名無しさんである :2000/11/10(金) 17:46
>>全部自社製だけどね。 >この開発費こそ無駄じゃねん? 用途が限定されてるから(ゲームのタスク管理とか) STLほどガチガチに堅固かつ機能的でなくてもいいんですよ。 あんなものゼロから作ろうとしたらそりゃヤバイけど。 双方向リストのコンテナ程度、一瞬で作れるでそ? というか、大抵の人は既に作成済み、 現場で運用済みな類のものだと思う。
リアルタイムゲーム用にはSTLはオバースペックだろ。 自分で簡単な物をチョイと作ってそれで十分間に合ってるだろふつー。
298 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 21:10
>296、297 それが正論。 リアル厨房はもう反論せんでよろしい。
299 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 21:38
んで、結局STLってどのくらい遅いのでしょうか? 測り方がわからないんですけど・・・。 具体的には、どこがどのように遅いかが知りたいです。 例えば配列のサイズを変える時が遅いとか、値を入れるときが遅いとか 使っているだけですでに遅いとか、値を取り出すのも一苦労とか。 ただ遅いって言うのもプログラマとしてどうかと思うので、 その辺が知りたいっす。まず、測り方が解りません。 どこがどのように遅いのでしょうか。私が良く使うvectorクラス 辺りで説明してくれるとありがたいです。
300 :
>299 :2000/11/10(金) 21:50
なんでよ?計ってみればいいじゃん。 VCのプロファイラかQueryPerformanceFrequency/Counter使えば 計れるよ。項目はこんなモンかな ・項目の追加(拡張あり・なし) ・項目の読み取り(シーケンシャル・ランダム) ・項目の削除(シーケンシャル(先頭・末尾から)・ランダム)
301 :
名無しさん@お腹いっぱい。 :2000/11/10(金) 23:17
まあ、良く解らないので自分がきになるとこを測ってみました。 こーいう感じでよろしいのでしょうか?ずれたらすみません。 //リンクでwinmm.libを呼んでいます #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #include <vector> using namespace std; #define NUM 1000//00 void main() { vector <double> Giko; double Mona[NUM]; double s; int Begin,End; //確保する Giko.reserve(NUM); Begin = timeGetTime(); for(int j=0;j<1000;j++){ for(int i=0;i<NUM;i++){ s = Giko[i]; //s = Mona[i]; } } End = timeGetTime(); printf("%d",End-Begin); getch(); } 結果は Debugで NUMが100000のとき Gikoが43921 Monaが 5975 Debugで NUMが1000のとき Gikoが396 Monaが 20 Releaseで NUMが100000のとき Gikoが10591 Monaが 5691 Releaseで NUMが1000のとき Gikoが67 Monaが25 という結果になりました。 ってか、STLホントにおっせー。 ってか、ホントかこれ?間違えてませんよね? ちなみに環境は Pentium2の400MHzでメモリ64MBです。 VisualC++6.0のStandardEditionです。
302 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 01:02
>>300 プロファイラ動かんよ?
俺んとこのVCバグってる?
303 :
>302 :2000/11/11(土) 01:17
この情報によって お客様の疑問/問題は解決しましたか? ●はい ○いいえ 送信
305 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 05:34
>>304 みんな「いいえ」を送信するよな? な?([Y]/y)■
306 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 12:45
STLはiostream系が妙に遅かったな。バグか?
complex,stringに続き、また現れたな。 何でもSTLだと思ってる奴。
308 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 18:28
309 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 19:36
人柱の断末魔が聞こえなくなってから導入予定。 他のMS製品よりはマシだろうけど。
310 :
名無しさん@お腹いっぱい。 :2000/11/11(土) 22:40
日本語ヘルプ入ってます?
311 :
人柱 :2000/11/12(日) 11:55
とりあえず突っ込んだ。 忙しくていじってないが。
312 :
にゃにゃし :2000/11/14(火) 15:06
ぬぬぬぅ。ちょいと気になることがあります。 あんま調べてないんですけど、 Win2000だとtimeGettimeが10ms単位の精度しかないようなきがします。 この辺詳しい人いらっしゃったら、詳細きぼんぬ。
313 :
名無しさん@お腹いっぱい。 :2000/11/14(火) 15:29
>>312 NT系はそう。QueryPerformanceCounter 使えば。
timeBeginPeriodとか使うんじゃなかったっけ?よー知らん。
315 :
名無しさん@お腹いっぱい。 :2000/11/14(火) 22:53
>>314 正解。
ただQueryPerformanceCounterのほうが俺的には好み。
316 :
にゃにゃし :2000/11/15(水) 01:43
>>313 -315
もしかしてQueryPerformanceCounterって
0.1msとか検出できちゃったりしますか?
timeBeginPeriodはなんか使いにくそうですね。
>0.1msとか検出できちゃったりしますか? (゚Д゚)・・・・? もうただの甘えん坊さんだね
318 :
名無しさん@お腹いっぱい。 :2000/11/15(水) 12:45
> 312 名前: にゃにゃし 投稿日: 2000/11/14(火) 15:06 > 316 名前: にゃにゃし 投稿日: 2000/11/15(水) 01:43 こんだけ時間あったらフツーもう解決してるだろ。 プログラマならな。
いやいやまだコードは書いてません。
アクションゲーム作ろう思うんですが 縦長のキャラチップのサイズが32x64だとでかい気がします。 こういうのはどの程度がいいんでしょうか。 そのまんまでもいいんですけど気になって。
表示の条件をかけ
>>320 のモニタ上でデカイ気がするなんて理由なら、逝ッテヨシ!
322 :
名無しさん@お腹いっぱい。 :2000/11/15(水) 21:24
>320 どんなゲームかによって違うだろうが。 作っててデカイと思えば小さくすればいいし、 小さいと思ったらでかくしろ。 センスのある人間は、すぐサイズが決まる・・・。 残念ながら俺にはなかった。
とりあえず32x32ドットくらいを1ブロックとして、 30x20ブロックくらいの画面にしたいかなと思ってました。 確かにこの辺のサイズは実際やってみなきゃわからないところがありますね。
QueryPerformanceCounterいいかも。 これってPC毎に分解能違うんですね。
良かたねー #まだ引っ張るのかい?
326 :
名無しさん@お腹いっぱい。 :2000/11/17(金) 05:06
WinGL 使ってみようと思うんですが他にどういう選択肢があるでしょうか。 これだと比較的楽に組めそうなんで興味湧いてるんですが。 あとベータ版出てますがやっぱりそっちのほうがいいんでしょうか。
328 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 02:49
ちょっと質問なんですが、ゲーム作るときにツール類ではなくて、 自作のスクリプト言語を作っている人っていますよね?あれ私には非常に 理解しがたいんですが、実際のメリットとしてはどんなことがあるのでしょうか? 結局、使用者にはそのスクリプト言語を覚えてもらうわけだし、 バグが増えるし、なんだか2度デマにしか思えないような機能しか付いてない のが多くて、利点がよく見えてきません。 誰か説明お願いします。
Inside Windowsってまだあったの?
>>328 確かにバグは増えるかもしれんが、プログラムで最初から組むよりは簡単にできるはずだ。
プログラムを知らない奴でもそいつの作ったゲームシステムを
簡単に構築できればいいわけだから二度手間にはならんと思う。
ツクールシリーズでも内部で結局そういうもんを使ってると思うんだが。
GUIじゃないと駄目なんか?
たとえバグ持ちでもそのスクリプトの使い勝手がよければ
支持してくれる人達はいるだろうし、結局何やったってバグなんてありえる。
使い勝手悪けりゃ何の意味も無いが。
HSP みたいな言語は複雑なことはできんが便利だと思うぞ。
331 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 17:52
>330 それだけじゃ、あまり作る意味は見当たらないっすね。 まず、ツールで事足りるようなことが多いし、いまなら、 マウスでカチカチ+数値入力なんてものもサクッと作れるし。 結局なにやったって・・・ってレベルじゃないと思うんだよね。 このスクリプト言語で出るバグの量って・・・。 しかも、この打ったスクリプトをさらに自作コンパイラにかけるわけでしょ? たったこれだけの手順が増えるだけで最悪なんだよね。 ほんの少し、関数の使い方を覚えてもらって、ただ、ひたすら、数字入力を していただくわけにはいかないんでしょうか?
332 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 19:38
>331 なんか、ツールを作って使うのも、ただひたすら数字入力も、バグの 量がスクリプト言語にくらべて少ないかどうか解らない気がするけど…
333 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 20:24
>>328 アドベンチャーやRPGだとスクリプト言語は必須じゃないか?
スクリプト言語を使用しないとすると、シナリオライターがワープロなり
テキストエディタで入力したシナリオを手作業でデータに変換するのか?
フラグの判定などのルールそのものの間違い(こちらゲームデザイナのミス)と プログラムのバグ(こちらプログラマのミス)とを分離するためにはわりと使えます。 また、デザイナの意図どおりに画面演出をしたいときなども簡単なスクリプトを書いて もらうことがよくあります。 簡単な構造のスクリプトはわざわざコンパイラを作るまでもなく Cのプリプロセッサで処理できてしまうこともままあります。 331さんのいうようにひたすら数字を入力してもらう方法をとったこともあります。 約束事(入力者が覚えること)も少ないので、入力そのものは早くすんだのですが 数字そのものには意味がないので、間違いの発見がかえって大変になりました。 経験上、専用のスクリプトの方がスクリプトの記述者の意図がわかりやすいので バグは少ないし、発見しやすくなるようです。
335 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 20:51
プロジェクトに参加しているヤツがみんなプログラムに (orプログラム的な考え方に)長けているならスクリプトなど 使おうとは思わないなあ‥ スクリプトのバグはこっちの責任なんでこちらでなおします。 でも、ルールのバグはそっちの責任でなおしてくださいってな かんじの結局プログラマの自衛手段なのかもしれん。
336 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 23:06
328=331ですが、 なるほどいろんな利点があるんですね。 このへんは開発者の好きで良いような感じですね。 後はプロジェクトに参加している人の腕次第でやり方を かえればいいという感じですか。
337 :
名無しさん@お腹いっぱい。 :2000/11/18(土) 23:56
まあ、スクリプトが完成してれば後々使いまわせるってのも利点ではあるね
338 :
スクリプトは・・・ :2000/11/19(日) 00:29
●シューティングゲームのキャラの動き (複雑なものはc++のプログラムと連携させるケド) ●格闘ゲームのキャラのアニメーションシーケンス ●アドベンチャーゲームのメッセージや画像の制御 で使ってます。 スクリプト使わない場合って、アニメーションシーケンスとか、 やっぱ構造体の配列とかでやるのでしょうか?
339 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 05:54
>338 スクリプトじゃない=プログラムに直接 って考えは安易だと思わないか?
340 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 11:45
どこまでをスクリプト側で処理するかってのも考えどころだね。 ウォーシミュレーション系やったときは、CPU側のコマの意思決定の 部分はスクリプトで書いた。 そこから呼ばれるマップ評価はC++側の関数を使うのだけども さらにそれが利用する各コマの重要度を決定する部分はまた別の スクリプトにしたなぁ‥。 ゲームバランスとるのに後から書き換えたい部分はスクリプトで 速度を要求されるところは普通のプログラムでって使い分けが多いかな‥
341 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 15:58
利点として、 1)並列的に動作するものをスマートに表現出来る 2)命令キャッシュが大きなCPU(いわゆるパソコン)では コードで実現するより早くなる場合もありえる 3)スクリプトだと余計な事をさせなくていい。 またイベント駆動に慣れてない旧式プログラマにも仕事をしてもらえる 結論: 出来るだけモジュール化し、再利用性を向上させて仕事をするという思想 があれば自然な方向性であり、実際にやってみればその効率性は誰でも実 感出来るはず。 オブジェクト指向言語なら実行時型情報等のおかげで、 比較的実行コードとのインターフェースも容易だしね。
342 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 19:02
>341 せめて、プログラムの掲示板では 「早い」と「速い」の区別をつけてくれ。 で、内容もなに言ってるのか、ようわからん。
343 :
名無しさん@お腹いっぱい。 :2000/11/19(日) 19:21
>341 後、こういうのやめてくんねー。 >出来るだけモジュール化し、再利用性を向上させて仕事をするという思想 >があれば自然な方向性であり、実際にやってみればその効率性は誰でも実 >感出来るはず。 実際やってみればとか自然な方向とか、実際やってみて わかんねーから聞いてるのであって、自然とかやってみれば なんていわれても意味がないんだよね。 それに1,2,3のどれもへんてこな理論だよ。 1,2も怪しいけど、3なんてツール作ってデータを 吐き出させたほうが余計なことはさせなくてすむんだよ。 約束事も減るしね。というのは334の人もいってたじゃないか。
344 :
341 :2000/11/19(日) 21:21
ミスについてはスマン やってみて実感出来なかったのならそれも意見という事でヨシっちゅう事でしょう 個人の意見は尊重しますです。 というかすりあわせしなきゃならないような話じゃないです。 私としてはやってみて341に書いたような感想を持った。ちゅうだけの事です もっと言えば、クラスライブラリを作るのと同じくらいの手間と効果があるとね
345 :
341 :2000/11/19(日) 21:23
×手間と効果 => 手間で効果
334です。 1)並列処理〜ってのはがへんてこなリクツかなぁ‥ 私は、けっこう共感できます。 2)キャッシュ〜は、私はハード周りは専門外なのでパス。 実測したことはありませんが、体感的に速いと感じたことはないです。 スクリプトの仕様にもよるのかも‥ 3)は「余計なこと」の解釈が違うのではないでしょうか。 入力者に(文法などの)余計な理解を強いるのがスクリプト。 入力者がこちらの思ってもみないような余計なことをしてしまうのが 数値などでツールで入れさせるタイプ。 と私は解釈しました。 使いやすい専用ツールを作るのって結構手間だったりするので、私は あまり好きではないです。
347 :
名無しさん@お腹いっぱい。 :2000/11/20(月) 00:07
>>343 >実際やってみてわかんねーから聞いてるのであって
下手糞な煽りだ。具体的な指摘が何処にも無い。
とりあえずそちらの出している質問の発言番号で
名乗ってくれないか?
348 :
魁!名無しさん :2000/11/20(月) 02:38
2には同意しないが、1、3には同意。 つーか、ゲームのオブジェクトのような「状態マシン」の動作の記述に 高レベルのスクリプトを利用するってのは 割と常識的な解だと思うのデスが。 >3なんてツール作ってデータを吐き出させたほうが ツールでスクリプトが動けばもっといろいろできるじゃん。 とりあえず、Macromedia Directorの体験版でも試用してみれ。
349 :
348 :2000/11/20(月) 02:50
s/状態マシン/並列動作する状態マシン/
350 :
名無しさん@お腹いっぱい。 :2000/11/20(月) 07:09
実行したら強制終了になっちまったよー 一体どこが悪いのかよう分からんの
351 :
名無しさん@お腹いっぱい。 :2000/11/20(月) 07:40
複数のアイテムが並列に動くような処理を実現しようとすると a)状態遷移 b)リアルタイムモニタ(コルーチン技術) c)スクリプト のどれかになると思う。 どれでやっても、実現出来る事に差は無いよ サイズがでかくなってくると a)はとにかくデバックが難しい (もちろん真のプログラマはそんな事気にしないみたいだが) windowsだとb)はスタック領域の切替え制限があって自前で 実装するにはちょっと不安。(スレッドは超遅)
352 :
のま :2000/11/21(火) 17:06
私のスタンスは、 「後で調整や仕様変更が入る可能性のある部分は全てスクリプト」 せっぱつまった所で企画の連中の調整や仕様変更に巻き込まれたら 地獄ゆえ。 ただし、スクリプトをツールで自動生成する場合も多々あり。 (ツールにバイナリデータを吐かせると、その場は楽だがデバッグ がしにくいゆえ)
353 :
A :2000/12/01(金) 20:00
なぜか誰も触れないゲームのウィンドウ仕組みを知りたい!! ステータスウィンドウとかアイテムウィンドウ。 Windowsの窓のことじゃないよ。 ウィンドウを開く→アイテム→使う→テトラポット テトラポットを使った! しかし何も起こらなかった。 こんなの場合分けで一つ一つIF文とかでやるわけないし ちょっとちょっと不思議でジュースも飲めないよっ 仲良く教えてね
354 :
A :2000/12/01(金) 20:11
そうそう。 ただ聞くのも失礼と感じちゃうので思ってることを書くよ。 まずウィンドウを作るベースとなる基底クラスを作る。 このクラスにはウィンドウ内の文字を表示する関数、 枠を表示する関数とか最低限なものがあったりするのかな? このクラスを派生させて、コマンド選択のウィンドウや 顔とかのグラフィックを表示するウィンドウを作る。 で、コマンドなんだけど、これもまたいろんなコマンドのベースとなる 基底クラスを作って、コマンドウィンドウにこのコマンドクラスを 参照させるメンバ変数をくっつけたりしたりしてなんか出来そうな 気がしないでもない。 コマンドクラスにはイベントクラスなんかを持たせてあげれば、 そのコマンドが押された瞬間に各々のイベント発生 (画面揺らすとかアイツの家に移動とかそんなん)を発動できる。 のか?知らん。 イベントクラスって普通staticで持たせるのがいいの? C、C++言語を想定して書きました。 みんなぜったい答えてね。ヨーイドン
355 :
名無しさん@お腹いっぱい。 :2000/12/01(金) 22:27
>354 まず、自分の考えた通りに作ってみろ。
356 :
名無しさん@お腹いっぱい。 :2000/12/01(金) 22:37
>354 まあ、似たり寄ったり、そこまでわかってりゃ人に聞くこともねーべ。 あとは自分なりに色をつけていけばいいでしょ。
357 :
名無しさん@お腹いっぱい。 :2000/12/02(土) 00:28
ウィンドウシステムは木構造で表せるんだから おっしゃるようにクラスの仕組みを使うのも 一つの手ですよ。趣味でやってるなら、後は お好みで組んでいっても宜しいのでは。
スマソ ↑は353,354氏へのリプライね
359 :
名無しさん@お腹いっぱい。 :2000/12/02(土) 22:49
>354 コマンドやイベントは、クラスじゃなくてメソッドなのでは?
361 :
名無しさん@お腹いっぱい。 :2000/12/03(日) 01:16
>354 ウィンドウマネージャを造らなくちゃいけないってこと忘れてない? 実際作ってみればわかるけど、ほとんどの機能はWMが担うことになる からコマンドクラスとか、イベントクラスとか必要ないよ。 パフォーマンスを無視できるんなら使ってもいいけど。
>>361 そんなもん一般論では語れない。
(つーか、イベントやコマンドをクラス化しても、そんなに負担にならない場合がほとんどだと思う)
361の言うWMって、メッセージループ回したり、ディスパッチとかやる部分の事?
364 :
名無しさん@お腹いっぱい。 :2000/12/03(日) 03:46
んな、クラスにしただけでパフォーマンス言うの?(藁>361
動きが激しい(処理の重い)ゲームを作るのならどんな些細なことでも軽くするのは大事だよ。
366 :
354 :2000/12/03(日) 06:24
というわけで、ウィンドウマネージャっていうクラスだけは作成してみた。 で、ちょっと未来を考えてみた。 まず、staticでWMを作成。 そしてそれに登録するためのウィンドウ基底クラスを作成。 このクラスは表示すると表示しないだけの機能のみ。 その派生にシーン基底クラスを作成。 さらにその派生に各々のシーンクラス(タイトルとかゲームシーンね)を作成。 あとは別個にウィンドウ基底クラスの派生に、 テキストウィンドウクラス(枠と文字を表示するだけのクラス)、 コマンドウィンドウクラス(コマンド選択肢のあるウィンドウ)を作成。 WMで、一番優先度の高いウィンドウに表示権利とキー入力権利を渡させる。 で順に表示。 とここまではこんな感じでいいのかな? でもコマンドとイベントってクラスにしなくてもできますか? メソッドにするってことはそのウィンドウクラス専用に処理関数を 直接書くって感じ? ここで疑問が。 「はい」「いいえ」のコマンド選択ウィンドウってどこに属するのかな。 この窓っていろんなとこで使い回ししたいんだけど、はいといいえで 選んだ結果を返すところってどこだろう。 staticにしたイベントクラス? んなこたあない。 みんな意見をありがとう。 もっとちょうだいよ
クラスのコストは生成・消滅時と仮想関数呼び出しのオーバヘッドくらい 処理内容をトータルに計算して、効率の良いクラスを作るのが腕の見せ所
368 :
名無しさん@お腹いっぱい。 :2000/12/03(日) 10:20
クラスくらいどんどん使おうぜー。 new演算子書き換えて、固定領域配列内の 空き領域リストからメモリを確保するのだ。 ObjectPoolパターンなんてのもあるが、記述量やたら増えるし 速度保証がないのも変わらないのでお勧めしない。
369 :
名無しさん@お腹いっぱい。 :2000/12/03(日) 23:24
すいません、話の途中に悪いんですけど、 反発係数一覧表みたいなのどこかにありませんか? あの物質によって違う奴なんですけど。
370 :
名無しさん@お腹いっぱい。 :2000/12/03(日) 23:45
newとか仮想関数の呼び出しコストだけじゃないんだよ。一般的にクラ スにするといくつかの決まったインターフェイスを持つことになる。 でも最適化するときにはその決まったインターフェイスじゃ不十分な場 合が多い、そこでクラスのインターフェイスを変えることになるんだけど、 だったらWM書き換えるほうが合理的だ。 俺もクラスで書いてたこともあったが結局馬鹿馬鹿しくなることが多かった。 まあWindowsでゲーム作ってんならあまり関係ないかも
371 :
そこが2ch :2000/12/04(月) 00:29
全てのクラス定義はメモリ上に静的にロードされるけど 354のターゲットマシンはそれでも全然平気なんだろうね。 クラス設計に凝ることが出来ない状況もあるはずだけど 誰もそこに言及しないよね。
ゴメン訂正 静的にロードされる → 実体が最低でも一つロードされる #共有LIBやDLLで突っ込まんでね
>>371 だったら、そういう状況をお前が言及してみろよ。
(どうせ、ほとんどの人間には参考にならん特殊な状況なんだろ)
そりゃあんたのテクニークが下手なだけだろ>370
375 :
371 :2000/12/04(月) 02:47
あーはいはい。 そうムキになんなって。 以下、RPGを開発中という前提でその戦闘画面を例にあげる。 派手な演出をするために大量のデータが必要となり、これがメモリ を圧迫したとする。(このような状況に遭遇したことがなければ、 それは幸福) データ容量の圧縮だけでは限界があるということで、プログラムコ ードに手を入れることになったとする。 .oの中で割合デカめのやつを的に絞り、そのソースを眺め始めると 、凝りに凝ったウィンドウクラスの一群に目がとまった。 戦闘画面やマップ画面、イベント画面など、全てのシーンのウィン ドウシステムが、同じ基底を持つ派生クラスとして定義された代物 だった。 メモリダンプを見ると、戦闘画面中にも関わらずメモリ上には 街のNPCやらラスボスしか使わないようなコードがしっかりと 居座っていた。 設計変更の工数を見積もるとシャレにならない状況が見えたので 仕方なく画面のクオリティを落とすことになった。 〜終了〜
御愁傷様。運が悪かったね。>375 単なる設計の問題じゃないか。
別にマシンの環境にとらわれて作ってるわけじゃないからいいんだけど できればそういう無駄な部分も極力省いて作る方向ではある。 風呂に入ってるときもエアコン切って入ってます。 ってそういうことじゃないんだけど、省エネは大事です。 今作ってみたところでは、常にシーンはひとつだけ。 RPGじゃないけど戦闘シーンがフィールドシーンの上に窓のように 重なって処理されてたりだとかは設計上しませんでした。 あくまでステータスやコマンド選択の窓のときだけ重ねてます。 なのでメモリ取ってない。といいなー。調べてないけど。 ちなみに血液型はO型です。 シーンクラス生成するごとにそこらへんにあるオブジェクトは デフォルトの位置に戻っちゃう。 イベントのフラグで管理すればOKなのかな。 で、プレイヤーはどこに持たせるのがいいのかな。 マップ?シーン?メイン? 今はとりあえずシーンに。 適度に作ったら誕生日にプレゼントしてみます。
そうか。371よ。すまなかった。 スーパーファミコンでゲームを作るスレだったんだな。
だいだいタイトな部分はコードじゃないんだって。 グラフィックパイプラインがネックになるんだから。 それにメモリ足りない以前にボス戦とかは別工程で見積もるよ。 Now Loading ってメッセージを読んだことあるだろ・・? まっ、いいけどさ・・。
380 :
371 :2000/12/04(月) 07:24
>376 そうだよ。最低だろ? #だから仮定になってるんだけどな >354 勝手にRPGと仮定してゴメンな。 それと、354の設計方針が良いだの悪いだのとは 一言も書いてないので、その辺よろしく。 >378 いや、煽りにすらなってないよ。 ×××領域を×××切り替えする ×××××ベースの開発環境を引き 合いに出してどうすんの >379 >グラフィックパイプラインがネックになるんだから (゚Д゚)ハァ? 何のネックの話してんだよ(藁 話スリ替えんてんじゃねー
スリ替えんて → スリ替えて 宇津なので氏ぬ
>>380 結局、なんの説明もできないんだな。
ま、そんなもんか。。。
今時コンシューマ(PS、DC、PS2世代)でもこういう話にゃならんぜ。 371は旧石器時代の人間ちゅーことで =============================終了===============================
384 :
外野 :2000/12/04(月) 21:06
結局、371を正面から論破できた人間は居らんかったな。 2chプログラム板はこれほどにヌルいのですか?
これが2chの結論: 今やPS,DC,PS2の時代である。もはやメモリ容量に悩まさ れるような状況は考えられないことである。いったい何 時の話をしているのだ。 このような些末かつ稚拙な問題に悩まされていた時代は 遥か昔SFCの時代を最後に見たことも聴いたこともない。 我々は、いかに重厚長大なクラス設計を行なおうとも、 何の弊害に遭遇する心配もないのである。
でもまあメモリにとらわれずに作れるならクラスで作ってるほうが 個人的には楽しいよ。 ルパンより五右衛門の方が好きみたいな感じで。 使い回しもよく効くし。 なんかそう考えるとカプコンクラスとかマリオ64クラスとかありそう。 絵だけ変えるだけ。みたいな。 あれ?NGワード?
387 :
2chの常識 :2000/12/04(月) 23:32
2chは、妄想世界で組んだプログラムについて語ることを前提とします。 従って、いかなるハードウェアの制約も、2chプログラマの自由奔放な お花畑設計思想を阻むことは許されません。 2chは、ハードウェアの性能をギリギリまで使い切ろうと努力する行為を 無益で野蛮で時代錯誤で化石に等しいものと結論付けます。また、こうし た不毛な目的のために我々の洗練されたコーディングスタイルが曲げられ るような事態は、断固これを拒否します。
388 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 01:25
>>385 DCやPS2は知らんが、PSはメモリきついぞ。
PS2, DC は触ったことないから知らないけど PS触ったことあればとてもじゃないけど 「もはやメモリ容量に悩まされるような状況は 考えられないことである」 なんて言えないですよね どんなにメモリやハードディスクの容量を増やしても CD-ROMがDVDになっても 人の欲望が尽きることはないから 容量に悩まされない時代なんて絶対に来ないと 思うけどね・・・
クラス使うことがそんなにメモリの浪費かね? そりゃあんたおかしいって。371が話をもちだしたのは 速度がどうの、って話が発端で、いつのまにかメモリの 話にすりかえてるんだよ。 コードVMTの余裕すらもてないきついいまどきのコンシューマなんて メモリ128KBですか?だいたいはワーク用のメモリでつぶしてるん だから、その構造を検討しなおすべきで クラスの使用すら排斥するその貧乏根性はまさに ここがヘンだよ!っていいたくなるぜ。 クラス使わない分、変な変数つかって結局同じようなことになってる ことが多いんだぜ? ま、クラスつかわないことが良いならそれで再生産性、汎用性のない コードをずっと書いてな(藁
↑あ、読むときはココヘンのゾマホン口調で読んでください。
392 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 08:41
実際のところゲーム機のゲーム開発はOOPを利用してるんでしょうか? 私のところはPC用で、完全にOOPなんだけど。
>>392 やってるところはスーファミの時代からやってる。
(「完全なOOP」って、なんだか知らないけど)
>クラスの使用すら排斥するその貧乏根性はまさに どこにも排斥する書き込みは見当たらないんだけど。 371は実装を考慮しないような下手なクラス設計が あり得ることを書いてるだけだろ。 んなことは飯食ってる人間なら当たり前だけど、 お花畑2chでは非常識な話だから叩かれてるんだよ。
395 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 11:44
ゲームこそオブジェクトを扱うものですから、どんなコードだろうが オブジェクト指向には違いないというのは間違いですか? 一般的なOOPと違う場合もあるというだけでは?
396 :
名無しさん@お腹いっぱい。 :2000/12/05(火) 13:51
つーか、そもそも >クラス設計に凝ることが出来ない状況もあるはずだけど 俺なら省メモリになるようなクラス設計をしますが。 凝ったクラス設計=リソース食いとは限らんでしょう。
397 :
>392 :2000/12/05(火) 14:16
OOPちゅーてもいろいろありますが、とりあえず道具としてのC++の話なら、 よほど頭の古い(すまん)連中を除いてほぼ移行済みちゃうかなあ。 無論、Windows上ほど堅実な使い方はしないことが多いですが。 #DCやPS2くらいメモリと処理速度があるとそうでもなさそう。
>俺なら省メモリになるようなクラス設計をしますが。 >凝ったクラス設計=リソース食いとは限らんでしょう。 これ自体は正論なんだけど >>クラス設計に凝ることが出来ない状況もあるはずだけど この引用文の回答としては、上祐テイスト
399 :
名無しさん@お腹いっぱい。 :2000/12/06(水) 11:55
そもそも今時「クラス設計に凝ることが出来ない状況」が 何を指してるのかよく分からん俺は2ちゃん厨房扱いなのか? そうなのか?(*_*
400 :
名無しさん@お腹いっぱい。 :2000/12/06(水) 12:55
>399 締め切りは来週、もう3日間寝てない!ってな状況。
>399 そんなことはありませんよ。それは被害妄想というものです。 むしろあなたは私達と同類、正真正銘2chの住人といえます。 あなたもこのお花畑が快適で仕方が無いのでしょう?
402 :
>400 :2000/12/07(木) 15:22
そんな段階でクラス設計してんじゃねー。 もうプロジェクト終了って感じだ。
>402 そういうところ結構あるよ。設計やってるやつらが 破綻レベルの遅れになってもいっこうに何も決められない ような、アホばっかりの会社だと。
あはー。 それウチだぁ
405 :
DPC :2000/12/08(金) 00:52
Windowsでダイアログボックスベースの簡単なゲームを作ろうとしたのですが、 キー状態はどうやって取得するのがいいのでしょうか? 現在は一定間隔でGetAsyncKeyState()でキー状態を取得しようと 考えているのですが、それだと何か押すたびに警告音が出てしまいます。 どなたかセオリーなど、助言していただけませんでしょうか? OSはWindowsでC++言語で作っています。
406 :
。> :2000/12/08(金) 01:04
>現在は一定間隔でGetAsyncKeyState()でキー状態を取得しようと ゲームなら、それでも良いかもしれない。
407 :
名無しさん@お腹いっぱい。 :2000/12/08(金) 02:49
>405 おっ、その状態はウィンドウプロシージャを無視したね。 メッセージキューが処理されずにいっぱいだよっていってんだろ。 メッセージキューが解らんときはMSDN詠んでくれ。
408 :
名無しさん@お腹いっぱい。 :2000/12/08(金) 02:54
> 現在は一定間隔でGetAsyncKeyState()でキー状態を取得しようと > 考えているのですが、それだと何か押すたびに警告音が出てしまいます。 キー入力でダイアログのメッセージキューがいっぱいになっています。 ゲーム進行中でも、ウィンドウメッセージは処理しなくてはダメです。 ダイアログは最初に WM_INITDIALOG メッセージが飛んでくるので、 必要な初期化処理が完了したらおもむろに下のような無限ループに突っ込みます。 while( GetAsyncKeyState(VK_ESCAPE) ) { // メッセージ処理部 MSG msg; while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } // CPU しばし休憩 Sleep(1); // ゲームのメイン処理関数 GameMain(); } ESC を押すとループを抜けるので、DestroyWindow でダイアログを破壊。 そのあとは WM_DESTROY で EndDialog を呼べばよいでしょう。 システムメニュー、IDOK やIDCANCEL の処理を 無効にしておかないと、勝手にダイアログを破壊されて 困ったことになりますから、そのへんは工夫が必要です。 (っていうか、素直にウィンドウ作りましょう)
409 :
408 :2000/12/08(金) 03:00
while( !GetAsyncKeyState(VK_ESCAPE) ) の間違い。 ああ鬱だ。。
410 :
DPC :2000/12/09(土) 00:14
ありがとーございます! 作るのが楽だったのでダイアログにしましたが、 その先が大変そうなのでウインドウ作りなおしました。すんません。 教えていただいたようにメッセージループ周りを変更しましたら、 とってもいい感じに動くようになりました!! 本当にありがとうございます!!
411 :
うっぽん :2000/12/09(土) 17:56
CreateDIBSectionで作成したDIBからDirectDrawのバックサーフェスに転送するのに ::BitBltを使っているのですが、これより高速なBitBltを作成することは可能なのでしょうか? とりあえず作ってみたら 8ms(::BitBlt) --- 32ms(自前BitBlt) となってしまい。かなり鬱になりました。 自前ビットBltの実装はサーフェスをロックしてCopyMemoryで転送するようにしました。 いまのままだとフォーマット変換はしていないので画像は化けてます。 環境は 画面: 800*600*16bpp Video : RivaTNT CPU : PII400MHz 128MB Memory です。 このあたり詳しい方よろしくお願いします。
412 :
名無しさん@お腹いっぱい。 :2000/12/09(土) 21:24
単純転送で、いくらなんでも4倍差はおかしいでしょう。 VRAMとシステム、どちらにサーフェスつくってます?
MMXでも使えば?単純転送でも4倍くらい速くなるし。
測ってみろよ、パイプラインちゃんとしてやれば速いから。
416 :
名無しさん@お腹いっぱい。 :2000/12/09(土) 22:15
>414 そう、残念ながらならないよね。32は32なんだよ。 >411 アセンブラ使うしかネー。
MMXってアセンブラじゃなかったのかなー?(自信なし) あと、知ってると思うけど、システムメモリから、VRAMへの転送は遅いよ。
sateってなんだ? <一人ボケツッコミ
419 :
名無しさん@お腹いっぱい。 :2000/12/10(日) 00:48
>411 だからよ。AGPって知ってるか? CopyMemory使ってるところから一括転送がしたいんだろ? だったら始めから何も考えずにDirectX使って ビデオメモリに置けばいいじゃん。 別に画像いじらないんでしょう? んで、DirectXについてるBltを使う。 そうすれば勝手にAGPがついてるマシンなら64Bitで 転送してくれるんだよ。 遅くなってるってことはDIBの関数がこの辺をやってくれてるん じゃない?もしかして。
421 :
名無しさん@お腹いっぱい。 :2000/12/10(日) 00:53
419 すまん、あふれてシステムメモリに置かれたときは。
422 :
名無しさん@お腹いっぱい。 :2000/12/10(日) 00:57
VRAM増やせば良いんだよ!
423 :
名無しさん@お腹いっぱい。 :2000/12/10(日) 01:21
>419 411をもっかい良く読みな。
VCはCopyMemory -> memcpy -> rep movsd に置き換える これより高速に転送されているならハードウェアのアクセラレーションが関わっている可能性が高い ちなみにMMXに関して誤解している人物がいるようだが rep-movesdよりMMXのレジスタを用いた転送が早くなることはない
rep-movesd -> rep-movsd
>>424 知ったか度チェック
MOVQのパイプの種類はUV,U,V,NPのどれか
またMOVQ同士のペアリングは可能か不可能かとその理由を挙げよ
これを考えれば自分がどんな馬鹿を言っているか分かるだろう
へー、難しい言葉知ってるねえ。 MOVQは原則的にはUVだろ。メモリ、整数レジスタにアクセスする場合にはUのみ。 ペアリングはメモリ、整数レジスタにアクセスする場合には不可。
GlobalAllocにGMEM_FIXEDでsrc用とdst用にそれぞれ8MB確保 計測はtimeGetTimeを使用 mov eax,8MB/8 lp: movq mm0,[esi] movq [edi],mm0 add esi,8 add edi,8 dec eax jnz lp を16回 mov ecx,8MB/4 rep movsd を16回 結果 MOVQ→4.536[sec] MOVSD→3.937[sec]
それじゃ遅くなるに決まってる。 moveqとaddを交互にしてみろ。
431 :
うっぽん :2000/12/11(月) 02:16
私、411です。とりあえずageさせて貰います。 問題点はCopyMemory(内部ではREP MOVESD)で転送したのと、 ::BitBltで転送したもので4倍近い差が出てしまう所です。 ::BitBltの逆アセのコードを見たことがないので、どういう実装になっているのか見当もつきません。 たとえ限界までアセンブラで最適化したとしても4倍の差が埋まるとは思えません。 処理内容的には単なるブロック転送なので、キャッシュヒットの効率化というのも難しいと思います。 ここから後は単なる推測なのですが、グラフィックカード上にSYSTEMメモリとビデオメモリ間の転送を 効率よく行う特殊な機能(ハードウェア?)があるのでは?と思ったのです。 結論的には黙って::BitBlt使っとけって事なんでしょうか・・・
432 :
名無しさん@お腹いっぱい。 :2000/12/11(月) 02:51
そこまでわかってんならこんなとこで聞くなよ。
433 :
名無しさん@お腹いっぱい。 :2000/12/11(月) 03:00
>431 だから、AGPだって逝ってんだろ!クルァ! DMA転送だっけ?
435 :
うっぽん :2000/12/11(月) 17:55
DDのプライマリサーフェスとバックサーフェスしか使わないんだったら DirectDraw使う意味ないことに気付きました。 ハードウェアブリッドもつかってないし。 フルスクリーンのGDIベースでやった方が効率良いんだろうか? とりあえずやってみよう・・・。 なんでこんな話題振ったかっていうと、 洋ゲーのスデンストライクっていうゲームが、 2MのVRAM+3Dハードウェア無し+1024*768の解像度 でばりばり動いているのを見てしまったからです。 (スペックから推測すればDIBを使ってるはず) ・・・まあいいやがんばろっと。
436 :
名無しさん@お腹いっぱい。 :2000/12/11(月) 21:48
>435 そのゲームのリンクくらい貼ってよ〜ん。気になっちゃう。 スデンストライクの「スデン」はSuddenの事?
437 :
名無しさん@お腹いっぱい。 :2000/12/11(月) 23:01
>435 なんで、そーゆー結論になっちゃうわけ? その洋げーがどんなにすごくったって、同じようなもんを 高スペックのマシン用にDirect3D使って組んだって、 世間の評価は大して変わらないよ。だったら、ハードウェア使いこなして 楽に組んでその分余った労力をゲーム自体の作りこみに向けた方が いいんでない? だって、ウィンドウズ上でのゲームの作り方って結構特殊じゃん。 俺は「PCゲーム業界に骨を埋めるぜ!」ってゆーなら 止めはしないけど、「そのうち、コンシューマでも組みテ−な」 って考えるなら、もっと柔軟に考えようぜ。 DIBの関数使っちまったら、汎用性も何も無いじゃん。 そろそろテクスチャ使っても大丈夫でしょうって感じの時代なのに なんで、そんなこだわるん?ちと教えて欲しいよ。 紙芝居エロゲならすまん。 低スペックのマシンでの動作が快適にならないのは当たり前だと 思うのよ。
438 :
名無しさん@お腹いっぱい。 :2000/12/12(火) 00:41
>431 後半の推測は当たっている場合もあります。 system→hardware 転送時にDMAを使うドライバは存在しますので。 また、これについてはAGPは必要条件でも何でもありません。単に 433がキティだったというだけの話です。 個人的な疑問ですが、OSのGUIへの依存度が少ないエンターテイン メント系アプリがGDIに拘る技術的な理由があるとすれば、それは 何なんでしょうかね?日本の特殊なマーケット事情がどうだとか いう戯言は横に置いといて。
439 :
うっぽん :2000/12/12(火) 08:26
>>436 自分も知り合いがやってるのを見ただけなので、
ちょっと解りません。ごめんなさい。
スデンはネタです。PCゲーム板の方ではそうなってるご様子なので。
>>437 PCゲームは趣味みたいなものです。
メモリをちくちくいぢりまわして画像を生成するのって楽しくありません?
αチャンネル付き画像の描画とかも可能ですし。
まあ自己満足の域は脱していませんね。
コンシューマーのゲーム作るのは食傷気味なのでいいです。
ちなみに私は、エロゲーは堪忍派です。
一段落付いたらGeForceでも買って、PixelShadeを用いた
自己満足3Dゲームでも作りたいですねぇ。
440 :
名無しさん@お腹いっぱい。 :2000/12/12(火) 08:27
>437 低スペックで快適に動くなら、それに超した事はないでしょ。 3Dカードに気を使ってるPCユーザーなんてまだまだごく一部だし、 HAL使わなくてもおもしろいゲームが作れるなら作って欲しいよ。
441 :
うっぽん :2000/12/12(火) 08:31
追記・連カキコスマソ 自分のアプリでGDI(DIB)に依存している部分は、デバッグ用のフォント描画の部分と、 最終的にバックサーフェスに転送するBitBltだけなので、GDI切ろうと思えば切れますよ。 前述の問題でかなり遅くなってしまうと思われますが。
442 :
名無しさん@お腹いっぱい。 :2000/12/12(火) 11:22
>439 なんだ趣味かよ。じゃあ話すことねーよ。 頑張ってな。 >440 はぁー、いつの時代の話やら・・・ (ただし、エロゲを除く)
443 :
名無しさん@お腹いっぱい。 :2000/12/12(火) 12:02
エロゲユーザーって、趣味のためなら出費を厭わないんじゃないの? HDDやメモリには金使っても、3Dアクセラレータなんか買わないか(藁
444 :
名無しさん@お腹いっぱい。 :2000/12/12(火) 12:06
DirectX使わない理由があるとすれば 「ノートパソコン」の一語に尽きると思うなあ。 今店頭で売れてるPCは5割がノートみたいだし、 ノートでDirect3D HAL想定していいようになるのまだ先の話みたいだし。
445 :
名無しさん@お腹いっぱい。 :2000/12/12(火) 12:20
446 :
ノートPCで3D :2000/12/13(水) 22:34
諸悪の根源NeoMagicがいなくなり、LynxEMがちょっと残る程度で、今はほとんど 3Dアクセラレータ搭載してるぞ。VRAM 4MBしかない機種もあるが。 今年になってからの話だから、去年までのノートPCは3Dは期待できないけどね。 そういう奴らには買い換えさせよう! 新インターフェースではDirectDrawがなくなって、2DもPSよろしくポリゴン描画 前提なのだし今後は仕方ない。
447 :
名無しさん@お腹いっぱい。 :2000/12/13(水) 22:46
>446 やったぜ!新世紀はすぐそこだ!
448 :
名無しさん@お腹いっぱい。 :2000/12/13(水) 23:24
>>444 DirectX でフルスクリーンで動くソフト作って動かないとメールが来るときがあるがそう言う奴はノート使ってる。
液晶は氏ね!
449 :
名無しさん@お腹いっぱい。 :2000/12/14(木) 20:42
>448 そうゆう場合、ノートに普通のモニター繋いで表示したらどうなる?
450 :
名無しさん@お腹いっぱい。 :2000/12/16(土) 15:36
>448 違うとは思うけど、エラー処理がヌルいとかいうオチだったら嫌だな
ノートだがフルスクリーンアプリ特に問題なく動いてるが‥? なにか他の問題ではないのか?
452 :
名無しさん@お腹いっぱい。 :2000/12/16(土) 22:57
オイラー角と行列の違いが解らん 教えれ
453 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 00:18
>>452 どこをどうやると同じなのかようわかりませんが・・・
各軸それぞれについての回転角度のセット((a,b,c)みたいの)を
オイラー角と呼んで、その回転を表す行列表現を算出することができる
というはなしで混合のしようがないと思う。
454 :
452 :2000/12/17(日) 00:32
455 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 00:40
なんか偉く読み違えた様だ。 すまそ。
456 :
C++勉強中 :2000/12/17(日) 01:27
ウルトラ初心者のスレと迷ったのですが、こちらでお願いします。 勉強がてら、ちょっとしたオープニングデモを作ろうと 思ったのですが時間ごとの管理?でちょっと詰まっています。 ///////////// ループ開始 static int time = 0; if( time < 60 ){ draw_text(); //60秒テキストを表示 } else if( time < 80 ){ draw_title(); //次の20秒はタイトルを表示 } else if( ・・・ } time++; ///////////// ループ終了 こんな感じで時間ごとの表示の管理をしているのですが time < 5000を越えたあたりで、さすがにスマートじゃないなと・・・ なにか良い方法ご存じの方、教えてください
457 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 01:43
そのレベルに合わせたら static int time = 0; static int stat = 0; switch (stat){ case 0: draw_text(); if(++time>60){time=0; state++;} break; case 1: draw_title(); if(++time>20){time=0; state++;} break; } な感じ?
458 :
456 :2000/12/17(日) 01:57
>457 うはぁ、ありがとうございます。これでループ一つに 50回もif判定しないですみそうです・・・。 > そのレベルに合わせたら そんな殺生な(^^;
case判定も似たような物だと思うけど… イベントの配列でも作って、順番に回せば?
460 :
456 :2000/12/17(日) 02:42
シーンクラスみたいの作ってリストで繋いで 回そうかとも思ったことがあったのですが・・・・。 これってデモ中に明確なイベントの区切りがないと駄目ですよね? それとも登場キャラごとに配列を持たせちゃうのですか?
>>460 だいたいだけど、
class Event { public: DWORD time; virtual draw(); /*...*/ } ;
class TextEvent : public Event { public: draw(); }
class TitleEvent : public Event { public: draw(); }
っていうのを作って、
{
Event* array[2];
array[0] = new TextEvent;
array[1] = new TitleEvent;
for (int i = 0; i < sizeof(array)/sizeof(array[0]); i++) {
if (getcurtime() < array[i]->time)
array[i]->draw();
}
ということを言いたかったのよ。
あ、ifのところ、whileの間違いね
463 :
456 :2000/12/17(日) 03:41
>>459 おおっ、なにか色々、一気にインスパイアされました。
C++ってこういう使い方すればいいのですね。
基底クラスの配列作ってその時表示する派生イベントクラスだけ
登録し、イベントが終わったら外す、なんてのも出来そうですね。
オブジェクト指向の便利さの一端をかいま見たというか・・・、
457さん共々大感謝です。ありがとうございました。
464 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 12:13
>>456 その手の処理はスクリプトにすると楽だよ。
今のやり方だと、最初の60秒を50秒に直すと
それ以下のイベントタイマー全部修正するハメになるね。
465 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 14:06
スクリプトのインタプリタにはYACCを使おう!
466 :
名無しさん@お腹いっぱい。 :2000/12/17(日) 14:29
つくったゲームのアプきぼーん
>463 C++の一般的な使い道、というかレーゾンデートルだと 思うんだが…みんななんだかんだいって、あんまりC++ 知らない人多いんだねえ。
468 :
名無しサソ :2000/12/18(月) 07:34
>>454 オイラー角は、姿勢に対する値が一意に定まらないという
致命的な欠陥を持っているよ。それに、ピッチ角度が90度に
なったらジンバルロックという現象が起こって、一軸が無効
になってしまうから、色々細かく場合分けしてあげないといけない。
クォータニオンを使うといい、とはよく言われるけど自分は
使ってない。真面目に力学計算とかをする必要がなければ、
そのまま行列を姿勢表現に使うのが普通ではないのかな?ただ、
これも計算を繰り返すと座標の直交性が失われて行列がおかしく
なっていく(ジオメトリ崩壊という奴ね)から、何回かおきに
行列の正規化をする必要があるよ。
自分は別にプロでやっているわけではないので、この辺プロな
人のフォロー求む。
>>464 ・・・音楽とタイミング取る度に40カ所以上修正してました。
根本から見直した今、おかげさまで結構いい感じです。
スクリプトやYACCとかはどんな物かすら見当つかないので・・・勉強
してきます。検索結果多すぎですが・・・・。キーワード、サンクスです。
>>467 勉強し始めの自分なんか参考になりませんよ。世間様はもっと上なはずです。
470 :
名無しさん@お腹いっぱい。 :2000/12/18(月) 20:33
いや、YACCに頼るほど高度な構文のスクリプトは必要ないと思うぞ。
471 :
名無しさん@お腹いっぱい。 :2000/12/21(木) 10:25
>>470 そうだけど、なれちゃえば頼った方が楽だね。
でもテキスト処理の基本とかないとつらいから、
始めは手で書いた方がいいかな。
472 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 03:09
プログラムって全然分からないんだけど、 どうしたらいいのですか? ファイナルファンタジー3みたいなのを つくりたいのですが。 みんな、どうやってプログラム言語覚えたの? 最初から、FF3作れないよね? 最初は、時計作ったりしていくの?
君の予想どうりそうしたほうがいいと思うぞ
例えプログラミングを極めたとしてもFF3はよほど根性がないと作れん。
475 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 07:27
>>472 >最初は、時計作ったりしていくの?
笑えた。(ワラ
476 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 08:00
ギコ猫でもゲームプログラマになれる、プログラミング実習課程教材。 Lv.1から順番にひとつずつ自力でパチモンを作っていきましょう。 Lv.1 ブロックくずし Lv.2 テトリス Lv.3 オセロ(CPUの思考ルーチンつき) Lv.4 パックマン Lv.5 インベーダー Lv.6 マリオブラザーズ Lv.7 スーパーマリオブラザーズ ... FF3っすか。Lv.32くらいですかね?
477 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 08:48
プログラミング難易度の順番はこうじゃないの? 敵の思考ルーチンの複雑度順。 Lv.1 ブロックくずし Lv.2 テトリス Lv.3 インベーダー Lv.4 マリオブラザーズ Lv.5 スーパーマリオブラザーズ Lv.6 オセロ(CPUの思考ルーチンつき) Lv.7 パックマン FF3はデータ量が膨大&アウトプットが3Dなだけなので難易度 は大したことないでしょう。
478 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 12:25
どうかな。テトリスの方が簡単だと思うが。固定ピッチテキスト画面で作れるしね:-) ブロック崩しは基本的には簡単だけど、ボールの反射の部分は実は考慮すべきパターンが かなりいろいろあって面倒。適当に作っただけじゃかなりあちこちボロが出る。 面倒といったって、しょせんLv.2程度の面倒さだけどね。 インベーダーが「やらなくてはいけないことが全て目に見えている」という意味では一番シン プルかもしれない。 追加希望 Lv.0 もぐらたたき LV.0.5 TVゲームテニス
479 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 14:49
Lv.-1 ヒット&ブロー
Lv. -3 サイコロもどき(精度のいいサイコロはLv 3ぐらいか?) Lv. -2 数あて
481 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 17:54
>FF3はデータ量が膨大&アウトプットが3Dなだけなので難易度 >は大したことないでしょう。 マップエディタやらシナリオスクリプトやらの設計・制作まで 考えないといけないから、そうでもないかも。 それでもLv.13くらいか?
482 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 21:36
今後は、 やっぱり、ゲームプログラマーだったら、 それなりの3Dソフト(MayaやLightWaveなど)を 扱えるようにならないとまずいのかな? まじレス求む。
483 :
VB厨房 :2000/12/25(月) 22:45
オセロのほうが簡単に作れるとおもうけど、 個人によって、レベルの上下って差が出るんだな。。 ブロック崩しのソース希望(あればだけど、公開してたらほしいっす)
484 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 22:45
だれか(プロの人など)476みたいなやつ、LV40ぐらいまで 書いてもらえませんか? 腕試しをしてみたいので。
485 :
472 :2000/12/25(月) 23:14
僕は、ちょっと無料のプログラミング言語「Hot Soup Processor」 というのを、ダウンロードして、いろいろしてるの。 まずは、時計を作ったの。それから、windowの端まで行ったら 跳ね返るのを作ったの。 こんな調子で作っていこうっと。 もぐらただきって結構難しそうな感じ。 マウスを監視しておくのかなあ?
486 :
472 :2000/12/25(月) 23:21
ブロック崩しも難しそう・・。 僕に出来るかなあ? キー押したら、バー動いてるし、 ボールも動いてる。 2つもどうやって同時に動かすのだろう? それに、ブロックの破壊も。 たくさんしないといけないけど、これを クリアーしないと進めないな。
488 :
VB厨房 :2000/12/25(月) 23:33
>472 すごくマイナーな言語?、Cをやれば、インプライズ社の フリーだし、Cマガジン買ってね。
多重カキコすまそ。
491 :
VB厨房 :2000/12/25(月) 23:35
わ〜い。\(´∀`)/
492 :
名無しさん@お腹いっぱい。 :2000/12/25(月) 23:40
オセロの最も簡単な思考る−ちん まずオセロのマスに対応した縦横8*8の配列を用意する その配列の要素に優先順位に応じた数値をセットする 例えば角や端には高い数値を逆に角の一つ前には小さい数値を セットする そしてそれぞれのマスに置いたらいくつのコマを裏返せるか 計算しそれぞれの要素に乗算していく そして勝負が終盤に近づくにつれて 最初の優先順位の数値を均等化していく その上で一番多い数値を持つ要素を探しだす
493 :
VB厨房 :2000/12/25(月) 23:42
| |/( ゚∀゚ )\| ウワーイ | | ∩∩ | | アヒャヒャヒャ  ̄ ̄ ̄ ̄ アーヒャヒャヒャヒャ ヽ(゚∀゚ )ノ 三 ( ゚∀゚)ノ .( へ)── <( )───────── / く ( ゚∀゚ ) く し / ミ 〜( 〜) 彡 ノ ノ ウレシイナ
つーか、検索結果をそのまま貼り付けたのは 「探せばすぐ出てくるぞヴァカホゲ」 という意味もあるのだが。 …伝わっていないのか?
495 :
オセロの作り方 :2000/12/26(火) 00:26
とりあrず検索エンジンで「ミニマックス定理」を検索。
496 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 01:18
難しい難しくないじゃなくて知ってるか知らないか。 ファイナルファンタジー作れてもやり方知らなきゃオセロは作れない。
どんなゲームでも作るだけなら簡単。(特殊な思考ルーチンを除く) RPGだってマップエディタ無しで作るのだって不可能じゃない。(後で死んでも知らん) 問題はどう効率良く作るかでしょ。 となるもう技術の問題じゃなくて知識の問題。 それこそ知ってるか知らないかだけ。 ゲーム作れたからって必ずしも能力(素質)が優れているとは限らない。 っていうか思考ルーチンと画像処理以外でなんかすることある?
499 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 06:00
>>498 では、「技術の問題」になるのは例えばどんなケースだろう?
500 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 07:18
>>499 誰もやってないことをやる場合とかハードウエアの性能を極限まで
引き出す場合じゃないの。
最初のバーチャファイターとか88のシルフィードとか。
「はい、作りました。プログラム動きました」 で終わるなら消防でも飯食ってけますな。
502 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 16:46
んじゃ世の中の99%のプログラムは知識の問題ッスか?
503 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 17:07
開発してるマシンでは動くのに他のマシンで起動すると動かない・・・ Windowsはコワイネ・・・ StretchDIBitsでGetLastError曰く 「不正なパラメータです」 だって。アハハハハ。 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- if (::SetDIBitsToDevice(GetDC(),0,0,BI->biWidth,BI->biHeight,0,0,0,BI->biHeight, lpBits,(BITMAPINFO*)BI,DIB_RGB_COLORS)==0) { throw exception("ERROR.HOGE."); } ※BIはBITMAPINFOHEADERね。 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- これの何処に間違えてる所があるんじゃい! しかもエラーの出る場所は起動毎に変わる。どういうことや! DLLのバージョン違い?DirectXのバージョン違い?わからん・・・・
>502 ところで、あなたは何の話で盛り上がっているのですか?
505 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 18:53
GetDC()に失敗しているだけじゃねーの? 解放してる?
そまんそん。解決しました。 GDIリソースの減少が原因でした。 GDIリソースなんて、すっかり忘れてました。 開発してるマシンはGDIリソースの残りが多めだったんでバグが出なかった模様。 今日は良い勉強になりました・・・
507 :
デフォルトの名無しさん :2000/12/26(火) 22:02
>>504 いや、ちと偏った考え方だよなーと思ってさ。
ゲイツばんざーい
510 :
名無しさん@お腹いっぱい。 :2000/12/26(火) 22:20
>>501 >「はい、作りました。プログラム動きました」
>で終わるなら消防でも飯食ってけますな。
おいおい。プログラマにそれ以外必要なんか?
まさか消防にプログラムはできてもデバッグはできないとか言い出すの?
企画は別の人間の仕事だし、なんだなんだ。何をいいたいんだ501は
まあ、飛行機だろうが核爆弾だろうが知識があれば作れるかもね。
513 :
名無しさん@お腹いっぱい。 :2000/12/27(水) 00:42
514 :
デフォルトの名無しさん :2000/12/27(水) 01:07
>>510 描画するのに毎回全部描き直すんでも「動く」は「動く」だからネ。
あとは売るソフトなら他人にサポートできないプログラマはカスじゃない?
作者しか使えないようなツールをシェアウェアで出してもね〜・・・
>>513 まさにその通りってレスだな(笑)
515 :
名無しさん@お腹いっぱい。 :2000/12/27(水) 01:15
>>514 そんなレベルの低いことを誇って………アタリマエの事じゃん。
俺はかなしいよ
516 :
デフォルトの名無しさん :2000/12/27(水) 01:25
>>515 でもすくなくとも514は間違ったことは言ってない(ワラ
こんな使いずらいものシェアウェアで出して売れんのか?
ってソフトはよく見かけるし。
517 :
デフォルトの名無しさん :2000/12/27(水) 01:39
ていうか、そもそも何の議論だこれ。
518 :
デフォルトの名無しさん :2000/12/27(水) 01:53
>>517 大幅に話が脱線しているだけだから気にしない方がいいよ
あからさまな煽りにまんまと釣られてるんだから世話ないよな
どれが煽りだったんだろう?
>520 まだ引きずるんだね
522 :
デフォルトの名無しさん :2000/12/27(水) 04:05
>516 >こんな使いずらいものシェアウェアで出して売れんのか? 世の中の94%のシェアウェアがこれに該当します。 体験版ですでに買う気無し。 売りもんにするならせめてユーザーインターフェースのデザインぐらいは 力入れてくんねー。って感じか。
>世の中の94%のシェアウェアがこれに該当します。 細かいな(w
すみません自作自演でした。
525 :
デフォルトの名無しさん :2000/12/27(水) 14:06
>524 522は俺なのに!? お前は誰だ!? 別に意味も無くage
526 :
デフォルトの名無しさん :2000/12/27(水) 18:54
パワー、パワー (高度警報音)
ああ、終わりだ、終わりだ
なんだ、もう終わりか?
ドーンといこう
530 :
デフォルトの名無しさん :2000/12/29(金) 09:08
>>326 他に有名なのはelとかYaneSDKとかかな?
俺はWinGLしか使ったことないけど。
>>327 InsideWindowsってまだあったの? 季刊とかで復活してたのかな?
531 :
デフォルトの名無しさん :2000/12/29(金) 09:09
>>236 master.libじゃダメ?
master.libならPC-98もDOS/V機もほぼ同じに扱えるけど。
っつーかそれじゃわざわざDOS/V上でゲーム作る意味がないのか。
結局ダイレクトにWindowsプログラムに移行した方がいいんじゃないすか?
WinGLとか、YGSとか使って。
532 :
デフォルトの名無しさん :2001/01/01(月) 00:14
謹賀新年
(゚Д゚)ハァ?
534 :
デフォルトの名無しさん :2001/01/01(月) 00:50
アヒャヒャ(゚∀゚)y─┛~~
∧ ∧∧∧ (,,#゚∀゚) _ ,,) アヒャヒャ / つ | 〃(@ ノ /U U UU
>InsideWindowsってまだあったの? 季刊とかで復活してたのかな? / ̄ ̄ ̄ ̄ ̄ ミ / ,――――-ミ / / / \ | | / ,(・) (・) | (6 つ | | ___ | / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | /__/ / < なわけねぇだろ。今頃ネタに反応すんな /| /\ \__________
537 :
472 :2001/01/04(木) 06:30
C言語のほうが良いの? Hot Soup Processorは駄目なの? どれが、一番分かりやすい?
は?>537
539 :
デフォルトの名無しさん :2001/01/04(木) 08:40
>>537 神経を逆撫でするような質問は止めてくれい。
540 :
デフォルトの名無しさん :2001/01/12(金) 13:44
基本的な相談をしたいのですがいいでしょうか? Windowsで2Dアドベンチャーのシステムを作ってるんですが、方向性にいまいち自信がないので意見を聞かせてほしいです。 画面サイズは640*480で色数は16bit以上、ウィンドウ&フルスクリーンで動作、扱う画像は24bitBMPという状態でやっています。 以下にどういう感じで組んでいるのか書きます。 640*480*24bitのメモリに背景などのBMPを貼り付けていって、メモリ->DIBに転送してBltというふうにしています。 テキストの表示は一度BMPデータを作って、それをDIBに転送するようにしています。 テキストを消す場合はメモリ->DIBに転送という具合にしています。 ゲームのメイン部分はスクリプトの終わりが来るまで処理するという感じになっていて、 スクリプト解析部分からエフェクトやテキスト表示、キー待ちなどのときは関数に飛ばしています。 関数では KWait(){ while(KEY == 0){ Vsync(); } } というかんじで独自にループ作っちゃって、VsyncのところでWindowsメッセージ処理とメモリ->DIB->Bltを行っています。 ゲーム終了とかの場合はVsyncがエラーで帰ってくるようになってます。 DirectDrawを使ったほうが良いとか、根本的にマズイとかありましたらご指摘いただけると幸いです。 よろしくお願いします。
よくわからないんだけど、DirectX使わないで 画面をフルスクリーンに変更できるの?
542 :
禁断の名無しさん :2001/01/12(金) 19:56
>>541 デスクトップの解像度を変更して、その大きさと同じウインドウを
作るって方法になる。インチキフルスクリーンだね。
543 :
540 :2001/01/12(金) 23:20
DirectXはつかってます。解像度変更とWAV再生に。 あと並列処理とかはタイマーでやってます。 ちょっと作り方が古い感じでマズイかなぁとおもってるんですが…。
544 :
デフォルトの名無しさん :2001/01/14(日) 22:41
2Dのゲームなんですけど、描画毎に前画面更新かけるのって頭悪いですか?
頭悪いです
546 :
デフォルトの名無しさん :2001/01/15(月) 06:23
>>544 とりあえず、フロントバッファのことなのか
全画面の誤変換なのかをはっきりしてください。
547 :
デフォルトの名無しさん :2001/01/15(月) 09:51
>>544 毎フレーム、バックバッファをすべて描き直すって意味でしょ?
それが普通です。
548 :
544 :2001/01/15(月) 13:35
>>546 すびばせん。誤変換です。バックバッファの全更新ということです。
>>547 そういうもんなんですか? なんかめちゃくちゃ効率悪そうなんですが。
変更のある可能性のある領域だけを差分更新するほうがよくないですか?
プログラム的には全更新したほうが楽そうですけど。
549 :
デフォルトの名無しさん :2001/01/15(月) 19:13
プログラマが楽できる方法というのは、大抵の場合プロセッサや メモリが人一倍働かないといけなくなります。
550 :
デフォルトの名無しさん :2001/01/15(月) 19:36
性能とか後々のバージョンアップとかを考えた時、DirectXで作ると 便利ですか? (つまり、無理してもDirectXは憶えちまった方が便利でしょうか?) ちなみに僕は趣味でRPGやSLGをちまちま作ろうと野望してるプログラム 初心者です。 (ようやくCの基礎の基礎がわかった。次はC++だーっ!) (不躾な質問、すみすません)
>>548 >変更のある可能性のある領域だけを差分更新するほうがよくないですか?
いつの時代の話だ?(ワラ
552 :
デフォルトの名無しさん :2001/01/15(月) 22:12
>>548 背景が特に動かず、動き回るオブジェクトが少なければ差分更新は向いてるけど
今時のゲームのように画面中を大量のオブジェクトが
派手に動き回るような場合は全更新するしかないんじゃん?
553 :
544=548 :2001/01/15(月) 22:36
>>552 たしかにそうですね。
背景のスクロールとか全画面エフェクトとか使うと、
差分更新なんて不可能ですもんね。やっぱ全画面更新しかないか。
そうか、自分の頭の中味が古かったのか。。。鬱だけど氏なない。
554 :
552 :2001/01/16(火) 00:03
>>553 背景のスクロール程度なら差分更新でもいけそうだけど
プログラムが複雑になって大変そう。
BIO_100%のSuperDepth2-Finaltyなんかは確か
16ドット単位でしかハードウェア横スクロールができないPC-98で
8ドット単位横スクロールを実現してたんだけど、
表バッファと裏バッファを8ピクセルずらして描画しておいて、
裏バッファに2フレーム前の画面情報から消すべき箇所を背景で上書きして
新しいスプライトを描画して…、とかやってたらしい。
そんなプログラム考えたくないっす。
555 :
デフォルトの名無しさん :2001/01/16(火) 00:48
X1のXEVIOUSは、CRTCいじって80*50モードにして、 PCGを8*4ドットで分けてBG定義して4ドットスクロールさせてたな。
556 :
デフォルトの名無しさん :2001/01/16(火) 01:58
画面表示位置の微調整機能を使って MSX2で8ドットより小さい単位のスクロールを実現している スペースマンボウなんてクレイジーなゲームもありましたな。
557 :
デフォルトの名無しさん :2001/01/16(火) 04:52
アドベンチャーゲームで CPU使用率を100%にしまうのはまずいですか?
>>557 よくわからないけど、嫌だって言っておくよ。
>>557 (瞬間的ならともかく)
な、なんで100%になるの?>557
どうせCDから音楽でも垂れ流しながら紙芝居の絵をめくるだけなんだろ?
プレイ中のユーザーの環境でも漁ろうとしてるのか?
560 :
デフォルトの名無しさん :2001/01/16(火) 07:17
FlipのVSYNC待ちはCPUパワーを食う。 おかげでオーバークロック機での動作が厳しくなって フリーズすっぞーとかイヤ〜ンな苦情がきたりする。
561 :
デフォルトの名無しさん :2001/01/16(火) 07:58
メッセージループの中で sleep() で寝るのはダメ?
562 :
デフォルトの名無しさん :2001/01/16(火) 08:12
>>561 OK。っていうか、出来る限り寝てて欲しい。
563 :
デフォルトの名無しさん :2001/01/16(火) 15:10
結局、最近のゲームは差分更新しようが全更新しようが パフォーマンスに大した差はないってこと?
564 :
デフォルトの名無しさん :2001/01/16(火) 19:02
>>563 Pentium以降は全更新が基本。
最近のゲームは3Dばっかりなんで、すでに全更新は常識。
3Dで差分更新ってすごく大変そう.....
565 :
デフォルトの名無しさん :2001/01/16(火) 19:08
>560 はぁー。めちゃくちゃなデマが流れてるね。 某やね氏のHPでもみたのか? >561 それが何を意味するのかわかっているの? だいたいCPU使用率を100%って何で調べてんの? sleep()入れたら100%いかなくなった?逝くでしょう。 だって無駄だもん。
566 :
デフォルトの名無しさん :2001/01/16(火) 19:25
>>561 sleep()でどうするんですの?
十秒ぐらい待ってみますのん?
せめてウェイトキューに入れるとか・・・
567 :
560 :2001/01/16(火) 20:28
>>565 いや、やね氏のページは見てない。単に私の経験からなんですけども、
(Flipループなソフト公開したときに限って熱暴走の苦情が出る)
そういやちゃんと検証したことない。
正確なところ知ってるのなら教えてちょ。
568 :
デフォルトの名無しさん :2001/01/16(火) 20:41
>だいたいCPU使用率を100%って何で調べてんの? そりゃシステムモニタでは。アレもあまり信用できないけど。 >sleep()入れたら100%いかなくなった?逝くでしょう。 他にめぼしいプロセスが動いてなければ、OSのカーネルが CPUを休ませてくれるでしょ。そういう仕組みになってるし。 ……って、そういうのとはまた違う話なのかしら。 なんかコンセンサス取ること希望。
569 :
名無しさん@お腹いっぱい。 :2001/01/16(火) 22:02
>>568 >他にめぼしいプロセスが動いてなければ、OSのカーネルが
>CPUを休ませてくれるでしょ。そういう仕組みになってるし。
どこからの情報ですか?
出典を明らかにしてください
それが本当ならノートパソコンのパワーセーブは無駄な努力ですね
>569 568もまた違う話かも、っていってるし、そんなに噛み付くなよ。 俺は出典出せないけど確かwin2kならそんな感じだったと思う。 それにしたって、常駐アプリとかあれば結局CPU使うんだから、 パワーセーブうんぬんは別の話だろ。
横からですが・・・
>>569 正しい挙動を教えてもらえませんか??
このまま見てると混乱してきそう・・・
>>570 >常駐アプリとかあれば結局CPU使うんだから、
パワーセーブの動作を分かってないでしょ?
573 :
デフォルトの名無しさん :2001/01/16(火) 23:33
例えばSleep(1000)ってやれば1秒間はそのスレッドにCPU時間が割り当てられることはないのでは? そうでなきゃSleep()は一体何をするAPIなのでしょうか? それとパワーセーブは全然別の話ではないでしょうか? で、ゲームプログラムでSleepを使って無限ループさせるのはありだと思います。ただ、ちゃんと毎回PeekMessage()してイベントに反応してねってことで。
574 :
デフォルトの名無しさん :2001/01/16(火) 23:38
CPU稼働率100%逝く奴は while(PeekMessage(...)) { } とかやってる奴だろ(藁 もっとCPUに優しいゲームループ作れよ。 やり方は教えないけど(w
575 :
デフォルトの名無しさん :2001/01/16(火) 23:40
CPU稼働率100%逝く奴は while(PeekMessage(...)) { } とかやってる奴だろ(藁 もっとCPUに優しいゲームループ作れよ。 やり方は教えないけど(w
576 :
デフォルトの名無しさん :2001/01/16(火) 23:43
Windows3.1時代だね
>572 ん、言い方が悪かったか?おれはCPUはどの道稼動するんだから パワーセーブには意味があるっていいたかったんだが。
>>577 で、そのパワーセーブは何をやってるの?
CPUはどの道稼動してるんじゃないの?
579 :
デフォルトの名無しさん :2001/01/17(水) 00:20
……以前プログラマー板になんかスレ立ってなかったっけ。 CPUはいつも動いてるのになんで負荷かけると熱暴走するの、みたいな。 読んでないけど(ぉ
>578 はあ?もしかしてCPUのパワーセーブの話じゃないのか?モニター?(笑) それともスタンバイモードの別名?まあいいや、寝る。
581 :
561 :2001/01/17(水) 01:00
>>562 ひとつスレつくってそれが旗振り役になって
それまで眠るほうがいいかもしれないですね
582 :
デフォルトの名無しさん :2001/01/17(水) 03:41
初めに煽り始めた565だけど。 ちょっと時間がたってからきてみたり。 565でわかったようなこと逝ってるけど実は何もわかっていなかったり。 実際にみたことないんだよね。Sleep()いれてどうだったとか、この関数が どんな動作をするものなのか。Win3.1の話をもってくるキチも出たりと。 ところでCPU使用率はやっぱりシステムモニタっていうプログラムなの? だったら、Sleep()をプログラムにいれているらしい某やね氏のプログラムだって プログラム実行中はずっと100%のままだよ。んでもってヘルプみてもさっぱりな 説明だからねぇ。結局Sleep()って何?ヘルプ読むと 「現在のスレッドを指定の時間だけ一時停止させます。」って書いてあるだけ だしね。んで「このパラメーターがゼロのときは、現在のスレッドのタイム スライスの残りが優先順位の同じ他の実行待ちスレッドに譲られます。以下略」 って何がなんだかさっぱりわけがわからない説明だよね。 んじゃSleep()に0の他に1とか2とかを入れたときはただ一時停止するだけ? ゼロを入れたときの他の優先順位って何?わからないです?って、 それじゃただの無駄なんだよ。60Hzで動いていると考えて、ループ毎にSleep() いれると16分の1も無駄に損してるんだし。せっかくアセンブラ使って頑張っても こんな無駄があるんじゃもったいないじゃん。 ついでにいうとただ単にDirectX初期化して メインループに入った時点でCPU使用率は100%になってんよ。
583 :
デフォルトの名無しさん :2001/01/17(水) 04:34
結局、誰も正解を知らないわけか(俺モナー)。
584 :
デフォルトの名無しさん :2001/01/17(水) 04:34
>60Hzで動いていると考えて、ループ毎にSleep() >いれると16分の1も無駄に損してるんだし。 すまん。Sleep()に1いれたとき。
585 :
デフォルトの名無しさん :2001/01/17(水) 04:35
>583 そうだよ。だってどこにも書いてないもん。
Sleepの動きのどこがわからんの? Sleep(0)なら再ディスパッチを行うだけでしょ。他に実行可能のスレッドが なければ、そのまま帰ってくるから、100%になるわな。 Sleep(1)ならタイマを作ってタイマTreeに突っ込んでスレッドを眠らせて 再ディスパッチ。でタイムスライサがタイマTreeを見てExpireしたら さっきのスレッドを実行可能状態ににして再ディスパッチ。 実行可能スレッドのうちさっきのスレッドのプライオリティが一番高かったら さっきのスレッドのSleepファンクションが返ってくる。 どのスレッドも実行可能じゃないならOSのIdleコードが実行される。 OSのIdleコードにはOSとHALによってはhltが実行されるから消費電力は 若干軽減される。
587 :
デフォルトの名無しさん :2001/01/17(水) 05:12
>ついでにいうとただ単にDirectX初期化して >メインループに入った時点でCPU使用率は100%になってんよ。 そりゃメインループがおかしいです。
>>583 というか、みんなして何の議論をしているのかわからん。、
589 :
デフォルトの名無しさん :2001/01/17(水) 05:24
えっと、まず、標準的なWindows PCに垂直帰線割り込みの機構はないと。 となれば、FlipやWaitForVerticalBlankの実装がどうなってるかというと、 燃え上が〜れ〜〜燃え上が〜れ〜〜燃え上が〜れ〜CPU〜♪ちゅーか ちょっと想像したくないような実装になってるんではあるまいか、と 愚考するのでございますが……。
590 :
デフォルトの名無しさん :2001/01/17(水) 05:28
591 :
デフォルトの名無しさん :2001/01/17(水) 05:36
>586 つまり、平たく言うとSleep()使ったときと、 使わないときとではどう違うのでしょうか?んで、使わないときは どんな障害があるのでしょうか? >589 お前みたいにわけわけ分からんこというから混乱するんじゃ。 結局わからない奴の言うことはいつもそれだ。認識が俺と変わらん。 ちょっと黙っといて586のお言葉をまとうや。
いまの使い方だと、変わらんね。Sleep()にしようがSleep(1)にしようが 結局すぐ返ってくるから、100%にはなってしまう。Sleep(1)のほうが ちょっとIdleが走るからちょっと冷えるかなという程度。 589の指摘はあながち、的外れではない。結局ハードからの帰線割り込みを とれない限りポーリングするしかない。画面書き換えが煩雑なアクション ゲームの場合は100%になるのはいたしかたないのでは? アドベンチャーゲームで100%になるのはちょっとインプリ変じゃない? でもほんとに帰線割り込みとれないの?ちょっと調べてみるわ。
>>164 そんなこたあな、そのリソースとは別。ただ単に実行プログラムに
データを埋め込めるだけと思ってくれや。
た
ごめん、変な書き込みした。 ただ、ポーリングして待つのはもったいないから、市販のゲーム なんかはバックバッファ他にもう一個バッファを作って 待ってる間に書いておくんじゃないか? まあ、イメージ的にはトリプルバッファに書いている間にちょこちょこと 帰線を調べて帰線期間中になったらバックバッファとフロントバッファを スワップ。フロントバッファは次のトリプルバッファのキューに 入れる。こんな風じゃない?
596 :
デフォルトの名無しさん :2001/01/17(水) 06:39
>>592 うーむ。つまり「あまり気にせんでええ」ということしょうか?
>ちょっと調べてみるわ。
いや、多分無理どすえ。
たびたび詳しい解説ありがとうございました。
なんだかスレごと熱暴走しそうな感じだね
>お前みたいにわけわけ分からんこというから混乱するんじゃ。 キミ、実はなんにも分かってないだろ。
599 :
デフォルトの名無しさん :2001/01/17(水) 06:46
ということは、WaitForVerticalBlankを GetVerticalBlankStatusとちょこっとのidleとのループに 置き換えるのってどうなんかな。
600 :
561 :2001/01/17(水) 06:47
ちょっくら調べてみた。WaitForVerticalBlankはそのままディスプレイ ドライバに行っちゃうみたいだね。OS側が何やってるかはよーわからんが とりあえず、ディスプレイドライバにBreakPoint張っとくと止まる。 で、DDKにあるサンプルのディスプレイドライバ(3DlabのPermedia2)を 見るみると。おーー回っとる回っとる。DDKもってる人はdd.cをみてね。 whileが3つくらい連続してる部分があるから。 でもこれはディスプレイドライバのインプリ次第だね。ハードが割り込みを 発生するように作ってあって、ドライバがちゃんと作ってあれば WaitForVerticalBlankも100%にならずにちゃんと他の処理に実行を移すことは 可能。でもそういう風につくってあるドライバがあるとは思えない。 だってそういうふうにちゃんと作るとまず間違いなくベンチマークの 成績は下がるからね。
602 :
デフォルトの名無しさん :2001/01/17(水) 07:05
再び565だけど。つまり、「Sleep()使うぜ」って人は 「Sleep()を使わないと熱暴走」するっていってるわけ? 1ループ毎でやってることが同じなわけだから熱暴走なんか関係 ないと考えちゃうよ。 んで、FlipやWaitForVerticalBlankが駄目だといっているの? 家のPCではこの関数が実行されたときにタイムとっても 0だよ。ちょっと考えてみるとこの命令(Flipなど) って、もしかしてビデオボードに 「垂直同期が来たらフリップしてね」って命令を送るだけじゃないの? んで、この命令からバックバッファへの描きこみはストップ。 プログラムは何事も無かったように進む。 んで、フリップが行われ、描きこみ可能になってから ビデオボードはそれまで貯まっていた命令を実行。 ってんじゃないの?(ちがったらすまん) 結局、Sleep()かましてもシステムモニタの 結果は100%なのにどうやって判断しているわけ?
603 :
デフォルトの名無しさん :2001/01/17(水) 07:10
マルチメディアタイマでゲームループを割り込み実行して 垂直帰線は無視すれば、一番CPUに優しそうですね。
604 :
デフォルトの名無しさん :2001/01/17(水) 07:14
>>602 やっぱその辺はビデオカードとかドライバに依るんじゃないでしょうか。
うちだとFlip使ったら次の垂直帰線まで完全にストップしますけど。
んでも、Sleep混ぜても100%? 他のスレッド動いてないのに?
それはいくらなんでもないだろうって思うんだけどなあ。
605 :
デフォルトの名無しさん :2001/01/17(水) 07:20
まあ、オーバークロックユーザーなんぞほっとけばいい話では あるんだけどね。きゃつら、スーパーπ100万桁通った程度で 自分のマシンにゃ問題ないような態度取ってくるんだもん。 一応あたしの配布物では、ドキュメントにその辺注意書きしてる。
606 :
>602 :2001/01/17(水) 07:27
>1ループ毎でやってることが同じなわけだから これの意味するところがよく分からんのですが・・・。
論点がよーわからんよーになったのでしばらく様子見。
とりあえず、簡単な質問には答えておきましょう。
>>599 CPU負荷を減らすといった目的では有効でしょう。実際にWaitForVerticalBlank
で猛スピードでまわってるドライバもあることですし。でもちょっと取りこぼしが
怖いかな。Sleepって実際にその時間きっちりに返ってくることは保証されてない
ですからね。
>>600 ただ単に一定時間待つだけならSleepでいいです。全く問題点はありません。
WaitForXXXなどのシンクロ用のファンクションを使えっていうのは、
たとえば他のスレッドがフラグを立てるのを待つようなときに、
Sleep->Check->Sleepなんかでやるのはよくないよという意味でしょう。
608 :
デフォルトの名無しさん :2001/01/17(水) 12:44
スクリプトを作りたいと思ってます。 例えば、ScriptReaderとかいうスクリプトを解析して 実行するクラスを作ります。 スクリプトには、noキャラを縦にx歩、横にy歩歩かせる、 MOVE no x y とか言う風に書かれています。 しかし、これを解析して実行するときに、その対象のキャラの ポインタやマップのポインタを取ってこなくてはなりません。 そんなとき、必要なキャラやメソッドのポインタをstaticで 全て宣言して操作するという方法は危険でしょうか? 個人的にはstaticのイメージがあんまり良くないのでできれば 使いたくありません。 が、それしか思い付かないのでもしその方法以外に良い方法が ありましたら教えてください。
609 :
OOP(??)ビギナー :2001/01/17(水) 12:54
>>608 ScriptReaderクラスを生成する時にマップやキャラクタークラスへの
ポインタを渡すとか。
class SciprReader
{
private Map *map;
private Character *chara;
ScriptReader( Map *_map, Character *_chara )
{
}
}
もっともっといい方法があると思います。
610 :
デフォルトの名無しさん :2001/01/17(水) 12:55
>>608 キャラをオブジェクトにして、移動するメソッドがあったら
いいんじゃない?
パーサーとエンジンのオブジェクトは分けて、 エンジンはすべてのキャラクタを管理する。 って感じで作るなあ、俺は。
612 :
608 :2001/01/17(水) 21:01
>611 さっそくスクリプトを解析するパーサークラス(CParser)、 解析したスクリプトを実行するクラス(CScript)を作りました。 今はシーンのコンストラクタでマップ、キャラの生成と初期化を 行なってます。 エンジンで全てキャラを管理するということは、マップもシーンも エンジンに管理させるということになるのでしょうか? >610 キャラオブジェクトの移動メソッドをstaticにしてスクリプトエンジン で動かすって感じでしょか? 今のところそのような感じの方法で行こうかと思ってます。 >609 ありがとうございます。 それでやっていたんですが、渡す必要な情報が多くなってきて 引数がかなり増えてしまいました。 もうちょっと考えてみます。 現在の構成を簡単に言うと、 ゲームシーン生成→マップ、キャラ生成→各処理 っていう感じです。
613 :
600 :2001/01/18(木) 05:04
>>607 あ、なるほどです。理解できました、ありがとうございます。
ちゃんと読んでいればわかる話なんですね。ごめんなさい。(汗)
あの、、すみませんが論点が多くなって混乱ぎみなので
もう少し質問していいでしょうか?
メッセージループはスレッドタイムまでぐるぐる回るので
sleep() でスレッドタイムを他に譲ることが有効、
それとも、メッセージループで DispatchMessage した時点で
スレッドタイムは終了するので必要ないのでしょうか?
メッセージループを切り離してゲームを独自スレッドで
処理するときは sleep() を使わないとぐるぐる回ってしまいますよね。
タイマー割り込みで同期したいところですけど、タイマーの割り込み
分解能が低いのでスレッドの割り当て時間に頼るほかないのでしょうか。
あと WaitForVerticalBlank の問題。
WaitForVerticalBlank で 100% ぐるぐる回ってるようなドライバは
スレッドでフレッシュレートのタイミング直前まで sleep で眠って
早めに起きて WaitForVerticalBlank すると無駄が少なくなるんでしょうか。
そうなると精度の悪い割り込みをしてるようなものですし
DirectX8 ではバックバッファと Flip タイミング処理がまとめられて
います。あまり考えないほうがいいということでしょうか?
WaitForVerticalBlank で 100% CPU 消費してもしなくても、環境依存
ということで。。
>>613 スレッドのコンテキストの切り替えはGetMessageの時に行われるはず。
GetMessageでメッセージキュー上に何もメッセージがない場合は
他のスレッドへディスパッチされます。で、次のメッセージがくるまで
そのスレッドは実行されることがないので、ゲームでは困ってしまうから
PeekMessageを替わりに使うわけです。PeekMessageを使ったメッセージループ
はうまく作らないとすぐぐるぐる回ってしまいます。そこで必要ならば
Sleepを実行して他のスレッドにディスパッチしたり、Idleを実行して
CPUを冷やすわけです。ただ冷やすという目的で使う意味はほとんどないとは思います。
>>スレッドでフレッシュレートのタイミング直前まで sleep で眠って
>>早めに起きて WaitForVerticalBlank すると無駄が少なくなるんでしょうか。
前にも書きましたとおり、Sleepで寝ればIdleが実行される確立が高くなるため
CPUの負荷を減らすという目的では有効です。ただWaitForVerticalBlank で
回ることが無駄か?というとそういうわけではないですよね。
私個人の意見では、ハードの性能とドライバを信じるしかないということです。
WaitForVerticalBlankで回ってしまうんであれば、それはそれで仕方がない
ことだと思います。小手先のテクニックで回避してもあまり効果はないでしょう。
ただ、WaitForVerticalBlankとFlipのどちらを使えばいいのかと考えるなら
優れたカードとドライバであれば、Flipコマンドをキューにいれて、すぐさま
返ってきてバックバッファへの書き込みは継続できるはずですので
そちらを使うべきでしょう。
わたしがいまちょっと考えたゲームプログラムはこんな感じです。 多分常識でしょうし、私はゲームプログラミングからは10年ほど前に 引退した身ですので穴はたくさんあるでしょう。皆さんで指摘しましょう。 1.とりあえずPeekMessageのループで回っておく。でちゃんとOSのメッセージ は処理しましょう。逝ったきり返れないゲームは嫌われます。 2.キャラクタのオブジェクトにはつぎに動けるまでのTickCountを持たせる。 で、そのTickCountをキーにBTreeにしておき、ソート順で取り出せたり、 挿入できるようにしておく。 3.ループの中で以前移動をおこなった時点でのTickCountと現時点での TickCountの差分を取り、その差分よりキャラクタのオブジェクト中にある 移動できるまでのTickCountが小さかったらキャラクタを移動。ソートされて いるので、すべてをスキャンする必要はない。 新たなTickCountを補正して書き込み、Treeの中へ挿入。 4.背景、キャラクタオブジェクトをバックバッファへ描画。 フリップ。キャラクタの移動へ戻る。 こんな風にすればリフレッシュレートに関係なくキャラクタのスピードは 一定で、キャラごとに速度を変えることも出来ますし、 マシンのスピードが上がれば、キャラのスピードは変わらずなめらかに 動くようになります。優れたドライバであれば垂直同期を待たずに キャラの移動ルーチンが実行できるのでスピードアップします。 垂直同期をキーにスピードを調整するのは好ましくありません。
ゲームではいかにCPUパワーを使い切るかが重要ですので上述のような感じ でいいんじゃないでしょうか。 もし処理が軽くて、1垂直同期間で処理が終わることが確実で、 WaitForVerticalBlankもFlipも回ってしまうハードウェアを使っている。 でもCPU100%にしたくない。 こんな場合は、DirectDrawにGetScanLineというAPIがありますので これが使えないでしょうか? まずゲームが起動した時点で、ScanLineが10位になるまで待って、 Sleep(10)なりを発行して返ってきた時点でもう一度ScanLineを 取得してSleep(10)でどれくらいLineが描画されたか記録しておく。 キャラクタの描画が終わった時点でGetScanLineを実行して現在何ライン目を 描画してるかを取得し、全ラインを描画するまでの時間を起動時に 取得した値から計算してそれより、少し小さめな値でSleepで待つ。 Sleepから帰ってきたらFlipなりWaitForVerticalBlankを実行。 もし垂直帰線を取りこぼすようならSleepの値を補正して少しづつ 小さな値にするようにする。 こうすれば、垂直帰線を待つほとんどの時間を他のスレッドやIdle スレッドに渡すことができますし、取りこぼしもかなりの割合で 防ぐことが出来ると思います。 実際に動くかどうかは試していませんので、参考までに。
617 :
613 :2001/01/18(木) 20:02
>>614 ありがとうございます。浅学者ですので大変勉強になります。
614-616 読ませていただきました。
ゲームを全力で処理するタイプなんですね。
フリップするときに処理が終わり、待つ状態になるのでしょうか。
615 の手法でちょっと入力のタイミングが疑問になりました。
入力はどのような手法を取られるのかわからないので仮定なのですが
シングルスレッドで全力でポーリングするとすると処理の程度により
入力回数が変わってきませんでしょうか。
描画処理が重いとシングルスレッドでは入力をポーリングする
時間が少なくなり、操作が重く感じるような。。うーん。。。
(CPUが高速なら、問題ないと思います)
もしかして誤読してたり、 DirectInput のヘルプを読めば解決できるんでしょうか。
すくなくとも私の知識はかなり心もとないので勉強してきます。(^-^;)
618 :
デフォルトの名無しさん :2001/01/18(木) 23:30
Sleepはダメ。 正確さに欠ける。 指定した時間より絶対に遅くなる。(特にSleep時間が短いとき) 所詮Windowsはゲームには向かないっていうか〜 そんなことよりDirectX用の専用OSを作ってWindowsと切りかえられるようにしろよ。 もちろんシングルタスクのOS。一応DirectXAPIで擬似スレッド(Windowsも擬似だけど)は作れるようにしとく。 メモリも仮想記憶はなしの直接アドレッシング。 完全なゲームOSって感じ〜。 だれかゲイチュにメールして頼んでよ〜。
619 :
ゲイチュ :2001/01/18(木) 23:40
>> 618 よしわかった貴様にはXBoxをくれてやる
620 :
ゲイチュ :2001/01/18(木) 23:43
>> 618 よしわかった貴様にはとっても素敵でナイスなXBoxをくれてやる
621 :
デフォルトの名無しさん :2001/01/18(木) 23:51
622 :
デフォルトの名無しさん :2001/01/18(木) 23:54
ところでWindowsってリアルタイムOSにできないの? 音声やら映像やら扱う機会増えたしぃ。
623 :
ゲイシ :2001/01/18(木) 23:59
>> 618 よしわかった貴様にはとっても素敵でナイスなWinCEをくれてやる (つかドリキャス)
624 :
デフォルトの名無しさん :2001/01/19(金) 00:11
Win98系OSのタイムスライスの頻度、デフォルトでは20msなんだってさ。 (System.iniの[386Enh]でMinTimeslice=3とかすると変更可能) なんでこれでFlipループなゲームとか動くんだろ?
625 :
624 :2001/01/19(金) 00:13
ついでにタスクスイッチが起きるとき CPUキャッシュがクリアされるなんてイヤな話も耳にしたのだけれど 真相はタコに、いや、イカに? 誰か教えてちょ。
626 :
デフォルトの名無しさん :2001/01/19(金) 00:59
>>624 20msごとにタスクスイッチが起こるっていっても、
そのゲーム以外にCPUパワーを必要とするアプリを裏で動かしてなければ
すぐ戻ってくるだろ。
627 :
デフォルトの名無しさん :2001/01/19(金) 01:15
継続的に動いてるスレッドがあれば 戻ってくるのは最低20ms後になるんじゃないでしょうか。
628 :
626 :2001/01/19(金) 01:41
そりゃ裏で何か継続的にCPUパワーを消費するアプリが動いていればね。 でも普通リアルタイムゲームやってる裏でMP3エンコードしたりするか?
629 :
デフォルトの名無しさん :2001/01/19(金) 02:36
やねうらおと同じ勘違いしてる奴は逝ってよし。
>>629 誰がどんな勘違いしてるのか具体的に示してもらえません?
なんつーか、前から(って2度目か)かなり不快なんだけど。
631 :
デフォルトの名無しさん :2001/01/19(金) 06:50
>630 ようわからんけど やっぱり、「Sleep()いれないと熱暴走する」ってところじゃん? これどう考えても変だよ。だいたいやつのアプリってなんで アドベンチャーゲームごときが30FPSで動いてるの?だっせぇ。 って感じだからじゃん。 要するにただ叩きたいだけってところも入ってるんだよ。
やねうらおのことは知らんけど、 >やっぱり、「Sleep()いれないと熱暴走する」ってところじゃん? >これどう考えても変だよ。 どこが変なの? Windowsはアイドル時にCPU休ませるように動いてるから、 負荷かけると熱くなって飛びやすくなるってのは既に説明されてますけど。 (DOSは常にぶん回し状態だから熱暴走しやすいってのも 自作やってる人にはジョーシキだよな) それとも、そもそもマルチタスクOSの仕組み理解してないとか? >だいたいやつのアプリってなんで >アドベンチャーゲームごときが30FPSで動いてるの?だっせぇ。 どこがダサいの? PCは知らんけどコンシューマじゃ当たり前に 見かけるし、特に変だとは思わないけど。 >要するにただ叩きたいだけってところも入ってるんだよ。 他人事みたいに言ってるけど、要するにキミのことなんだね。
って、もしかするとオーバークロック機とかの 熱暴走しやすいマシンの存在を知らないのかも知れないな。
634 :
デフォルトの名無しさん :2001/01/19(金) 08:29
>632 あーでたねぇ。 勝手にCPUクロック弄って不安定にしてる馬鹿とかも サポートしてるわけね。人がいいね。だいたいそれで 止まっちまうのって作っている俺らのせいなの?馬鹿じゃねぇの。 サポートしてらんねぇよ。結局、対象機種の限定が甘いから 低スペックなマシンと高スペックのマシンのどっちにとっても しょぼくしか仕上がらないんだよ。 あと、30FPS?やっぱりだっせぇ。アドベンチャーゲームだよ。 わかってるの?それにあの組み方じゃどんなに優れたマシンでも コマ落ち必須に組んであるでしょ?それがだせぇ。 コンシューマで組んであるゲームは30FPSで動いていても その分派手だけど、奴のはただしょぼいだけ。 だいたいPCで30FPSだと画面が汚いの気になるでしょ。 もう一度いうとアドベンチャーゲームなの。わかる? 画面が綺麗なら綺麗なほどいいのはいうまでもないでしょ。 なんでゲームスピードの方なんて優先してんの?優先するべきは 見た目でしょう。ユーザーの目に綺麗に見えなきゃ意味が無いの。
635 :
629 :2001/01/19(金) 09:12
>>630 俺が勘違いって言ったのは
>>624 の
>Win98系OSのタイムスライスの頻度、デフォルトでは20msなんだってさ。
>なんでこれでFlipループなゲームとか動くんだろ?
についてだよ。
やねうらおも大ヴァカなこと抜かしてたよな。
要約すると「タイムスライスの頻度が20msだったらどんなゲームでも50fps以上出るわけがない、だからタイムスライスは1msで発生しているのだ。」って話。
どこにあったか忘れたけど以前RSP叩きスレで叩かれてたな。
624の言ってることは基本的にそれと一緒。
20msごとに再ディスパッチが行われても他に特に処理すべきプロセスがなければCPU使用権は一瞬でゲームの方に戻ってくるんだよ。そうでなきゃ1つのプロセスがCPUを100%使用したりできるわけないだろ?
2度目って何のことかわからないが、俺がこのスレでこの話を書いたのは始めてだ。
で、それとは別で
>>632 バカか?
CPU使用率が100%になっただけで熱暴走するマシンを作る方が悪いんだろ?
じゃあそういうマシンを組む奴は、MP3エンコーダやらDVD2AVIみたいなCPU使用率100%に達させるようなアプリは使わないわけか? 何のためのオーバークロック?
オーバークロックしてCPU使用率50%以下で動かすマシンと、定格クロックでCPU使用率100%まで使うマシン、どっちが速いんでしょうね?(藁
まあ俺は無限ループ+sleep()使わずに、少しでも環境に優しいマルチメディアタイマ使うけどな。
636 :
629 :2001/01/19(金) 09:18
637 :
デフォルトの名無しさん :2001/01/19(金) 12:14
OCによる熱暴走で落ちるのをコーディングで対処 できるなら対処するよ。 ユーザサポートに来るバカ電話が減るから。
自作や改造マシンに対するサポートはしてません。
639 :
デフォルトの名無しさん :2001/01/20(土) 07:27
>>638 それだ!
ユーザーサポートの対応は俺の仕事じゃねーから別にいいな。
640 :
デフォルトの名無しさん :2001/01/20(土) 08:13
>>637 御意。まあ、629は市販ソフト開発者の苦労を知らないんだろうな。
>>634 30fps云々、元ネタが分からんので一体何に怒ってるのか分からん。
教えてくれ。このスレの皆がやねうらおストーカーだと思うんじゃないぞ。
642 :
>635 :2001/01/20(土) 08:43
>何のためのオーバークロック? オーバークロックのためのオーバークロックに決まってるじゃない(笑)。 またの名をベンチマークのためのオーバークロック。 ま、世間のなんちゃってオーバークロッカーを一度観察してみなさいって。 彼ら、3DMark2000が1回通ればそれでよしみたいなとこがあるんだけど 当然ながらゲームはそういうベンチマークソフトより ずっと長時間動かすわけですよ。you see?
643 :
デフォルトの名無しさん :2001/01/20(土) 11:52
ところでさぁ。 オーバークロッカーのサポートどうするなんて くだらない話はどうでもいいけど。 DirectX8になってからずいぶん構造が変わっちゃたじゃん。 んで、MSもしょぼいビデオボードはもう知らん。としたわけ だけどこれから対象機種ってどのくらいにする?ってこと を聞きたいんだけど、どうやって調べればいいですかね? 2Dオンリーで組む必要ってまだあるんですかね? イース2エタとかFF8ってなんか結構売れましたよね。 3Dエフェクト使ってるし。そりゃサポート態勢なんかも 違うのはわかるけど、たくさん売るには一体どのくらいのスペックが 基準なんでしょうね?
644 :
デフォルトの名無しさん :2001/01/20(土) 12:01
643ですが要するに 「スペックどのくらいを対象にしてゲーム作ります?」 っていう質問なんですが?どうでしょうか? もちろん作るものによって違うと思いますが、どういうもの 作るならどうとかこういうもの作るならこうとか。あるとうれしいです。
645 :
デフォルトの名無しさん :2001/01/20(土) 15:24
>彼ら、3DMark2000が1回通ればそれでよしみたいなとこがあるんだけど 3DMark2000が1回しか通らない(2回目は通らない)環境で常用すんな。 そんな奴らサポートしてたらキリがないだろ。 夏場に1時間MP3エンコードしてから使え。
だから私に言われてもしょうがないんだって(笑)。
647 :
デフォルトの名無しさん :2001/01/22(月) 00:11
いろいろなゲームのアルゴリズムがのっている書籍があったら教えてほしいです。 昔はBASICの入門書みたいなのでいろいろゲームが載ってる本があったけど最近みかけないので・・。
648 :
デフォルトの名無しさん :2001/01/22(月) 01:21
>>642 こーゆうの理由にしてへんてこなマシンまでサポートしようとする
奴ってよくいるけどさぁ。それいつまでやるき?
もしかしていままでグライド専用へぼカードのバンシーとかも
苦労してサポートしてたわけ?垂直同期がとれないのまであるん
だってね。ご苦労様。でもさぁ、そんなマシンサポートして
苦情電話が減るのはわかったけど。そんなところに力入れてて
そのゲームって苦労の割に本当に売れてるの?
イース2エタ−ナルってどうやらバンシーだと正常に動かないらしいね。
だけど結構売れたよね。何を基準にそんなへぼマシンなんて
サポートしてるのか聞いてみたいけどね。
最終的にはDIBなんちゃって関数を使ってDirectXを使わないように
なるの?それだと今度はWin2000でマシンによっては動作へぼへぼ
だってね。でもDirectX9からは2000おんりーだから、
やっぱりへぼへぼなものができるんだね。さて、これからどうするの?
>647 遊びのレシピっていう本があったけど、もう3年くらい前の本です。 ボーランド言語向けに書かれています。 どうでもいいけど著者の奥さんゲーメストの常連投稿者だった。
650 :
デフォルトの名無しさん :2001/01/22(月) 05:28
>>648 そんなもん商業上の判断ってやつだろ。
キミはキミのポリシーで最新の環境向けに作ってりゃそれでいいじゃん。
とりあえず、WindowsMeとWindows2000に載ってるのはDirectX7だから
うちの作るソフトはしばらくの間DirectX7前提になるはずだ。
651 :
650 :2001/01/22(月) 05:31
補足。 Windows95/98の頃にPCを購入して、今もゲームを遊んでるような連中は 既にDirectXの最新版をインストールする程度のことは できるようになっているだろうという計算もある。 まあ、これがオレの会社の判断だ。
652 :
デフォルトの名無しさん :2001/01/22(月) 07:35
653 :
デフォルトの名無しさん :2001/01/22(月) 20:19
ドラクエみたいに、時間に応じてマップの色調を変更するようなことがやりたいのですが、どんな方法がいいでしょうか? パレットをいぢるのが楽そうですけど、16bit専用で作ってるからやりたくないし、かといってリアルタイムで色調変換するのは重すぎですよね。
654 :
デフォルトの名無しさん :2001/01/22(月) 21:48
>>650 DirectX8でなきゃ使えない機能を使う必要がある場合のみ、8で開発すればいい。
極端な話、2DゲームならDirectX3でもかまわないはず。
655 :
名無しさんi486 :2001/01/22(月) 21:49
透過iconファイルが作れなくなってしまいました。 昔imgicoというソフトを使ってたのですが 最新バージョンでは何故か上手く行ってくれません。
656 :
デフォルトの名無しさん :2001/01/23(火) 12:33
ありがとう〉649 遊びのレシピ探してみます。(^^) 古本屋かネットオークションあたりを。
657 :
デフォルトの名無しさん :2001/01/23(火) 13:37
>>653 Direct3Dでマップの上に半透明ポリゴンを載せる。
冗談のフリして実は現実的かもしんない回答。
658 :
650 :2001/01/23(火) 13:40
>>652 Riva128からTNTあたりかな。
GeForce2MXにするのはフリーソフトや同人ソフトでもない限り
早すぎっぽいですな。
659 :
名無しでGO! :2001/01/23(火) 15:00
>>653 時間別に全部ビットマップで持っておくんだよ。
660 :
デフォルトの名無しさん :2001/01/23(火) 15:40
>>658 まだ、4MBのもんをサポートするのか?
4MBの次って8MBってあまり聞かないから16MBだよね。
これってすごく違うじゃん?だからやっぱり4MB向けに作る
ってことだよね?16MBぐらいいけばプレステぐらいのことできるのに、
うーん、やっぱりこの変が壁だなぁ。やっぱり4MBのもの使ってる
奴って多いのかなぁ?早く捨てて欲しいなぁ。
Riva128は2D描画は化け物みたいに速かったけどね。
661 :
デフォルトの名無しさん :2001/01/27(土) 10:18
662 :
デフォルトの名無しさん :2001/01/27(土) 11:04
>>653 ドラクエみたいにするだけなら、別に重くないだろ。
単になんパターンかマップチップ用意しておいて、
変更のタイミングになったら表示するチップを摩り替えるだけ。
画面全体に色調変更掛ける必要ない。
663 :
デフォルトの名無しさん :2001/01/27(土) 13:35
664 :
デフォルトの名無しさん :2001/01/28(日) 04:58
>>662 速度が問題じゃないなら、半透明ポリを乗せる方が画面がきれいに変化させられる
じゃないですか。どっちもやってみるのが良いんじゃないかな。
665 :
661 :2001/01/28(日) 15:17
>>663 gdmag.com でバックナンバーも取り寄せ可能。
簡単に支払いを済ますにはクレジットカードが必要。
秋葉原のザ・コンピュータ館の輸入雑誌のコーナーで
以前見かけたことがある。探してみて。ただし、一冊1500円は
したはずなので覚悟が必要。本来は $5.95 だ。
gdmag.com で年間購読したほうが圧倒的に安いので、
迷わず Subscribe を選ぼう。
D3DXはいつ消えてもおかしくないぞ。 だから sage なのか。
スレ間違え鬱だ氏のう
>>663 >>665 バックナンバーはCD-ROM版がおとく。
そろそろNo.3も出そうなので、とりあえず年間購読のみが吉。
まずはどんな雑誌か知りたい場合のみ1冊だけバックナンバーを 購入すると良い。しかし、良い記事が多いのでCD-ROM版を いきなり購入しても絶対に損はしないだろう。
クレジットカードなんて持ってない… つーか、日本まで送ってもらうとなかなかのお値段だね
671 :
653 :2001/01/29(月) 14:15
わわ、自分で質問しておきながら一週間も放置してた、すまそ。
>>657 >>659 >>662 >>664 あらかじめ時間毎のパターンを用意しておく方法も考えましたけど、
結構パターン数が多いんで、メモリ喰いそうだし、フェーディングみたいなこともしたいので、リアルタイムに色調変換かけることにしました。
さすがに重いですね。FPSが10くらい落ちました。
とりあえず奇麗に動いてるし、最近のマシンはパワーあるからこれでも問題ないかな。画面解像度も320×240程度だし(汗
672 :
デフォルトの名無しさん :2001/02/01(木) 05:45
なんかDX8になってからMSがますます横暴になったというか はっきり言ってもうDirectXなんて使いたくねーってのが本音です。 というわけでDirectXにかわる技術でおすすめの物ってどんなものがありますか?
ありません。てゆーかDirectX 8不満?
674 :
デフォルトの名無しさん :2001/02/01(木) 15:11
>>672 はぁ?なんでこの程度でMS批判なんてしてるの?
ずいぶん楽になったじゃん。
初心者でもとっかかりやすくなってるじゃん。
プロだったらもうちょっと意地をみせろよ。
8になってからの批判って、大抵は前のバージョンとの
互換性がどうこうだと思うけど。こんなの大したことないじゃん。
MSに限らずよくあることだよ。だいたい実装レベルでの互換性を
まじめに要求するなよ。どうせ無理なんだから。
互換性の問題をはずすと8になってようやく自然な形になって
くれた。と言う感じだけどな。
675 :
デフォルトの名無しさん :2001/02/01(木) 16:28
>>672 OpenGLの世界へようこそ!(^^)
676 :
デフォルトの名無しさん :2001/02/01(木) 17:54
過去にこだわらず、どんどんAPI刷新するあたりは良かですな。 娯楽分野はこうでなくちゃ。
677 :
デフォルトの名無しさん :2001/02/02(金) 01:07
>>674 2D をないがしろにされている気がしてちょっと嫌。
678 :
デフォルトの名無しさん :2001/02/02(金) 01:43
>>677 いや、それは別にいいだろ?
だって、ちょっと3Dの機能使っちまった時点でちょっとも糞も無いし。
2DオンリーならDirectX5で十分。あえて6とか7とか8にする意味が無い。
正常に動いてるものにわざわざバグいれたってしょうがね−だろ。
ノートPCのサポートのためにDirectX自体使ってないようなところもある
ぐらいなんだから、方針としては2Dは別にいいんじゃないかなってとこ
じゃん。だって2Dオンリーで8に何を求める?
679 :
デフォルトの名無しさん :2001/02/02(金) 19:56
>>671 フルカラーでも8bitパレットが使えればいいのにね。
>>675 はいはい
画面周りだけの話で済むならそれで十分結構なんじゃございませんか。
>>679 ん?画面モードが16bit以上でも、パレット処理を
したい絵だけは8bitサーフェス上に置けば済むじゃん
そういう話じゃないのか?
682 :
679 :2001/02/02(金) 23:08
>>681 そうなんですか。当方DirectXはよく知らんもんで勘違いしてましたスマソ。
683 :
デフォルトの名無しさん :2001/02/03(土) 02:07
>>681 え?そんなことできるの?
やっぱり、ハードウェアでサポートしてなきゃ駄目なんじゃない?
そこの辺はどうなってますでしょうか?
684 :
デフォルトの名無しさん :2001/02/03(土) 02:25
8Bitサーフェスでパレット使えなかったら、 泣きが入ると思うが。
685 :
デフォルトの名無しさん :2001/02/03(土) 02:32
それってハードウェアパレットじゃないんじゃないの である必要があるかどうかは別にして ハードウェアパレットをサポートしてるカードもあるのか?
686 :
681 :2001/02/03(土) 02:37
>ハードウェアでサポート HEL使いなら別に平気なんだけどね D3DHALドライバ限定の話ならやっぱ辛いでしょ
687 :
デフォルトの名無しさん :2001/02/03(土) 05:24
>>686 >HEL〜以下略
HELなんて遅くて使い物にならねーよ。無いのといっしょ。
むしろエラーでも返して素直に止まってくれた方がよっぽどマシだろ?
688 :
デフォルトの名無しさん :2001/02/03(土) 06:00
>687 HELに依存しないビデオカードって少なくないか? ゲーム用のビデオカードならともかく普通のPCのビデオカードなら少なからずHELに頼っていると思うが・・・
689 :
デフォルトの名無しさん :2001/02/03(土) 06:31
>>688 そりゃ、サウンドなどの描画まわり以外の部分なら別だが
普通HEL使うと格段に遅くなるので、まず使ってないように
思うのだが。使ってるとしたら例えば何?
690 :
デフォルトの名無しさん :2001/02/03(土) 08:16
691 :
デフォルトの名無しさん :2001/02/03(土) 12:18
>>690 これHELっていうの?
ライティングなんてハードウェアでサポートしてるもんなんてあるの?
俺はHELって「普通はハードでやるんだけどこのマシンには
なんだか機能が付いてないみたいだね、んじゃしょうがねーから
こっちでやるわ」っていうものだと思ってたんだけど。
>>691 >これHELっていうの?
言う。当然。
>ハードウェアでサポートしてるもんなんてあるの
マジで聞いてるのか?いつの時代からタイムトリップしてきたんだ?
アンタはshi3zの屁本から読んだ方がいいよ、マジで。
693 :
デフォルトの名無しさん :2001/02/03(土) 16:56
>>692 嘘?本当?HELっていうの?
俺はてっきりMMXなんとかとかRGBなんとかとか
RAMPなんとかっていうもののことかと思ったよ。
それとライティングの計算ってハードウェアだったんだ。
DirectXに丸投げしてたからわからなかったよ。
てっきりDirectXの方でやってくれてるのかと思ったよ。
だって、ハードウェアの機能調べるところでライトってないじゃん。
もしかして、建物の影になったところは光が届かないとかゆうことも
やってくれるの?
694 :
デフォルトの名無しさん :2001/02/03(土) 18:23
TnL
>>693 「教えて君」か、貴様は。ちょっとくらいは自分で調べろ。
検索単語は、「GeForce」「RADEON」それと694の「TnL」辺りか?
トランスレートもライティングも昔は対応ハードが無かったから、HELだっただけ。
シャドウイングはしらん。DCに乗っかってるPowerVR2はやってくれる、と聞いたが・・・。
どうでも良いのでsage。
696 :
デフォルトの名無しさん :2001/02/04(日) 21:02
カーレースゲームを作ろうと思っているのですが挙動をどうすればよいのかが 分りません、詳しい方教えていただけませんか? 各タイヤで路面と当り判定や抵抗を取ってそれを合成した物を車の挙動と するのカナとも思いましたが、よくわかりませんでした。 説明のあるホームページでもかまいませんので教えていただけませんでしょうか。
697 :
デフォルトの名無しさん :2001/02/04(日) 23:52
カレーうまい
698 :
デフォルトの名無しさん :2001/02/04(日) 23:55
>>696 まず大学レベルの物理の勉強をしてから来て下さい。
699 :
デフォルトの名無しさん :2001/02/05(月) 00:01
>>696 そこまでやってるレースゲームは少ないよ。
もうすこし大雑把でいいんじゃない?
700 :
名無しさんi486 :2001/02/05(月) 01:13
ちなみに今は、RBGもMMXもRAMPもHELもTnLHALも廃棄処分になったよ。合掌。
>>700 reference rasterizer でしょ
702 :
デフォルトの名無しさん :2001/02/07(水) 23:40
類似スレの出現防止のため 定期age
703 :
デフォルトの名無しさん :2001/02/08(木) 23:24
同様にage
704 :
デフォルトの名無しさん :2001/02/09(金) 01:25
何かHELとHALとTnLHALがごっちゃになっとらんかい?
誤解が誤解を生んで意思の疎通ができてないっつーか。
HELはトランスフォーム(レートじゃねぇよ)&ライティングもラスタライズも全部ソフトウェア。
HALはTLはソフトウェアだがラスタライズはハードウェア。
TnLHALはTLもラスタライズもハードウェア。
ただしTnLHALって言葉はDirectX8では無くなっていて、HALにまとまってますな。
HELとかHALとかはそもそもMSが決めたデバイスの種別で、
ジオメトリがCPU処理だろうがハードウェア処理だろうが、
D3Dの定めたハードウェラスタライザのさえ実装していればとにかくHAL。
HELなら全部ソフトウェア。
HALの実装方法の1つとして”ジオメトリはCPU処理”ってのがあるんであって、
”ジオメトリはHELで処理”なんて言葉はちょっと意味がおかしい。
いや、まー言いたいことはわかるんだけどね。
言葉の使い方で誤解生んでるんじゃないかと思ったので。
でもジオメトリを実装してるハードがあることぐらいは知っとけ
>>691
705 :
デフォルトの名無しさん :2001/02/09(金) 08:17
>>704 解説サンクス。
と、いうことはライティングの計算式って
ハードにやらせるにはDirectXのものを使うしかないってこと?
(いやまあ、いまのところ自分でやる気は無いけどさ)
706 :
デフォルトの名無しさん :2001/02/12(月) 03:19
「XZが平面」で「Yが標高」という3Dのマップで 人を歩かせたいのですがXZ平面での移動量と標高データで 高さをわりだして位置を決めるやり方だと高い山に登るとき 足が速くなってしまうのですが、他に何かいいやり方って ないでしょうか?ちなみにポリゴンの頂点はXZ平面でみると 等間隔に並べてあります。Yの標高とはその頂点の高さを表して います。
708 :
デフォルトの名無しさん :2001/02/12(月) 03:53
>>707 おや?この文章(706)をかいたのは俺なのだが
ここにコピペをしたのは俺じゃないぞ。
まあ、でも向こうでは終了をされてしまったので
こっちでもお願いします。向こうでは高校数学からやり直せって
言われましたが、これ結構難しいと思います。あのFF9だって
これができずに高い山を歩いたときは倍速ぐらいで歩いてましたし。
というわけでよろしくお願いします。
>あのFF9だって (゚Д゚)・・・・。
710 :
デフォルトの名無しさん :2001/02/12(月) 04:59
さらしage
>708 (;´д`)
713 :
デフォルトの名無しさん :2001/02/12(月) 11:54
>>708 移動方向のベクトル X 速度 X 時間
これなら動く速度は一定だね!
714 :
デフォルトの名無しさん :2001/02/12(月) 15:38
>>708 告白。
俺 高2のリアルドキュソなんだけど、これ難しくないと思うよ。
つまり底辺×高さ÷2だ! わかるか?
716 :
デフォルトの名無しさん :2001/02/12(月) 17:14
>>714 やってみろよ。たぶんできないから。
俺も初めは楽勝だと思ってたら意外に難しいんだよこれがよ。
>>716 713 に答えが書いてあると思うが、これがどうして難しいのか説明してくれ。でないとみんな答えようがないぞ。
718 :
リアルドキュソの名無しさん :2001/02/12(月) 18:04
>>708 じゃあ手伝ってあげるからさ、もう少しちゃんと細かい所も記述しなよ。
(1)その"高さデータ"の定義はどうなってるの?
各要素(格子)の値のバイト数。
各要素の値と高さの関係。
隣り合う各要素と距離の関係。
(2)高さデータを元にどのように地面を生成してるの?
何かの曲面の方程式のパラメータなのか
ただ単に直線で結んで三角形の構造体とするのか
(2)地面をどのようにして描いてるの?
ピクセル毎に描くのか
ポリゴンで描くのか
(3)物体と地面の交差判定の精度はどの程度要るの?
(4)移動する物体の速度はどの程度を想定するの?
(5)速度の精度はどの程度要るの?
あとさ、仮のハンドル名ぐらい決めなよ。読み難いっての
これからは 708 って名乗っとけよ
719 :
708 :2001/02/12(月) 18:52
>>718 おお、すまん。
(1)と(2)を同時に答えると、地面の生成はXZ平面に
等間隔(碁盤の目を想像してくれ)に並べた点を結んでやっている。
碁盤の目の1つのマスにつき三角形ポリゴン2つ。
この地形を真上から見ると碁盤の目に見える。
そのときの標高Yは適当に決められるようにしている。
描画はポリゴンで一括して描画。
XZの値があれば標高Yは三角形の平面より出せる。
(3)(4)(5)の精度に関してはそんなにいらない。
っていうか歩いているように見えればOK。
現在はXとZの値を使ってキャラを動かしていて、XZの値を
使って標高Yを求めている。という感じです。しかし、これだと
登り坂では急激に速度が速くなったりするというわけです。
こんなところでどうでしょうか?
720 :
デフォルトの名無しさん :2001/02/12(月) 18:57
>GamePG技術者の方 VC + DirectX(draw,3D)でインラインアセンブラを使うメリットはありますか? VCの最適化で十分のような気がしますが・・・
721 :
708 :2001/02/12(月) 19:03
で、どうして難しいかというと、 速度ベクトルで方向を決めるにもどうすればいいのかわからない というところでしょうか。 仮にまっすぐ前を向いて歩いていったとして坂があったとします。 ここで速度ベクトルをどう向ければいいのかわからないんですよ。 普通に考えれば山の坂にそって速度ベクトルを向ければいいと 思いますが、それってどうやって出すのという感じです。 三角形の平面じゃそこだけしか出ないし、複数の三角形が またがっていたら、そこの部分ってどうやって扱うのとか。 平面から山に行くところとか下り坂から上り坂へつなぐところとか。
>>720 >VCの最適化で十分のような気がしますが・・・
うん。じゃあ十分ってことでいいんじゃねーの?
723 :
デフォルトの名無しさん :2001/02/12(月) 19:07
>>719 X と Z の値をつねに一定の量で増減させているのなら無理だろ。
そうでなければ単に正規化した方向ベクトルをもってれいば ok
に思える。なにがまずいわけ?
724 :
デフォルトの名無しさん :2001/02/12(月) 19:10
>>708 あ、マップの単位はキャラクターの歩幅よりずっと小さいわけ?
725 :
デフォルトの名無しさん :2001/02/12(月) 19:13
平地での移動量にcosθをかけてやればいいんじゃないのか? θは平面と斜面の間の角度。 算出方法くらい自分で考えてね。
>>722 「ちなみにやり手なら、君の書いたプログラムより50%は速くできる」
と言っておく。
727 :
デフォルトの名無しさん :2001/02/12(月) 19:22
>726 50%???大袈裟すぎ。 「相当なドキュソが書いたプログラムより」でしょ?
VCってMMXとかも使ってくれるんだっけ。でもさすがに3DNow!とかSSEとか はやってくれんだろ。
729 :
デフォルトの名無しさん :2001/02/12(月) 19:28
>726 その辺はスキル次第じゃない? 俺にはないけど(泣 がんばれ!>俺 で、実際アセンブラってどのくらい役に立つんだろう・・・ 俺もIM使ってるけどできるだけは速くしたい。 すごくできるツレに聞いたら、素人がインラインアセンブラ使ったら 逆に遅くなるって言ってた。 ちなみに今の俺が使ったら間違いなく遅くなるとも言われた。(ワラ泣
>728 VCのコンパイラって結構、優秀って聞いた。
あー分かった分かった、そう煽るなってば。 キミに敵意は無いから、まぁ落ち着けよ。な。 俺は単に720に「自分で確認して納得したならそれでいい」 と云ってるに過ぎないんだよ。 何でも他人の判断を仰ぎ、他人の判断を鵜呑みにする奴は 最低だと思ってる人間なのよ俺は。そこんとこ読んでくれ
あー。731は726へのレスね
>731 >何でも他人の判断を仰ぎ、他人の判断を鵜呑みにする奴は >最低だと思ってる人間なのよ俺は ……。わるかったよ。 ちなみに、「他人の意見を仰ぎ、他人の判断を鵜呑みじゃなくて参考に自分で判断する」だ。 自分で調べるよ。
???
マターリいこうよ・・・
738 :
リアルドキュソの名無しさん :2001/02/12(月) 21:31
>>708 <地面を上から見た図>
z[m]
.↑
.|
2 .+----+----+
.|\ .|\ .|
.| .\| .\|
1 .+----+----+
.|\ B.|\ .D.|
.| A.\| C \|
--o----+----+---→x[m]
0 1 2
(※ A,B,C,D は三角形の呼称)
図中の各頂点に対応するy成分
0.0, 0.1, 0.0
0.1, 0.2, 0.1
0.0, 0.1, 0.0
739 :
リアルドキュソの名無しさん :2001/02/12(月) 21:31
<定義> (a)物体の初期座標 P0 = ( x0, y0, z0 ) (b)物体が1コマの間に移動する 距離 Δd (d)物体の1コマ後の座標 P1 = ( x1, y1, z1 ) (c)物体の移動目標座標 P2 = ( x2, y2, z2 ) (e)物体は各三角形の面分上を移動する (f)物体は点として扱う <与条件> x0=0.1[m] z0=0.1[m] Δd= 2.0 [m] x2=2.0 [m] z2=1.0 [m]
740 :
リアルドキュソの名無しさん :2001/02/12(月) 21:32
<問1> 点P0, 点P2 を求めよ。 <問2> 1コマの間に物体が通ると思われる三角形を列挙せよ。 <問3> y軸に平行で 点 P0, P2 を面上にもつ 平面Sを求めよ。 <問4> 問2で列挙した各三角形について 平面Sと交わる線分とその長さを求めよ
741 :
リアルドキュソの名無しさん :2001/02/12(月) 21:37
>>708 以上が、高校程度の数学を使ったコテコテな解決手段の
一つだと思うけど。
742 :
デフォルトの名無しさん :2001/02/12(月) 21:59
>>723 XとZの移動量を一定にしてるわけじゃなくて、
マップの頂点のXとZの間隔を一定にしてるんだよ。キャラの移動は関係無し。
っていうか正規化した方向ベクトルでやったとして本当にできるのか?
方向ベクトルは必ず傾斜に依存するんだぞ。しかも、その傾斜はポリゴン単位で
しか決まってないし、なにより一回の移動で複数またぐときもある。
>>724 そう、そういうときもある。し、そうでないときもある。
>>725 >θは平面と斜面の間の角度。
>算出方法くらい自分で考えてね。
おい、これ2Dのお話かい。角度なんて出せないから悩んでいるんだろ。
っていうか頼むから方向ベクトルや角度っていうならその出し方を考えてくれ
すんなりは出せないから、マップの傾斜はポリゴン一つ一つで違うんだよ。
2Dで45度の傾斜を登るには、確かにX成分とY成分にそれぞれしかるべき
値を足せばいいけど3DだとXZ平面上はプレイヤーが逝きたい方向になるが
XYやZY方向は傾斜の角度が必要になるじゃん。それで移動するとき
傾斜の違う三角形を複数またがなきゃいけないわけだよ。これがまた。
743 :
リアルドキュソの名無しさん :2001/02/12(月) 22:02
しっかし 高校レベルの数学、物理のできない奴で ゲームプログラマになるってゆうバカはなんとかならんかね
745 :
708 :2001/02/12(月) 22:12
っていうかまた名前入れ忘れた。742は俺。
んで、
>>740 おお、なるほど。できそうな感じですな。
とりあえず、組んでみます。
ありがとうございました。
746 :
デフォルトの名無しさん :2001/02/12(月) 22:30
ベクトルおベクトルのおりなす角度はacos( (v1・v2)/(|v1|*|v2|) ) のはずだ。内積って言葉を知っているか? ついでにベクトルvがあるポリゴンの法線nで屈折させられたら v' = v - n*(|v|*n・(v/|v|) 後はv'を単位化して|v|を掛ければ求まるんじゃねえの? 複数のポリゴンを又ぐ場合は自分で考えな。面倒なだけで難しく は無い。
747 :
デフォルトの名無しさん :2001/02/12(月) 22:48
>>708 高2の学生さんがせっかく問題考えてくれたんだから
ここで解いてあげなよ。
ヒントもらったらさっさとバックレないように。
748 :
708 :2001/02/12(月) 23:06
>>747 すぐにはできねー。
っていうか解くもなにも738から740の解説で
解決してるじゃん。
ってゆうかすげー難しいし複雑だよ。
749 :
708 :2001/02/12(月) 23:09
>>746 っていうか移動にどう使えばいいのかわからねーって。
この話題は面白いのか?
751 :
リアルドキュソ名無しです :2001/02/12(月) 23:19
>>708 大おまけして1時間。午前零時20分まで待つよ。
リアルドキューソの俺が解けるんだからつべこべ言わないこと。
分からない箇所があるなら素直に告戒しましょう。
時間過ぎたら俺寝るよ。
>>708 つーかおまえもうダメだよ。やめろやめろ。
753 :
リアルドキュソ名無し :2001/02/12(月) 23:36
>>746 ベクトルの“おりなす”角度って、初めて聞いたよ。
やはり人間模様みたいなものがあるのかな
大人の事情って複雑だね
754 :
マセ勉強中 :2001/02/12(月) 23:42
Mathematica事誰か教えて Mathematicaのスレ行ったんですけど 誰もいない
755 :
デフォルトの名無しさん :2001/02/12(月) 23:51
>>753 なんだかよくわからんがバカにされているみたいで参ったな。
織り成すのは俺もマズイと思う
757 :
708 :2001/02/13(火) 00:01
>>751 そんな制限時間決められてもできん物はできん。
<問2>と<問4>がわからない。
っていうか4は2がわかればわかりそうかな。
2の三角形の列挙ってどうやってやるのでしょうか?
758 :
リアルドキュソ :2001/02/13(火) 00:09
>>708 あーごめん。列挙ってのはただ並べたてることで
「コレとコレとコノ三角形」みたいな話で。
759 :
708 :2001/02/13(火) 00:12
>>758 そりゃわかるんだけど。
その選択方法はどうやってやるのでしょうか?
760 :
リアルドキュソ :2001/02/13(火) 00:13
なんで問2があるのかというと、 問4で、マップ上の全ての三角形と平面Sの 交わる線分を求めてたらキリが無いので 計算する三角形を絞り込めっていう意図。
761 :
リアルドキュソ :2001/02/13(火) 00:40
>>708 滅茶苦茶ベタなやり方だと、例えば
上の図のzx平面上で
P0'=(x0,0,z0)
P1'=(x1',0,z1')
ただし |P1'-P0'|=v
という関係を満たすx1',z1'をまず求めて、この線分P0'_P1'と交わる
zx平面上の三角形の写像 を探せば、それが通りうる三角形になるし。
zx平面上 → xz平面
763 :
708 :2001/02/13(火) 00:56
>>761 直線が通るところの三角形を求めるのは少し面倒だな。
まあ、そういう感じでやろうとは思うが、
ちょっと明日(今日?)、用があるんでこればっかりやってられんので
また、あしたの夜ぐらいにくるわ、とりあえず今日は
回線切っとく。常時接続ってわけにはいかねーんだわ。
今日はありがとうございました。
・・・ここって相談室ですよね?
おりなすはないだろう…
766 :
デフォルトの名無しさん :2001/02/13(火) 08:20
767 :
デフォルトの名無しさん :2001/02/13(火) 18:26
>>766 λ_λ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( `ー´) < もういいんじゃネーノ?
/ ;つ \__________
(人_つ_つ
768 :
708 :2001/02/14(水) 01:51
>>766 実は21歳の専門学生だったりするんだよ。
リアルドキュソさんみたいな人がたまにいてビビルよね。
本当に高校生かよって感じのすごさだよね。
んで、やっぱり三角形の列挙が上手くいかないわけよ。
難しいねぇ。
ってこれと他のやり方として、友人から提案があったね。
P0からΔdだけ水平にのばした点をPaとして、その場所の標高の座標をPahとして
P0Pahの方向にΔdだけ向けてそこをPbとして、その場所の標高の座標を
次の移動場所にすると計算はめちゃくちゃいい加減だけどそれっぽく見えるという
感じになったが、どうか。やっぱりちゃんとやらなきゃ駄目?
っていうかやっぱり三角形の列挙がわからんです、はい。
これ範囲を限定して線分で一括して全部調べるしかないと思うのだが。
769 :
デフォルトの名無しさん :2001/02/15(木) 11:57
C言語、C++と学習も終わって、大学も休みなので ゲームプログラミングに手を出してみようかと思っています direct xがいいかと思うのですがどうやら8が出たようなのですが 7から始めるよりは8から始めた方がよいですよね? おすすめの本とか有ったら教えてもらえませんか? また、ある程度自由度は低くてもいいから 比較的楽にゲームを作れるdirect xの代わりのような物って 有りませんか?知っている方いらしたらどうか教えてください
770 :
デフォルトの名無しさん :2001/02/15(木) 12:43
771 :
デフォルトの名無しさん :2001/02/15(木) 13:58
>>769 1. 公式サイトからDirectX 8 SDKの日本語版ヘルプをダウンロード。
2. ヘルプの概念の説明を一通り読んでみる(全部分からなくても可)。
3. チュートリアルを追っかけてみる。
4. サンプルプログラムのソースを眺めてみる。
5. ウェブでいろいろ検索しまくる。
とりあえずこんな手順を踏むべし。
紙の媒体はいらないっすよ。いい本ないし、お金がもったいない。
SDKについてくるやつだけで本何冊分もの情報があるので、
それだけで十分イケます。
>比較的楽にゲームを作れるdirect xの代わりのような物って
>有りませんか?知っている方いらしたらどうか教えてください
HSPを挙げるのがお約束なのかなあ。
でもせっかくCやC++教わったんだからDirectXからでいいんじゃない?
772 :
デフォルトの名無しさん :2001/02/15(木) 14:45
>>769 2Dゲーム用限定なら色々あるぞ。
■独自スクリプト系
YaneuraoGameScript
HSP
■C++ライブラリ系
YaneuraoGameSDK
EL
WinGL
あたりが有名どこ?
774 :
デフォルトの名無しさん :2001/02/15(木) 21:15
>>772 全部お勧めできない。
まず、時代から完全に外れてるし、ライブラリを使うということは意外と
マニュアルがしっかり完備されていないと、他の人の思考を一回自分の中に
取りこんで消化しなければならないからその人と合わない場合は逆に
難しい。上記のライブラリとDirectXをいきなり使うのとどっちが難しいかと
いうと「どうとも言えない」というのが答え。人のライブラリを
使ってしまって本当にわからないときは製作者本人に聞くしかないというのが
情けないところ、DirectXはみんな触っていて共通の知識なのでいろんな人に
聞けるのがいいところ。人のライブラリを使うとその製作者の信者みたいなのが
いて思考が限定されてしまうのが一番痛い。
上で挙げてある「やねうらお」って人のは使っても専門学生の卒業作品ぐらいの
物しか作れない。だけど、いろんなPCで動く。趣味で作るならこれでなくても
いいし、ハードを使って3Dゲームを作ってもいいと思う。ただし、その場合は
やね氏のライブラリみたいにどのPCでも動くという保証は消える。
>>768 返事遅れてごめん。
>友人から提案
それで全然平気だと思う。
776 :
708 :2001/02/15(木) 21:29
>>775 いえいえ、付き合ってくれてありがとう。
テスト頑張ってくれ。あ、これのレスはいらんです。
777 :
名無しさん@LV2001 :2001/02/16(金) 00:30
キューブマップ使わずに周りをレンダリングして映りこませたいんだけど なんかいい方法ないですかね? できれば視野180度*2枚とかでできるといいんだけど仮に上手く2枚が つながったとしても法線をつかってテクスチャ座標を取り出すいい方法が 思いつかないです。
778 :
デフォルトの名無しさん :2001/02/16(金) 00:37
779 :
769 :2001/02/16(金) 01:47
みなさまレスありがとうございます direct x8とHSPというのを調べることにしました
780 :
769 :2001/02/16(金) 01:50
みなさまレスありがとうございます direct x8と HSPについて調べてみることにしました
781 :
デフォルトの名無しさん :2001/02/16(金) 02:38
>>777 こっち向きの180度分だけでいいんじゃないでしょうか?
782 :
デフォルトの名無しさん :2001/02/17(土) 00:09
>>781 跳ね返ったベクトルが向こうを向くこともあるのでやっぱり360度必要かと。
783 :
デフォルトの名無しさん :2001/02/17(土) 03:51
ちょっと相談したいことがあります。
ゲームのBGMをMP3で鳴らしたいのですが、ACMで丸々デコードしてからだと変換に時間がかかってしまいますよね。
フレーム単位でのデコードってできるのでしょうか?
今、一括ででしかできなくて困っています
http://www.ish.ic.kanagawa-it.ac.jp/%7Esyugo/mp3.html ここをみる限りはできそうなかんじなのですが…。
現状は1フレームだとデコードをせず、
2フレームだとデコードはするけど後ろのほうに正常なデータがはいっているという感じです。
どこから正常なのかは不定っぽいです。
できればよきアドバイスをおねがいします。
784 :
デフォルトの名無しさん :2001/02/17(土) 05:32
785 :
デフォルトの名無しさん :2001/02/28(水) 00:57
Win98+DirectX8(DirectInput)でプログラムしているものですが、 リターンキーを一瞬押してセーブ用ファイル選択ダイアログを出した瞬間に、 ダイアログがそのままリターンキーに反応してしまうので悩んでいます ようするに一回しかリターンを押してないのに二回押したような感じに なってしまうのですよ。こんな症状になった人いますか? 解決策とかあれば教えてもらえませんか。。。
786 :
デフォルトの名無しさん :2001/02/28(水) 01:01
>785 ダイアログ出すのって DirectInput 使ってる? 普通に WM_KEYDOWN を拾ってみれば?
787 :
デフォルトの名無しさん :2001/02/28(水) 01:49
>>783 YaneGameSDK2のStreamSound関連を読め
質問です。 Direct3Dで、プリミティブって言うのはポリゴンと同じ意味ですか? 日本語ヘルプ読んでも英語ヘルプ読んでも細かい意味がつかめない・・・。
789 :
787 :2001/02/28(水) 04:10
こういう時はさげんなよ>自分(^^;
ありゃーん、789は787じゃなくって、788でした〜。
791 :
デフォルトの名無しさん :2001/02/28(水) 05:45
実は定義などないと見たッス。 なんでもいいので、primitiveなモデルや描画単位のことを 各自勝手にプリミティブと呼称してるんではないでしょうか。
だからその「primitiveな」ってのがわからんのだろうが。
794 :
デフォルトの名無しさん :2001/02/28(水) 08:24
795 :
785 :2001/02/28(水) 09:47
>>786 さっそくDirectInputで取得したリターンキーで開いてたのを
WM_KEYDOWNに変えたところ2連続で押される症状を
回避することができました。ありがとうございました〜
誤解されたらイヤなので一応。 792 != 788です。 791さん、お答えありがとね。
あやや,DirectX日本語ヘルプに >多くの場合、3D プリミティブはポリゴンである。ポリゴンとは、少なくとも 3 つの頂点が結ばれた閉じた 3D 図形である。最も単純なポリゴンは三角形である。 との記述を見つけました(☆o☆) よく調べないで(いや、調べたんだけど(汗))聞いちゃってごめんなさい。
798 :
デフォルトの名無しさん :2001/03/05(月) 00:18
突然ですけど、フレームスキップってどうやって実装するんですか? 具体的には、1フレーム中に描画処理が終わりそうにない時は描画処理をすっとばす処理なんですけど。 自分でも考えては見たんですが、いまいちスマートなやり方が浮かばないんで。 聞くだけじゃなんなんで、とりあえず自分の考えた方法を。 まず1フレームの描画にかかった時間を計測して、秒間30フレームのゲームなら、1000/30ms以上かかっていたら、次のフレームでは描画処理を行わない・・・というような感じなんですけど、いまいちスマートじゃない気がするんです。
大丈夫! ほっといてもタイムオーバーで描画されないって! 杞憂だよキユー!
800 :
デフォルトの名無しさん :2001/03/05(月) 00:32
現在の時刻を取得して、その時間に画面に描画されているべき ものを描画すればスキップなんて考えなくても自動的に スキップされているようになるのでOK。
801 :
デフォルトの名無しさん :2001/03/05(月) 01:56
DirectX8SDK で作ったゲームは、それ以前のバージョンのDirectXが入ってるPCでは遊べませんか?
802 :
>>801 :2001/03/05(月) 03:05
そんなレベルだとゲーム作れないから大丈夫
803 :
デフォルトの名無しさん :2001/03/05(月) 10:07
804 :
デフォルトの名無しさん :2001/03/05(月) 10:45
800はネタに見えんが…。
805 :
デフォルトの名無しさん :2001/03/05(月) 10:52
俺には801のほうがネタに見える(ワラ ネタにマジレスしてるイタイ802(ワラ
806 :
デフォルトの名無しさん :2001/03/05(月) 18:56
800はネタじゃないと思うぞ。3Dゲームでは結構普通なんじゃないの? 801もネタとは限らないと思う。 (例えばDirectX3.0でコンパイル可能なソースを)DirectX8.0環境でビルドするとそれはDirectX8.0のランタイムがある環境じゃないとダメなのか? って意味にとれないかな?
807 :
デフォルトの名無しさん :2001/03/05(月) 18:56
「Professionalゲームプログラミング」という なんかカッコイイ装丁の本があったので手にとってみたら ……うあー、バリバリの非リアルタイム系やんけ。 よく見たら「アドベンチャーゲームプログラミング 美少女ゲームの作り方」と 著者同じやし(笑)。
808 :
デフォルトの名無しさん :2001/03/05(月) 19:45
>>807 マジ?
イベントドリブンがメインなヤツってこと?
809 :
デフォルトの名無しさん :2001/03/05(月) 19:47
810 :
デフォルトの名無しさん :2001/03/05(月) 19:56
>>809 それでそのタイトルは…なんだかなぁ。
まぁ、書店なら内容見てからかうだろうけど。うーん。
まあ、「アドベンチャー(以下略)」の方は内容のまんまだろうからよいとして。
811 :
デフォルトの名無しさん :2001/03/05(月) 20:54
あーあれかー、「これでプロフェッショナルはないだろう」ってできだよ。 「ゲームクリエイターズバイブル」を猛烈にプッシュする。 10000円近くするけど。 プログラマ以外にもよませれ。
812 :
デフォルトの名無しさん :2001/03/05(月) 20:56
>>809 >MFC使ってるし
いや、それ関係ないだろ。しっかりしろよ。
>>808 正解。
装丁のハッタリセンスは抜群、中身サッパリ。
このギャップには流石に腰が砕けましたぜ。
813 :
名無しさん@お腹いっぱい。 :2001/03/05(月) 23:55
MFCで書かれるとワケわかんねえんだよ ちくしょー
814 :
デフォルトの名無しさん :2001/03/06(火) 03:48
ゲーム系プログラマはMFCなんて使わねーよって人が多いけど MFCを使わない場合、ツールとか作るときはどうしてんの?
815 :
デフォルトの名無しさん :2001/03/06(火) 04:39
てゆーか、必要なときは使うでしょ。
>>812 確かに装丁はかっこいいよな、あれ。ちょっと惚れたぜ。
818 :
MUTT-RAY :2001/03/06(火) 09:53
>>814 ツールはUI部分をC++Builderで作って、表示部分は
FormのDCに対してゲームの方と同じライブラリだね。
ま、俺DirectX使わないからだけど…。
(CreateDIBSection()とStretchDIBits()なアレ)
819 :
デフォルトの名無しさん :2001/03/06(火) 10:09
>>818 当方、Delphiで同じことやってます(藁
820 :
デフォルトの名無しさん :2001/03/07(水) 01:06
で、皆様おもしろいゲームは完成しそうですか。
はい。(ウソ
822 :
デフォルトの名無しさん :2001/03/07(水) 01:45
C++BuilderのTBitmapを使ってゲーム作っているのですが DIBSectionに変えた方が良いですか?
TBitmapって、内部実装DIBSectionじゃなかった? VCLのソースは遙か昔に見ただけだから・・・。
824 :
デフォルトの名無しさん :2001/03/07(水) 05:20
「Professionalゲームプログラミング」って本の内容を教えてくれませんか? 本屋に置いてないから立ち読みできないの…。
825 :
デフォルトの名無しさん :2001/03/07(水) 06:34
TBitmapは内部的にはDIBSectionだけど、 1個1個点打って回転拡大縮小αブレンドだぜ〜、とかやろうとするとめちゃめちゃ遅いことに気づくはず。 結局はDIBSectionのラッパーを自作する羽目になるよ。 短形をBltするだけなら別にTBitmapでいいかもしれんけど。
826 :
825 :2001/03/07(水) 06:40
つっこみ入りそうなので補足。 Pixles[x, y]プロパティが遅いのは言わずもがな。 肝心の(自力描画用に用意されていると思われる)ScanLine[Index]プロパティがかなり重いということ。 特に、ループ内で使ってみると激烈に重さが体感できる。
>817
>>814 =815
残念。ハズレ。
またがんばってね
ごめん、それ、ハイフンの間違い。
カチューシャで
>>814 =815 の815が蒼くならないので気が付いた(T_T)
鬱駄・・・。
830 :
822 :2001/03/07(水) 13:45
TBitmap->ScanLineが重かったとは知りませんでした…。 DIBSectionのラッパーを作成します。
831 :
飲む打つ買うさん :2001/03/07(水) 20:14
ゲーム作りたいんですが、効果音がありません。 そういうのはやはり素材集とか買ったり、ソフトで自分で音作ったり しなけりゃならんのですよね? どこかでダウンロードできるとこないっすかねぇ・・・。
832 :
デフォルトの名無しさん :2001/03/07(水) 22:41
833 :
デフォルトの名無しさん :2001/03/07(水) 22:48
> 831 mod落としてきてサンプルをパクる。
835 :
831 :2001/03/08(木) 13:06
837 :
デフォルトの名無しさん :2001/03/08(木) 14:36
>>825 初回だけScanLine[y]とScanLine[y-1]の差を
取って、使い回すとまあまあ。
838 :
825 :2001/03/08(木) 14:52
>>837 やはり、差分求めるのをやった方がおられましたかあ。自分もやりました。
その後エスカレートして、ScanLineと同等のことを高速にやろうと
リサイズ時にあらかじめScanLine[i]をHeight分テーブル化とか(藁
で、かえって面倒なことになってしまって、結局、自作してしまったのれす。
839 :
837 :2001/03/08(木) 23:03
>>838 そうだねぇ。でもエロゲーならこれで十分。
ってお里がばれるか。
840 :
デフォルトの名無しさん :2001/03/09(金) 00:16
841 :
デフォルトの名無しさん :2001/03/09(金) 02:17
>>840 レベルとしては低い。コンシュマーでは底辺だね。
でも情報を提供しているのは偉い。
842 :
優しい名無しさん1 :2001/03/09(金) 13:03
C言語の制御系のマイコン組み込みの仕事をしようと思うんですが、ゲーム開発分野に転職する際において有利になりますか?
844 :
優しい名無しさん1 :2001/03/09(金) 15:06
何にも作ってないっす。 あと、読んだらあまりにも厳しい。WEB系で、色々、趣味で作った方が楽しめそう。
NOのリンク先がそこか(藁
>>841 >レベルとしては低い。コンシュマーでは底辺だね。
まぁまぁ。あんたの吠えたい気持ちもよく分かるが
とりあえず他所でやりなよ。ここ相談室だぞ。
レベルはどんなもんかって質問に答えてるだけっしょ。
まぁ根拠提示してるわけでもねーしなぁ。 訳知り顔で批評の真似するだけなら学生でもできるしな。 吠えてるだけと取られても仕方ねーべ。
850 :
not 840 :2001/03/09(金) 20:50
>>841 じゃあさ、質問変えて「これからゲームプログラミングを勉強
しようって人間が、入門用として読むのには適してる?」だと、
どうよ。
入門用なら高度な技術を駆使していなくても、基本的な考え方
を押さえてあって、その後で必要になる情報へのポインタを示
してあれば十分だよね。
not ??? とか乱発するの止めないか? 逆にジサクジエーンの臭いがして嫌だ。
>>850 841をいじるのはもうその辺にしとこうな。荒れる予感がするし。
自分で役に立つと思ったものはどんどん活用すればいいのさ。だろ?
853 :
デフォルトの名無しさん :2001/03/09(金) 23:19
>>850 852の意見も同意だが、あえて最短距離で行きたいというのであれば
もっといい人に教えてもらえってのが答えだね。プログラムって初めに
教わった人の影響がでやすいから。でも、それだとネットだけだと難しい
かなぁ。ネットだと自分に都合の良い情報だけを選んでしまうからね。
レベルが高い、低いくらいは自由に発言できなくてなにが2ちゃんねるだ
855 :
デフォルトの名無しさん :2001/03/10(土) 08:21
856 :
デフォルトの名無しさん :2001/03/10(土) 08:23
>>855 どうやらそのまま押してもいけないらしい。
アドレスをコピーしてから貼り付けでGo!
>>854 正論。
煽り・自作自演・厨房がいてこそ2chだろ
>>855 意味のわからん質問はいつものことです。
ようはそれっぽく見せる手軽な方法はないかという
都合のいい質問をしてるわけなので、ほっときましょう。
>>854 ,857
ま、どうでもいいじゃねーか。とりあえずマターリしとけ
860 :
デフォルトの名無しさん :2001/03/14(水) 03:21
麻雀のアルゴリズム(とコンピュータの思考ルーチン)についてしりたいんだけど 検索で探してもろくな所が出てこない。 どっか良いとこないですか?
>>860 良質な思考ルーチンはそれだけで売り物になるからね。
まず、自分の思考をそのままプログラムにしてみたらどうか。
862 :
デフォルトの名無しさん :2001/03/14(水) 05:23
このスレあんまり参考にならないね
864 :
デフォルトの名無しさん :2001/03/14(水) 17:18
Windowsで通常BGMをCD-DA再生しようとすると、シーク時にシステム自体(いいかた変?)が一旦停止しますよね? これってなんとか解消できないんでせうか? やるとしたらCD2WAVみたいなことなデジタル再生をやるしかないのかなぁ。
日本語変ヽ( ´〜`)ノ
866 :
デフォルトの名無しさん :2001/03/15(木) 12:22
>>864 今ならCD-DAよりもストリームでせう。
MP3とかOgg Vorbis(重いけど)とか。
868 :
864 :2001/03/15(木) 14:44
ストリームっすかぁ。やってみるかなぁ。 自分の経験から行くとMP3でも十分重いですけど(藁
869 :
デフォルトの名無しさん :2001/03/20(火) 00:16
870 :
DirectX! :2001/03/20(火) 22:34
DirectDrawを初めて実装してみようと思ったのですが、 Main.obj : error LNK2001: 外部シンボル "_DirectDrawCreate@12" は未解決です 上記のようなエラーが出てしまいます。 また、MIDI再生の時も同じようなエラーが出てしまいます。 どうすればよいのですか?教えていただけないでしょうか?
871 :
age :2001/03/20(火) 23:07
873 :
デフォルトの名無しさん :2001/03/21(水) 03:19
Direct3D8なんですが、光源の移動ってどうやるんですか? D3DLIGHT8に移動先の座標を入れて、d3dDevice->SetLight()を呼ぶでいいんでしょうか?
875 :
デフォルトの名無しさん :2001/03/21(水) 08:42
MP3を利用するためのよいライブラリってないっすか? ・ライセンスが関連がうざくない ・もちろん商用利用でもライセンスフリー ・動作が軽い ・ソースコードが公開されている わがまま?
MP3使う時点で上2つ怪しいでし。
877 :
873 :2001/03/21(水) 19:50
>>874 え〜1はDirectXって言ってるのに・・
DirectSEXの話は駄目ですか?
>>878 はいはい、キミの時代はもう終わったんだよ。
880 :
デフォルトの名無しさん :2001/03/24(土) 05:48
ゲームプログラム初心者です。変な質問ですがおつきあい下さいませ。
ゲームループについての質問です。今、マルチメディアタイマーを使い、
例えば1/60秒ごとに座標などの更新、および描画処理を行っております。
もし処理が1/60秒を越えた場合には、次回の処理を倍にして対処してます。
>>603 さんがおっしゃられているような感じだと思います。
ところが他の人のコードなどをみると私のやり方と違う方法をとってる
ことが多いのです(更新処理のみ1/60秒ごとに行うことを保証し、残りの
時間を描画にあてる方法など)
そこで、私のやり方のデメリットをずばり指摘していただけませんでしょうか?
マルチメディアタイマーでちゃんと1/60秒を取れてるなら それでいいんで無い?
882 :
デフォルトの名無しさん :2001/03/24(土) 08:06
>>880 突然処理が飛んだように見えることかなぁ。
そこら辺うまく作らないと、アクションゲームなんかはプレイヤーぶちキレるよ。
883 :
デフォルトの名無しさん :2001/03/24(土) 08:38
884 :
デフォルトの名無しさん :2001/03/24(土) 15:48
>>875 -876
フリーソフトでMP3をデコードするだけなら無料だったと思います。
シェアウェア等の営利目的でMP3デコードを行う場合は有料、
フリー・シェア関係なく、MP3エンコードを行う場合は有料、
という事だったと…。
間違ってたら誰か訂正お願いします。
885 :
875 :2001/03/24(土) 21:26
>>876 ,884
ども。やっぱその辺が問題ですね。
Oggは今のところ負荷が気になるし・・・。
生wavはデカすぎますし・・・。
ストリーム系でBGM再生するとしたら、意外に選択肢が少なくなりますね・・・。
886 :
880 :2001/03/24(土) 23:55
あ、ごめんなさい。1/60秒って書いちゃったから誤解を生んでしまいましたね。 単純にゲームループってどんなのが良いのですかという話です。 初心者スレの方が良かったかな。 例えばこういうのってなんか無駄なだけな気がするのですが、どんな利点があるのでしょう? while( 1 ){ if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE )){ TranslateMessage( &msg ); DispatchMessage( &msg ); } else{ //描画処理 } while( X秒毎 ){ //更新処理 } } でも、とりあえず処理飛びさえうまく作れば今のやり方で大丈夫そうなので 安心しました。レス下さった方々、ありがとうございます。
887 :
デフォルトの名無しさん :2001/03/25(日) 03:58
それって正常に動かないんじゃない?
888 :
デフォルトの名無しさん :2001/03/25(日) 12:21
>>887 >>888 またまたごめんなさい。
とあるサイトのなんですが、私が適当に削ってしまって。
本当はwhile(条件文)みたいな感じです。ちゃんと動いてます。
890 :
デフォルトの名無しさん :2001/03/25(日) 17:27
>>886 うーんと、どの辺が無駄?
必要最低限な気がするけど(最後のwhie以外)
>>890 それだと、描画処理だけ何回もやって、
whileの条件があったときだけ更新処理するってプログラムになるのかな?
while( 1 ){
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE )){
TranslateMessage( &msg );
DispatchMessage( &msg );
}
//描画処理
for( ; 次の更新時間にならない ; ){sleep(4)};ヾ(・_・;
//更新処理
}
ってやった方がよさそうなのかな。
でも、これと同じ処理を書いてるとしたらすまぬ。
892 :
887 :2001/03/25(日) 23:14
だから、何でPM_NOREMOVEなわけよ? PM_REMOVEだろ。 あと、最初のwhileはループごとに式の評価が入る可能性があるから for(;;)にすべき
>>892 が、気が付かなかった...
全然駄目駄目じゃん 俺。
鬱だ死のう。
894 :
デフォルトの名無しさん :2001/03/26(月) 00:00
しかも、終了できないぞ(藁
895 :
デフォルトの名無しさん :2001/03/26(月) 00:15
>>894 if(msg.message == WM_QUIT)
break;
を入れておけば
896 :
デフォルトの名無しさん :2001/03/26(月) 00:30
WindowsのGUIアプリでexit()やabort()使っても問題ないと思う?
897 :
886 :2001/03/26(月) 00:37
>>890 描画がすぐ済むときは、更新が済んでないのに再描画してしまう所です、で
>>891 なるほどー、こうすればビジーループは避けられますね。勉強になります。
つたない情報からくみ取っていただき感謝です(^^;
>>892 while( isLooping )みたいのなんです、元々は。重ね重ねすいません。
入力や画面切り替えなどを考慮するとイベント処理は必須かと思っての
PM_NOREMOVEだったのですが…。やはりWindowのゲームであっても、一定時間
毎にキー状態を調べる様なやり方の方が良い(速い)のでしょうか?
とりあえず経過時間の差分を利用して
>>891 さんのやり方を使うか、
或いはタイムプロシージャ使う方法(何故かあまりみませんね)でいこうと
思います。レス下さった皆様ありがとうございました。
898 :
デフォルトの名無しさん :2001/03/26(月) 00:43
ヾ(・_・; 宇宙人か?
そのままだと終了できないってことだろsage
900 :
デフォルトの名無しさん :2001/03/26(月) 01:06
>PM_NOREMOVEだったのですが…。やはりWindowのゲームであっても、一定時間 ヴァカか? メッセージキューからメッセージ削除されないから、 永久に同じメッセージ取得しつづけるだろ? while( isLooping ){ if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE )){ if(!GetMessage( &msg, NULL, 0, 0)) break; TranslateMessage( &msg ); DispatchMessage( &msg ); } //描画処理 for( ; 次の更新時間にならない ; ){sleep(4)};ヾ(・_・; //更新処理 }
901 :
886 :2001/03/26(月) 01:12
897の時点で892までしか見てなかった…、とりあえずこんな感じになりました #define FRAME_INTERVAL 16 //すでに1/60秒じゃないけど bool is_looping = TRUE; unsigned update_time = GetTickCount(); while( is_looping ){ if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ){ //PM_REMOVE? if( !GetMessage( &msg, NULL, 0, 0 ) ){ looping = false; break; } TranslateMessage( &msg ); DispatchMessage( &msg ); } else{ //描画処理 } while( update_time > GetTickCount() ){ sleep(4);//ヾ(・_・ } //更新処理 update_time += FRAME_INTERVAL; } 明日試してみます
902 :
900 :2001/03/26(月) 01:12
メッセージループの仕組みもよく分かってないのに、 メッセージループ部に手をつけるなよ。 既存のもの(ウェブからでもDirextXサンプルからでも)だけ使ってろ
またやっちゃった
>>900 トホホ、すいません。今度から省略せずちゃんと書きます
要するに
>>901 のやりかたとタイムプロシージャ使う方法
どっちが良いかを訊きたかっただけなんです。
>>891 の時点では
903の
>>891 は
>>886 の間違いです
うーん考えてみれば
>>901 だと一定時間毎に行われるべき
更新処理の保証が失われますねぇ。while並べるのも嫌だし
素直にタイマー使っておくが良か・・・
ところで新スレ立てましょうか?ちょっと責任感じますので。
906 :
887=900 :2001/03/26(月) 02:23
これじゃダメなん? #define FRAME_INTERVAL 16; bool isLooping = true; DWORD gate_time = 0; // 1回目は問答無用で更新 MSG msg; while(isLooping) { DWORD tick = timeGetTime(); if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) { if(msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } else { if(tick > gate_time) { tick(); // 更新 gate_time = tick + FRAME_INTERVAL; } RenderVisuals(); // 描画 } }
>>898 ヾ(・_・
一応、おいおい って突っ込みの顔文字のつもりです。
sleep(4) なんていい加減なウェイトの取り方してる時点で
突っ込まれるかと思って。
ありゃりゃ、新スレで継続しちゃってる
>>906 さん
ゲーム作ってみようと、私が最初にパクってきた(^^;のがこれに似たコード
でした。確かSteps云々というサイト様からです。これだと無駄な処理
しちゃう場合もあるので別の方法無いかな?ってのがそもそもの発端でした。
次にtimeSetEvent()を使う方法にしてみました。最初、デモみたいの作っ
てるうちは上手くいってたのです。しかし実際ゲームとしてキー操作とか
加えていくと、タイムコールバック関数の方で重い処理した場合に
キーメッセージをすぐに拾えなくなってしまいました。
(
>>897 でキー状態を調べる云々の事を訊いたのはこのためです)
そういえば、別スレッド作ってループ回す(yaneSDKで使われているようなの?)
ような話は出なかったですね。
いずれにせよ勉強不足、おまけにスレ違いのようですのでこの話題は終了で。
(もし私にレスいただけるなら、この旧スレにsageでお願いします)
900さんや業界から逃出した男さんを始め、レスくれた方々ありがとうございました