C/C++ゲーム製作総合スレッド Part7 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
基本的にゲーム内で使う文章を外に書くメリットはないよな?
で、セーブファイルは専用の構造体を用意して
そこに保存が必要な数値を片っ端からぶっこめばいいんだよな?
なら今のゲームでテキストファイルを使う場面って、
セーブデータ等のテキストデータのエクスポートくらいだと考えていいんだろうか? 海外のゲームやったことないのかね?
大抵テキストデータは外に置いてあって日本語化Modとか作られてたりする。
日本国内しか相手にしないならそれでも良いと思うけど テキストデータでデータ構造作っておくと色々と便利だよ
テキストエディッタ使えばデータを書き換えられるから、
わざわざ専用エディッタを作らなくてもいいし lua,Squirrelなどを使って、シナリオ・文章などを、
読み込んだりしているんじゃないの?
これらを修正する度に、
コンパイルするのは時間の無駄 ウチの会社では、基本的にゲーム内で使う文章は外のツールで作成してるな。
わざわざソース内に置くメリットがむしろ感じられない。誤字修正の度にプログラマが手を入れる必要が出てくるし、ビルドに時間もかかるし、別の言語に移植する際に面倒じゃないか。
あ、あと、文章の問題であればそのツールを開けばいいという、問題の修正箇所を局所化できるというメリットもあるから。
セーブは確かに専用の構造体(というかPODクラス)を用意して必要なデータをぶっこむ、シリアライズして吐き出す形だな。
それらの吐き出す形は結局単純なテキストではなく、何らかの形式に則ったバイナリ(テキストエディタで開いても意味不明な部分が交じるファイル)だけど。 プログラマ1人で造るミニゲームとかで、メニュー程度の文章量しかないなら
たしかにハードコーディングのほうが楽ではある >>9
そういう文章ってどうやってプログラム中から識別するの
"会話0001"? 4 :名前は開発中のものです。:1985/01/12(土) 16:06:35.67 ID:skthRk+e
基本的にゲーム内で使う画像を外に書くメリットはないよな?
で、描画手順は専用の構造体を用意して
そこに開始点・終了点の座標や塗る色の数値を片っ端からぶっこめばいいんだよな?
なら今のゲームで画像ファイルを使う場面って、
画面紹介等の画像のスクショくらいだと考えていいんだろうか? >>11
ユニークな名前で管理するのが面倒な規模なら
ロジックの部分もある程度は外に投げるようになるんでね 画像ファイルでそれやろうって奴はいないだろ…
テキストは定義された物を書き出すだけだからやろうって考える人がいるだけで
あと、MOD作ってもいいよとか多人数でやるよとか
追加含めて大量に書くよってんならテキスト外置きなんだろうけど、
逆に言えばこのどれにも当たらないならいらないかなって
一部でもオープンソースにする気はないって人もいるだろうし
壊せる壁って破壊済み相当の状態で床などに変化するオブジェクトだけど、
これはダメージを与えていくと壊せる物はマップチップ扱いなのかキャラクター扱いなのかよく分からない
キャラクターをマップチップに正確に重ねてチップを隠すんならいけそうだけど、
そうするとマップ情報をキャラクター生成部に送る必要があるんだろうか? >>14
普通に居るけど
Mod作りやすいってことは本編も作りやすいって事がわからんのだろうかね。
あとオープンソースの使い方おかしい それ、一部の場面でレイヤーの代わりに使ったりする物のことを言ってるんだろ?
描画画像を全部内部で0から生成なんかやってたらそのコードだけでものすごい量になっちゃうよ
逆にそれが部品として小さいなら、外に置かなくても組み込んじゃえってのはありだとは思うし
それを実行しているのが一行目ってわけだ
非現実的な案ではあるけど、できるんなら画像の隠蔽は完璧だな
あと、一部ならオープンソースじゃなくてシェアードソースね、おk覚えた たとえ話は
通じなかった時に双方ともに間抜けなことになるのが辛いな スレを流し読みしたが、>>14-16の辺りが話が噛み合ってないよな
これお互いに誤読してるだろ。推測するに大凡の所お前らの間には
目立った意見の食い違いはなさそうだから仲良くしろよな >>14
>壊せる壁って破壊済み相当の状態で床などに変化するオブジェクトだけど、
>これはダメージを与えていくと壊せる物はマップチップ扱いなのかキャラクター扱いなのかよく分からない
本来は、昔のゲーム機の仕様(例えばOBJとかBGがあるやつね)の様々な縛り
の中での話なので、今なら好きに定義して自由に作ればいいんじゃねーかな
見当がつかなくて何か参考にしたいんならツクールの類でも触ってみて
内部の仕組みを推測して真似てみたりすればいいんじゃねーかな
>キャラクターをマップチップに正確に重ねてチップを隠すんならいけそうだけど、
そういう手も当然ありだよね
>そうするとマップ情報をキャラクター生成部に送る必要があるんだろうか?
どういう機能分割をしてるのかイマイチ分からんけど、座標系の概念が
考慮されてないなら取り入れたほうがいいんじゃねーの え、俺はマップチップもキャラも一緒のオブジェクトなんだけど
お前らわざわざ分けてんの? >>22
舞台装置と役者は似て非なる別物だからよ
>>14みたいなことをやる場合、
当たり判定まではキャラクターと同じでも
HPは持っていない壊せない壁をどう定義するかがな >>23
同じオブジェクトで行けるってことは、似て非なる別物じゃないと思うが 好きなようにすりゃええがな
あんさんの方法を否定してる奴なんて誰もおらん
あんさんは他人を否定したくて仕方ないかも知れないがな! 例えどんな方法でも実現可能だったとしても
複数の手法の中からベストな物を追求するのは良いことである >>25
まぁ、お前にゃ聞いてないがw
似て非なる別物の根拠を訪ねただけで、否定したように感じるってのは相当病んでるぞ 当たり判定の範囲をなしを含む特有の定義にして、
一番最初に横たわるキャラクターオブジェクト それがマップ
他のキャラクターとは一部の要素が大きく違う分管理に差が出るし
無駄を承知で分けた方が分かりやすくはなる…かも マップと言えば、マップチップタイプみたいな並びを記憶しておく必要があるマップは、
当然二次元配列を使うとして
たとえば現在の装備一覧のような、
同じ要素を指す数値の並びをしている物の塊も二次元配列にすべきなんだろうか >>29
別にどう作っても良いけどマップも1次元の配列で持っていた方が楽
座標x、yも持たせておけばいい 二次元のビットマップ画像も普通一次元配列で確保するよな。 >>29
>たとえば現在の装備一覧のような(…中略…)二次元配列にすべきなんだろうか
一覧表示にも色々あるけど
要求(される操作)に応じて適切なデータ構造(コンテナ)選ぶものなので
二次元配列でおk(な要求)ならそれで作るのが一番いいんじゃねーの
要素数がたかが知れてる場合、配列(std::vector)使ってるからって
何か問題が生じるような事はまずないわけだし 2次元配列でOKなものは1次元配列でOK
わざわざ2次元配列を使うメリットは何も無い シンタックスシュガーでしかないもんねぇ
初心者に教えるなら積極的に使うけど 一次元配列で確保した上で行(or列)先頭にアクセスするための
インデックス(LUT)を用意するような内部実装でも二次元配列
なんであってだな(>>32)
ターゲットも実装も不明ならメリットねぇとは断言できんよ たとえば縦スクロールSTGのマップとかで、
メモリ節約のためにマップを行ごとに細切れにして
表示範囲の上に一行足して下から一行引くような処理をしていたりする場合、
一行ずつ読み込んでるんだという事を示すためにわざとやるとか
試作段階で仕様が固まらなかった時の苦肉の策がそのままになっちゃったとか?
二次配列ってなんかあんまり使い道が浮かばない 3Dでキャラクターが技によって自由に地面の凹凸を操作できるようにしたいんですが
予め頂点を作っておかないとダメでしょうか?
キャラクターがここじゃーって指してる座標に一番近い面の上に
頂点をいい感じに窪ませるように配置して、
もともとあった面と入れ替わるような感じにしたいのですが、
当たり判定やハードウェアレンダリングしたいならやっぱり面倒ですか?
まぁハードウェアレンダリングなんてどうやればいいのかわからないですが 確かにあんまり、というか殆ど多次元配列使わないな
配列へのアクセス部分は、隠蔽する傾向にあるから、アクセス用インデックスが多次元でも、アクセスの内部仕様は1次元配列でやってることが多いな
また配列の次元数を増やすと、後から解読するのが難しくなって、可読性が下がる
だから次元が増える場合は、次元別にクラス定義して、一次元配列のメンバに下位次元を持たせるようにしてるな
そういやD3DMATRIXに2次元配列のメンバあるけど、自分で定義したものじゃないし、そもそもそのメンバって殆どアクセスしないなぁ std::vector<std::vector<int>>とかやるじゃん? Dictionary<Point, Tile> Mapしか使わん >>41
enum定数でアクセスするのかな?
それにどんな情報を入れるんだろ >>41
やりません
コンテナ2つ重ねても無駄に複雑になるだけでしょ >>41
リソースに余裕がある場面では使ってるな
規模が大きくなってくると細かいことまで気にしてられんからこれ使うとラク >>39
テッセレータを使ったらいいのでは?
凹ませたい領域を4頂点の単純なタイルで表現し、それをフィールドに敷き詰めておく。
凹ませるときは、該当するタイルに対しテッセレーション(最大64分割)して、
高さマップを与えてディスプレースメントさせる。 vector<vector<T>>は便利なときもあるけど、
コピーやトラバースのパフォーマンスがvector<T>に比べて著しく遅いんで、
そちらが重要なときは多少冗長でもvector<T>で扱うようにしてる。 生ポインタ使うならdequeで良いだろ
とは言えないパフォーマンス差があるんだよな… 相当昔にC++触って、今と環境がかなり違いそうなのですが、
タスクシステムを実装する時、昔は固定長のメモリを予め確保したうえで、そのメモリを
newすることによって使っていたのですが、今のゲームもこのやり方が主流ですか?
それともスマートポインタ+std::listでも速度出るのでしょうか?
スマートポインタとやらは、これはやってる事はガベージコレクションですよね?
速度に問題無しということですが、ヒープ領域から自由にnewdeleteして大丈夫なのかと不安になるのですが・・・ >>56
スマートポインタはリソース管理の安全性を高めるだけで、
new、deleteのパフォーマンスを高めるわけではない。
むしろクラス被せる分、オーバーヘッドが嵩む。
現代のハードウェア環境においては、多くの場合そのオーバーヘッドは問題にならないというだけ。 手動解放は、車で例えると
タイム短縮のためにわずかなエンジンパワーのロスも許されないプロレーサーや、
オートマはエンジンパワーが完全には伝わらないのでクソ
俺は完璧なギアチェンジ操作ができる(自称含む)のでマニュアルで通すんだって人向け
解放忘れてメモリリーク他の面倒な問題を起こしても泣かないなら全部手動で
それが嫌なら我々が作った処理班にぜひおまかせ下さい!
スマートポインタってそういうもの
shared_ptrやweak_ptr自体の書き忘れや循環参照などは防げないけど
>>54
ga >>56
ここではWindowsならメモリ確保の負荷はそんなに問題にならないとしている
http://marupeke296.com/ALG_No2_TLSFMemoryAllocator.html
スマートポインタはGCってそれどういう意味だよ。
スマートポインタに使っている参照カウントはGCの方式の一つとは言えるが。
http://ja.wikipedia.org/wiki/参照カウント おじさんは2万円前後の安もんの8インチタブ(CPU:Z3735G,RAM:1GB)を
即売会場でデモ機として使う都合で、バッテリー駆動でできるだけ長時間
ヌルヌル動かすために貧乏根性丸出しな組み方しちゃったけど、そういう
変な目的が無ければ自分の好きなようにやればいいと思うんだがな
○○のやり方が大丈夫なのか不安とか意味わかんねぇな。周りキョロって
ねぇで自分で決めた基準動作環境で自分でテストすればいいじゃんと 最近は底の方でも1GB
これなら多少雑に使ってもリークさえさせなければ問題ないな
なお512MB以下は爆死する模様
そんな化石がまだあるのかどうかは知らないが ふははは、貴様のセルを使うかどうかもわからない画像や音楽データで埋めてくれる!
読み込み時間といい、占有領域といい、ロースペにはある種のテロだな… 音楽やムービーのストリーム再生以外で、オンメモリでないゲームが作れるって凄いな。
そこまでリソースが用意できないよ。 メモリ次第ではあるけど
常駐とブラウザ合わせたら警告食らうくらいのゲームならあるんじゃないの >>65
数年前、(旧)Android Marketに個人でゲーム出した時は機種依存の
バッドノウハウの量に本気で吐き気がしたけど、あれに比べたら
PCゲーは作りやすい思たよ。メモリフットプリント小さくするだけで
おkなら大したこたないと思える程にAndroidスマホはカオス
(だった。今はどうなってるのか知りません) 1080pの画像を一度に100枚読み込めばロード地獄間違いなし
1920*1080*4 /1024/1024 *100 = 791MBぐらい
スマホだとアプリが強制終了するかも
グラフィックの豪華なアプリのModern Combat 5でもメモリは512MBぐらいまでしか使わない 圧縮テクスチャ使えば1/5くらいにはなるんじゃね? そういや、Appmethodってどうよ?ちょっと気になってるんだが使ってる奴居る? タスクシステムで組む時、
・タスクリスト2つ用意して移動と描画分ける
・タスクリスト1つに移動も描画も入れる
どっちがいいのでしょうか?個人的には前者にしたいけど・・・ 前者にしたいのにできない要因を考えるのがよい
「みんながどうやってるか気になる」ってだけなら気にする必要はない タスクシステムはバグった時に大変そうな印象
そりゃあ、バグれば大抵それなりに大変な目に遭うんだけどさ 昔タスクシステムスレあったけど相手の主張への罵詈雑言だらけでいつの間にか消えたなw >>75
「タスクシステム」っていう名前が何を指すのかがすごく曖昧なのに
それを無視して自分の中の定義を押しつけ合う奴らの隔離スレだったし
消えて当然とも言える まあ個人でゲーム作る分にはどう作ろうが60FPS出てちゃんと動けば勝ちだからなw
会社とかで厳密にタスク管理されてるなら覚えなきゃならんのだろうけど。 >>79
OS上で動くアプリならそうかもな
OS込みとしてならタスクは最適解だろうし、組み込み系で使われてるOSは名前が違うだけて同じ系統のものだよ
現在マイノリティなのは認めるけどな だーかーらー、ただのリストに大げさな名前付けんなや http://ja.m.wikipedia.org/wiki/TRONプロジェクト
多少は勉強になるから、読んでみたらどうだろう
これの亜流だよ はじめからほとんど完成しているシステムに、
そのシステムの中枢部に触れないように要素を追加できるような実装を目指すなら有効
つまり、OSやエンジン作るならこれがいいかもしれない
が、そうでなければバグが修正困難だったり無駄な手続きが多いクソ
なんだ実行順って 必要になった時にやらせろオラァァ 最近はどんな言語でもクロージャやジェネレータ (yield) をサポートするようになってきた。
タスクシステムとは呼ばれないけど、同じ目的には使えるんじゃないの?
描画に関しては、オブジェクトが自前で描画命令を発行するのか、
オブジェクトとは別にスプライトのような構造を用意して、描画はそちらに任せるかの差が大きい気がする。
巷のゲーム向けのフレームワークを見るに、後者のほうが可搬性は優れているんじゃないか? オブジェクトが自前で描画って構造はゲームではあり得なくない?
ポーズ作るだけで一苦労じゃん ネットに転がってるC++のゲームソースしっかりしたのはほとんどタスクシステムっぽいのばっかだから
そういうソースじゃないと読む気がしなくなったっていう(´・ω・`) 単一のタスクだけで動かすと実によく機能するのに、
タスク同士を連動させようとすると途端にギクシャクする辺りが
実にぼっちらしくてよいが、
プログラムにそんなのやらせてどうするんだ C++11のstd::asyncってのが便利そうだから使ってみた。
確かに簡単に別スレッドに非同期に仕事をさせられる。
だが、どうも処理結果を受け取ってスレッドを終了するのに膨大なコスト(500msくらい)がかかるようだ。
代わりに、std::threadで常時スレッドを走らせておいて、std::mutexで同期を取りながら
データのやり取りをするようにしたらとてもスムーズに動くようになった。
しかし、std::asyncを使った場合と比べて、煩雑な記述が避けられない。
スレッド終了のコスト高杉。 >>94
サンクス。
調べてみる。
>>95
そうだよ。 1タスクごとにスレッドそのものを開始終了するとコストが高いので
想定するCPUのコア数だけワーカースレッドを用意して
それらにタスクを投げるのが定石じゃないかな。
・キューにタスクがない時はスレッド待機。
・タスクをキューに投げたら全ての待機スレッドを励起。
・いずれかのスレッドがキュー上のタスクを取得して実行、他は再び待機。
・タスクが完了してもスレッド完了せず、次のタスクを確認する。
デザインパターンにあったはず。 スレッドの使い分けは適切に使わないと工数が意味もなく増殖するからな…… >>98
勉強になった。
やっぱそういうやり方が常套なのね。
そういや、マルチスレッドのデザインパターンってのがあるって聞いたことがあるな。
調べてみるわ。 タスクシステムよりシーン管理の方がよっぽど複雑だと思うの シーンって「タイトル画面とキャラ選択画面とゲームのメインループその他」の意?
それとも「メインループ中の各シーン」のことかな。
>>101
標準テンプレートとか使える程度に技術のある人なら余裕で実装できるよ。 >>98
ワーカースレッドが、キューに何もないことを確認して、
眠ろうとしているところに、
キューにタスクが入って、ワーカーに起きるよう指示を出す。
ワーカースレッドはその後寝てしまう。悪いことに全ワーカーが同じ状態。
次のキュー挿入で起きるけど。
なんかこんなこと考えると、こんがらがってきます。 >>105
キュー操作そのものにミューテックスで排他かけるから
「寝る」一連の動作と「起こす」一連の動作は複数のスレッドで並行に起こらない。
「寝て大丈夫かキューを確認したらタスクがあるから寝ずに実行」か
「完全に寝る→即座に次のタスクがキューにある状況で起こされる」のどちらか。
.NETだとWait()とPulseAll()、Javaならwait()とnotifyAll()で
簡単に実装できるけど、Win32APIだと少し面倒だった。
まずは上記2つのどちらかを調べて流れを掴んで、
それをC/C++用のAPIで書き表すことを考えてはどうかな。 *0.5の乗算と/2の除算
表す物はまったく同じだけど、前者の方が早いんだろうか? 整数ならそもそも結果が違うな
浮動小数ならコンパイラが最適化してくれるだろ 2のn乗倍しかできないじゃないですかー!やだー!
書き方が悪かったのは認める >>106
Javaや.NETはスレッド簡単に書けるんか。
C++11や今後の新しいC++規格で同じようなライブラリ入れてくんないかな? >>114
すでに >>107 が答えてくれてる。
std::thread, mutex, shared_mutex(=RWLock), condition_variable, async/future
C++11, 14 にて、この手の処理のための部品は揃ったと思われる。
あくまで部品なので、タスクキューなんかは自分で多少は書くことになるとは思うが。 #ifndef〜#endifの組み合わせと#pragma onceの違いがよく分からない
前者は明確なインクルードガードだけど、後者は? >>116
一回だけincludeしてねとコンパイラに言う ついでに言うと#pragma onceは非標準
だけど主要コンパイラで実装してないものがないほぼデファクトスタンダード状態 >>115
ありがとう!
C++的にはちょうど良い落としどころっぽいね。
使い易くてハイパフォーマンスなスレッド記述をマスターしてやるぜ! なるほど、むしろ#pragma onceがインクルードガード専用なんだな
>>119
マジで!?
VSで最初から書き込まれているプリプロセッサが非標準なのかよ そもそも#pragma自体が、コンパイラ独自実装な機能で使うタグみたいなのじゃなかったっけ
まあ今となっては大抵のコンパイラで使えるみたいよ
http://en.wikipedia.org/wiki/Pragma_once >>123
リンク先見た?
俺もVCだけの互換の無い機能と思っていたが、互換してないのはIBMの一種(世の中のコンパイラを網羅してるわけではないけど)だけだったよ
標準仕様が〜とかよりも便利なモノは取り込まれてくんだと思った まあ#pragma comment(lib, "...")とか、ガチでVC独自の機能もあるし
>>123の考えが自然だと思う C++14の新機能ってラムダ式にautoが使えるくらい? C++は地盤担当だから消えはしない。見えなくなるだけ。 土台のしっかりしている家は頑丈だからな
しかし最近、犬小屋程度の建物にビルのような土台を作ってどうすんだ?
と思うようにもなってきた 最近ホント、この板でこじつけで日本の風習をバカにする奴が増えたな。
レガシで安定したものはラップして使い回すのが鉄板なのに、
横からうまく吹き込んで全部潰して一から作り直そうとさせる。
それだけ、相手の発展を遅らせることができる。 古いからといってバグが無いとは限らないけどな。
特に昔のコードは脆弱性対策が練られてない事が多い FirefoxはJavaScriptの速度がChromeを超えたとか言われている割にもっさりしている感が否めない
後発のChromeの方が速い ブラウザの使用感はスクリプトの実行速度だけで決まるわけじゃないからな
読み込み時間の短縮も大事
v8の方がバイトコードを通さず直接マシン語を生成するから読み込み速いんじゃないか
全体の速度はTom's Hardwareが調べていたが
スコアを合計したら何かFirefoxが速いという結論になっているのが理解できなかった
どんな計算をしたのやら
http://www.tomshardware.com/reviews/chrome-27-firefox-21-opera-next,3534.html
古い記事だけど 関係ないけど体感速度を速く感じさせるって大事な事だね
Chromeはメモリの使い方や優先順位の割り振りが上手いんじゃないかと chromeはメモリ馬鹿食いするしな
ブラウザしか起動しないならそれでもいいんだが わずかな妥協さえ許さずチューニングに血道を上げ
DNSの応答時間すら惜しむ
そりゃ比べる相手が悪すぎる 0.3を0.1にする前に,10が1になるツールを作ろう メモリが多めのマシンだとChromeが最速だろうね
逆にChromeでメモリ不足に陥るマシンなら最速はFirefoxセーフモードかと FirefoxはブックマークとかタブとかRSSあたりが使いやすい
あとはDuckDuckGoに対応してたりとか
まあ好きな方使えばいいんじゃない? Chromeの最低動作環境は一応メモリ512MB
タブをいくつ同時に開けるのか分からないが JavaScriptとブラウザの速度が一緒くたにしてる。
ChromeはJavaScript不使用であってもメモリ食う。
ChromeにIE,FirefoxのJavaScriptエンジン搭載したらメモリ消費が減ると思えん。 ブラウザ全体が確保したメモリを使いまわしているのだろう
新しいのページ等はHTML5で書かれているので実質JavaScriptを完全にオフにはできない。
v8もメモリが十分にある環境だとメモリ使用量が200MBを超えたぐらいにならないとGCされない。 「国産フリーゲームの舞台をPCスタンドアロン(主にC++)から
ブラウザゲーム(クラウド、HTML5)やスマートフォンアプリ(非C++多)に移行」
させようという思惑を、最近この板でひしひしと感じる。 エサに飢えたスマホ厨や企業やその信者のステマ工作員だろ ほっとけ スマホはAppmethodというC++環境もあるが? 一般企業 : C++って難しいんでしょ?
奴隷商人 : 新しいxx言語やツールを使えば簡単ですよ
奴隷商人 : C++なんか使う必要ありません
奴隷商人 : 素人でもちょっと勉強すれば使えますよ
奴隷商人 : わが社では優秀なxx言語エンジニアを多く確保しています
奴隷商人 : 非常にリーズナブルな値段で派遣できますよ
一般企業 : じゃあxx言語とツールで開発するからnn人派遣して
奴隷商人 : まいどw
奴隷商人 : さてと在庫減ったし新しいボンクラ雇うかな、安い金でw
奴隷商人 : Appmethod? ボンクラがC++使えるわけねーだろw
奴隷商人 : うちは安さが売りなの
C++プログラマ : 仕事ないすか?
一般企業 : うちはxx言語とツールで開発するからC++いらないよ
一般企業 : C++高くつくし
ユーザ : みためはそれなりだけど、手抜き感ありありのクソゲー増えたな
ユーザ : 今売れてる○○なんか△△をパクッて版権キャラゲーにしただけだし
ユーザ : そのくせバグが多くて元の△△より面白くない (給与だけなら)Python最強、C++は微妙
プログラミング言語別求人給与額の第2位はRuby、第1位は? | 開発・SE | マイナビニュース
http://s.news.mynavi.jp/news/2014/11/04/084/ >>158
件数の軸だけ見ると、Javaが断トツなんだな。
ま、自分はC++しかしないけど。 民度が高過ぎる(笑)。
自分は案件減や開発コスト軽減からC#やPHPに日和ってしまってるけど
やっぱりちゃんとC++で「アセンブラレベルで何が起こってるか」意識した
プログラムしないとダメになっちゃうかもね。 >>160
C++は遣り甲斐があるぞ〜、と誘惑してみるw 正直C++もC#も言語使用は簡単でしょ?
問題はオブジェクト指向とかアルゴリズムじゃないの? ラインパーティクルみたいな細長くて透明な部分があるテクスチャが
交差するときって
どうすればいいですか?
というか、Zソートってテクスチャが貼られた面の重心を使ってやるんですか? メモリを意識して書かないといけないのはC/C++くらいでないの
メモリアドレス扱う言語って他になんかある? >>162
C++は根底にCとしての組み込み系やら、ドライバとかの知識が有るかどうかでかなり変わると思う
まーもうニッチな世界になってしまってるけど、ゲームに絞るとコンシューマとかで何かを極めようとしたときに需要は有るかと ZソートってZバッファのかわりに遠い方から描くって意味?
厳密にやるなら、ポリゴンを無限平面とした場合に交差する他のポリゴンを
交差する線で分割する処理をすべてのポリゴンにして
って文章で書いてもわかりにくいな。
分割のあとは2分木のクイックソートで、あるポリゴンの面から見て
別の比較するポリゴンが手前側か向こう側でソート判定する。
多分それなりに有名な方法と思うから検索すれば見つかると思うけど
手法の名前は知らない。
あと、赤黒木でもできるのかしらない。 プレステやらサターンの時のZソートなら、重心か頂点の順番忘れたが二頂点のZ値を加算したものでソートしてたよ
でも組み込み方としては実際にソートではなく、リスト構造で管理してたと思う
だから解像度が低いとバキバキになってた
wソートってのも出たけど、流行る前にZバッファでパフォーマンス出るようになって無くなったと思う >>167
wソートってのがあったのかw
興味深いw >>161
じつはC#でXNAやってたんよ。
C++に戻るということは、ここ数年で作った自分ライブラリと
そこから呼び出しているXNAライブラリをDirectXに移植することを意味する。
けっこう大変だったり。
あとMonoGameが実用に足りるようになったらC#のままの方が楽というのも
正直、ある。C++でクロスプラットフォームの3Dライブラリがあれば
別なんだけど…。 > 手法の名前は知らない。
多分、BSPツリー法だと思う。wikipediaにバイナリ空間分割でのってる。
wソートってどんなのかちょっと興味あるけど、説明されても難いと読まないだろうなw C#ってある意味理想的な言語だよね
・オブジェクトはすべて参照渡し
・値は参照渡しは出来るが参照で持つことはできない
・共有したい変数はクラス(構造体)にする >>171
おお、川瀬さんのページか。
清水さんと交流あったんだな。
>>172
>・共有したい変数はクラス(構造体)にする
C#がやたらクラスだらけなのはそういうことだったのか・・・ C#って、構造体の参照渡しで「メソッド側で書き換え不可能」指定ができないのが難。
ref:入出力を兼ねる参照渡し
out:出力のみの参照渡し(意外と便利)
C++のconst 型 *やconst 型 &がないと言えばいいか。 Wソートってもしかしてローカルな話だったのか?
Zソートはリストだって話を書いたけど、そのリストを更にソートすることで込み合ってる部分を細かく前後入れ換える事で若干バリバリを押さえる感じだった
当時は描画よりも演算の方が圧倒的に早かったのとダブルバッファやトリプルバッファでの空き時間を有効にって感じだったよ
でも自分では研究以外では使ってない
理由は当時は整数演算だったから、ほとんど効果が感じられなかったから 書き換えなきゃ良いだけだろ
なんでそんな事を言語仕様に入れなきゃならないんだ >>177
書き換えちゃダメって言っても書き換える人が居るから言ってるんだと思うよ
全員自分なら楽な話だけどさ あ、連投ごめん。
上のリンク先とMSの解説で、ZバッファとWバッファの意味が逆になってる気がする。
https://msdn.microsoft.com/ja-jp/library/cc324546.aspx
リンク先は「割るほうがWバッファ、割らないほうがZバッファ」、
MSだと「割るほうがZバッファ、割らないほうがWバッファ」に読める。
用語の混乱があるのか、自分が何か勘違いしてるのか。
で、Wソートって何?
昔のPSみたくバッファリングしないでポリゴン単位でソートするけど、Wでやるってことかね。 const必要になるのはライブラリ作成とかチーム開発とかだろうし
ひとりでシコシコ作ってる分には別に不便もないよな
コーディングルールは自分ルールだし 自分も、自分用プログラムばっかり作ってて、const利用はハードコーディングな定数以外は0。
自分以外を考慮に入れると、たしかにconst修飾子は重要になると思うけど、
ある程度小規模なチームなら、ルールで十分賄えると思う。 struct, classのコピーを避けるために参照・ポインタを多用してると確実にミス出るし
constは値を中身を書き換えない保障でもあるから、内部処理を忘れたときとかに役立つ オブジェクトの参照を渡した時に中身を書き換えてくれるなよ、という要求はある
それをC++のようにconstで表現するのがいいかどうか
C#ではイラネってなったし要らないと思う ところで、const 同士の operater== は operater==(const) const; でいいのか?
最後の const で数時間悩んだんだが。ゲーム以外のところで… friend operator == (const&, const&) あー、ここで friend 使うのかサンクス。スレチすまん 単に規約の問題だけじゃなくて。
constというかC#のreadonlyは構造体にも指定できるんだけど、
それを先述のref指定でメソッドに渡せないんだよ。
既存のライブラリでref指定(参照渡し)になっているものが
少なからずある。まあ別の変数に代入してから値渡しできるんだけど、
微妙にパフォーマンス落ちるでしょう。 const無しをデフォルトにしてしまうと,引数先で書き換えるのかどうか,引数からわからなくなるから
基本はconst参照だよね constなしの参照だとrvalue取れないし。
全部コピー渡しですかそうですか const付けたらコンパイル時に置き換えられるの? #defineした変数をconstするとどうなるのっと >>188
たまにそういうシチュエーションがあるけど、それを解決するために言語使用に手を入れるのは言語道断 >>191
intとかならそうなんじゃないかな。
でもconstで定義されるのがクラスインスタンスの場合、
実行時に生成されるのでは(恐らくクラスに最初にアクセスした時)。
>>192
>#defineした変数
#defineはプリプロセッサで置換されるマクロに過ぎないよ。 template初めて使ったんだけど引数側に同じtemplate型があれば、
返り値をわざわざ指定しなくてもいいの?
↓こんなん
template<typename T>
T zeroCheckException(T t){
if(t == 0)throw;
return t;
} >>196
2つあるTはどちらも同じ型なんだから、むしろ指定できたらダメだろ
引数と同じ型を返す関数、という意味になっている
引数から推測できない型を返したいなら、typename を2回書けばいい
template < typename R, typename T > R convertTo(T t) { return ... }
string r = convertTo<string>(123); >>196
>>返り値をわざわざ指定しなくてもいいの?
多分質問の意味からだと、返り値を引数と同じ型(T)で返したいなら返り値(の型)の宣言は必要
その部分はtemplateとは関係のない関数宣言の話で、template内はTと言う型が使えるようになっているだけだと思って関数を宣言すればOK
だから、その関数が返り値を返す必要がないならvoid、intを返したいならintになる typenameとclassってどっちがモダンなん?
あるいは使い分けが必要? >>199
常にclassを使用していて困ったことがない >>200
ideoneに張る意味ねえな。
最低限実行出来るようにしてから張れ。
その過程でここで質問するまでもなく解決することもある。 >>200
11行目のgetPositionをnextPosにしても駄目?
評価順は正しいとは思うけど最適化とかキャッシュとかで狂ってるのかな?と思いました
しかし、難読化してるようなソースだな… >>200
ヒント
unitListが標準コンテナだとするとsize()の返す型はsize_t
多くの処理系でsize_tは符号無し
1-2uの結果は? >>199
これは俺ルールだが、
typenameはbool, int, doubleとかも使いたいとき
classはクラスだけでいいとき classしか使わない派だが,template自体あまり使わないことにしてる 自分はtypename派だな。
classに限定しない使い方が多いからというのがあるけどね。
ま、組み込み型も一種のクラスと見做せないことはないし、文字数少ない分、classのほうがいいかもしんないけど。 もはやゲーム関係ない気がするのはミンナニ ナイショダヨ て、テンプレ使えれば前以上に楽ができるかもしんないし!
なお移植性が壊滅的に下がる模様 テンプレート使って移植性が下がるってここの住民は一体いつの時代に生きてるんだろうか 俺もテンプレート自体使わないな
過去の遺物だろあれ VSのバージョン上がるたびにどこかしらテンプレートで書いたところの書き直しが待ってるんだよな
MPLに手を出すと他の処理系でまた違う方言で困るし バージョン上がるたびに、ってほどテンプレートに手入ってたっけ?
むしろ、いままでコンパイルを通すためにいちいち">"と">"の間にスペースを入れていたのが
入れる必要なくなったとか、そういう方面の変更しか知らないんだけど だいぶこなれてきたから、できないことができるようにはなっても、逆は無いと思うぞ
確かにC++03時代は typename が急に必要にされてエラーになるのはあったけど
気になるなら互換性を吸収するラッパーとしてboostを使うのも手だな 最近変えたところだと
enable_ifが無い頃の代替としての部分特殊化のコードが
2012では通ってたのに2013でC2753で通らなくなって
代わりにenable_if使えるからそれになって
2015でconstexprあるからそこはテンプレート要らないだろうなて状態だわ
なんでエラーなのか追いかけるの面倒だから新機能で凌いでる
boostのを最初から使えばいいんだけどライブラリのバージョンアップが面倒でね SFINAE周りは確かに、C++11でようやく統一仕様が策定されて多少手を付けやすくなった印象がある
>>223
テンプレートを使ってるライブラリを使うのと
テンプレートなクラスや関数を自分で作るのとは
結構隔たりがある気がする… スタンダードテンプレートライブラリ(の構想・実装)が先にあってC++で実装するためにテンプレートが導入された。テンプレートはSTL実装のための道具といえる。
Standard Template Library - Wikipedia
STLのアーキテクチャの多くはアレクサンドル・ステパノフという一人の人物の手によって作られた。
1979年に彼はジェネリックプログラミングの初期アイデアを練り始め、そしてソフトウェア開発に革命をもたらす可能性を探究し始めた。
当時はジェネリックプログラミングを実際にサポートしているプログラミング言語がまだなかった。
それをサポートする最初のメジャーな言語はジェネリックユニットの機能があるAdaであった。
1987年までにステパノフとマッサーはジェネリックプログラミングの研究成果としてAdaのリスト処理ライブラリを開発してリリースしていた。
C++は当時まだ言語として未成熟ではあったものの(テンプレートはまだなく後から実装された)、より広く普及してジェネリックプログラミングの良好なサポートが提供される可能性が高いと考えられた。 で、結局>>200はuintの減算でオーバーフローしてるってことでいいのか?
int - uintがintにキャストされれば大丈夫そうな気がするけど 直接的な解決策や原因は分からないけど、俺なら
・「unitList.size()*140」を「unitList.size()*140.0f」にして直るか確認する
・set/getPositionXを通さなかったらどうなるか確認する(当該メンバ関数の実装が自明である場合を除く)
・コンパイラの警告設定を最強にしてみて、何かメッセージが出るか確認する
あたりをやってみると思う で、ゲーム制作だと意識して。
開発環境を開発中やデバッグ中に更新するとか無いだろ
移植で困ることは判る 新しい開発環境に新規実装された要素どうしても使いたかったんだ…と推測(適当)
CやC++とはあまり関係ないけど、
一部の開発環境では、関数や変数を書いた行にコメントしとけば
カーソル合わせるだけでコメントが出るのでメモ代わりにできるな
なおソースがコメントだらけになり、よそに貼った時に失笑物のソースになる模様 http://ideone.com/3SPXKz
ほぼ答えのヒント張っても理解できてないアホがいっぱいいるんで再現させてやったぞ
>>207
で、どんな問題だったんですかね? 色々試してみたけど、オーバーフローしたuintを直接floatにキャストするのがダメっぽいね
一回intにキャストすれば大丈夫だった
int - uintはintになるってわけじゃないのね
テストコード
#include <iostream>
int main()
{
int i=3;
size_t ui = 5;
float x = i-ui;
float x2 = i - static_cast<int>(ui);
int x3 = i - ui;
float x4 = static_cast<int>(i-ui);
std::cout << x << std::endl;
std::cout << x2 << std::endl;
std::cout << x3 << std::endl;
std::cout << x4 << std::endl;
std::cout << static_cast<float>(i-ui) << std::endl;
} >>233
intで表現出来ない値をintへcastしたら桁あふれで未定義動作 >>234
未定義になる可能性のある演算は暗黙のキャストしてくれないって事? >>235
違う
intとunsigned intの演算結果はunsigned int
もちろんunsigned intはマイナスを表現出来ない、なので0-1uはUINT_MAXになる。(符号無し整数は桁あふれしても未定義動作ではない)
でも符号あり整数の桁あふれは未定義動作なのでUINT_MAXをintへキャストするのは未定義動作
まぁ大抵の処理系では動くだろうけど。 符合ありなしで演算すると符合なしになるのか
なるほどねー これそもそも size_t が unsinged int なのが悪いんだよな、頭悪すぎ size_tはsizeofで測ったデータの長さを受け取る物だからよ
データの長さに0未満はあり得ないから定義できないようにしてるんだろう 質問です。
抽象クラス(親クラスとする)を継承した派生クラス(子クラスとする)を
親クラスの型のメンバー変数に子クラス型でnew()し、抽象化して保持してます。
このメンバーをdelete してすぐNULLを代入しても、参照が残ってるみたいで
エラーでる場合があります。
抽象化しているオブジェクトの削除の、お作法みたいなものってありますでしょうか。 スレはあってるけど板が違う的な。
まあ、ゲーム関係かどうかの境目って結構曖昧だけれども。 いずれにしろコードもなしに質問されてもエスパーしか回答出来ないですし 開発期間が長すぎて、開発環境が何度も変わるのってどう思いますか?
開発環境を固定する?それともコードを書き直して対応する? boost辺りならまだしも、言語自体のバージョンが上がるまでって
一体どんだけ開発期間が長いか間が悪いんだよ…
どうしても使いたい追加要素でもなければ変えない トラブルの素 CSのSDKとかじゃないの?
開発序盤なら対応、終わりが見えてたらそのままってのが普通だと思うけど 昔VS2008から2010に上げたけど特に問題は起きなかった vsの2005から2012に上げたら、Releaseでは動くけどdebugでは動かなくなった
自前で作ってた文字列クラスが弾かれたから、現在、std::wstringに置き換え中 >>247
何年にもわたって開発を続けていくようなものなら
あんまり気にせずに変えちゃう プロの人も来てるのかも知れないけど、同人ならぶっちゃけ
DirectX9辺りの技術基盤があれば十分じゃないの。
新技術に取り組むこと自体が目的化して、ゲームを完成させる方が
疎かになってしまうって、何かありがちな気がする。 別に必要ないなら使わなければいいんです、エロい人にはそれが分からんのです >>254
DirectXがそもそも出来ない人が話に混じってるだけだから気にしない方が
DXライブラリ程度でいいんじゃないかな?同人なら
自作ライブラリ作れる人ですら少ないよ もとの環境で大体完成していたのに、
無理やり次世代機用に作り直そうとしたがうまくいかず、
そのまま爆死した家庭用機向けソフトのプロジェクトなら知ってる >>260
RomからCD-ROMへの移植は苦労が多かった
ROMの容量が4Mバイト超えてるとRAMご足りなくなって、動的に入れ換えしようとするとリソースのマネージメントが大変だったから しかもそれだけ苦労したにもかかわらず、ロードが遅いと文句言われたに違いない…。 >>251
置き換えたらさらに別の場所が動かなかったから2013へと移行したりw
いや、ネットでは動くコードと書かれているんだよ、2013からは動くと
うちのPCで2013はマトモに動くかな?今インストール中だが ヘッダで前方宣言したはずのクラスがCandidates are: struct SimpleAudioEngineとエラーを出され
定義でreference to 'SimpleAudioEngine' is ambiguousとエラーを出されます
ヘッダではポインタしか使ってません
思うところがあるとすればSimpleAudioEngineの名前空間をusing namespaceしてるぐらいです 異なる名前空間の中で前方宣言すると別物だとみなされて
あとでusing namespaceすると区別できない 開発環境をvs2012からvs2013に変更したのは大当たりだった
エラーの位置は分かりやすくなったし、デバッグ機能は大幅に強化されてるし、
文字列クラス(std::wstring)は扱いやすくなったし、全般的に軽くなった operaterがほとんど対応してなかったんだよ。
+=はあるのに+は無いとか、map<wstring,wstring>で使えないとか。 ためしてないがそれはないだろ。
あとSTLやC標準ライブラリ、C++標準ライブラリは備え付けのを必ずしも使う必要がない。
実装は多数ある。 たまたまインストールされてるのがVS2012だったから試してみたが普通に使えた あれ?って事は、vs2005を後から入れたせいでおかしくなってるのか?? UMLのツールを買ってみて、たまたま家のVSで対応してるのが2005だけだったから、
後からインストールし直したんだよな
そっか、VS2005のコードでC++のコードが上書きされてたか VC6でもoperator+位あったような気もするけど
不便な所は連続したメモリ領域の保証が無いから
実装上はともかく厳密にやろうとするとvectorじゃないとダメな所 連続領域かどうかに関しては
- vector C++03/11 → 連続保証
- string C++03 → 実装依存 / C++11 → 連続保証
らしいぞ。 最近のVCなら大丈夫なんじゃないかな。 連続性が保証されるようになっているとはな
外見は変わらなくても内部は少しづつ変わってるんだな mallocのメモリ配置はOSで変わるんじゃなくてコンパイラで変わるみたいやね なんにせよ、ポインタはむやみにいじらない方がよさそうね ポインタは使い勝手がわかると色々出来るが、無くても問題無くなってきてるからなぁ…… それなりのもの作ろうとしたらアロケーター自作になるゲーム制作はポインタ必須なんじゃないの プラットホームによるとは思うが、いまだにカスタムアロケータなんて使うのか?
OSや言語処理系を書いているわけではないだろうに 流石にOSデフォルトのアロケーターは使わないんじゃないの
ライブラリのメモリプール使うにしてもポインタは使うだろうし アロケーターはC言語かSTLのやつのことだろ?
OS自体のメモリ管理はOS自体のソースからビルドしないと変更むりでは。 普通にnew、deleteしたらOSのAPIでメモリ確保するんでないの?
STLはどうかわからんけど >>288
mallocの置き換えぐらいリンクするライブラリー変えるだけだよ
tcmallocでググれ new deleteの動作なんて実装によるとしか言いようがない
STLのstd::allocator<T>の話なら、単にnewとdeleteを呼び出す実装になってる mallocやnewを置き換えてもOSの命令を使ってたら
OS自体のメモリ管理の制約は受けるわけで。
OSと完全に独立できるものか?
OSが既に管理してるところを横取りしないとならないが。 ちょっと前に「ゲームの場合、出現オブジェクトの個数に上限を設けることが多いから
new deleteせず自分でプールを確保する手もある」という話をしなかったっけ。
とりあえずstd::allocator<T>で書いといて、あとでカスタム化してもよいのでは。 malloc - Wikipedia
OSのカーネルでもアプリケーションと同様にメモリ確保が必要である。
カーネル内にもmalloc相当の関数はあるが、その実装はCライブラリのものとは大きく異なる。
例えば、DMA用のバッファには特別な制限が課せられることがあるし、割り込み処理でメモリを動的に確保したい場合もある。
このため、カーネルの仮想記憶サブシステムと密に連携した malloc 実装が要求される。 余程特殊な用途でないかぎり既成の物使った方が速いから 自作アロケーターは最初に領域確保してその分を切り盛りするでしょ
ていうかそれ以外の作り方を知らない >>294
スレ違い
お前はゲームをOSから作るんか? >>287に対して、自作アロケータ、マイアロケータってのは
ほとんどのケースで、OSデフォルト、カーネルアロケータに依存してるだろ?って反応なわけで。 そうだな
>>287
が言ってるOSデフォルトってのが悪かった。
アプリケーションが使うメモリアロケーターの殆どの実装はライブラリが行ってる。
OSからシステムコールでブロック単位でメモリを貰いアプリケーション内で分配な。 すんませんVC++のメモリ確保がWin32APIの関数呼ぶだけって何かで見たからそういうもんだと思ってました >>296
アプリケーションとしてのゲームはこれで確定だと思ってた
動的と言えば動的だけど都度都度確保はあり得ないって意味でこの手の話はスルーしてたけど、そう言うものでも無いみたいだと知ったわ
取れなかった場合の処理は思い付かないけど ヒープ、動的確保は丸投げに近いが。普通のauto変数とかは最初に確保した領域を使いまわす。
メモリの4 領域
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/img6.png
http://brain.cc.kogakuin.ac.jp/~kanamaru/lecture/MP/final/part06/node8.html
テキスト領域:機械語に翻訳されたプログラムが格納される. この機械語の命令が 1 行づつ実行されることでプログラムが動く。
静的領域:グローバル変数などの静的変数が置かれる。
ヒープ領域:メモリの動的管理 (C 言語の malloc 関数や C++ の new 演算子でメモリを確保すること) で用いられる。
スタック領域:今回の演習で扱ったように CPU のレジスタを一時的に退避させたり、また C 言語の自動変数 (多くのローカル変数) が置かれる。 いわゆるメモリープールのようなものは既にランタイムに実装されてる場合もあるし
自分で実装する・しないは実行環境によると思う。
最近はこの辺のことは既に当たり前になってるのかどうか知らないけど、
検索してもあまり引っかからないね。とりあえず引っかかったところ
http://vcpp-ml.ldblog.jp/archives/1169943.html
ではVCのランタイムのソースみればとなってるので
興味ある人は読んでみては。 俺が昔作ったベンチ引っ張り出してきた
10000個確保して解放を1セットで、10回繰り返す
malloc 0.0104349686516726 100
new 0.0170437163409596 163.332702856062
tlsf 0.0327989992535455 314.318138831095
右側がmallocを100とした場合の倍率。意外とtlsfは遅い。
んで下が自作のメモリアロケータでnewとdeleteをオーバーロードしてて
上で使ったnewするソースをそのまま使ってる。
fixpool 0.01086365697986310 104.108189899754
fixpool-ss 0.00270476282206395 25.9201815774541
アルゴリズムは一回使ったものをリストにつなげておいて、newのとき取り出すだけ。
ssは上限が分かっている場合で、先にメモリ確保するのでmallocを上回れる。
まぁ、はっきり言って速度だけを考えると自作アロケータの必要はないかなレベル・・・と思う。
確か、スマートポインタのベンチもどっかにあったはずなんだが、どこだったか・・・ >>303
ゲームエンジン•アーキテクチャ(ソフトバンククリエイティブ)によれば、デフォルトのnewが遅い理由は管理コストとOSのコンテキストスイッチとあるけど
URL先の内容からすると最初に確保された分越えなければコンテキストスイッチは発生しないって事なんかな
ていうか2000年の時点でそういう仕様だったのか >>304
その自作アロケーターって複数スレッドから呼んでも大丈夫なように作ってんの?
だったらたいしたもの。
今時モバイルですらマルチスレッドが当たり前だからベンチマークも複数スレッドで実行すべき。
スレッド使うライブラリーをリンクしないとシングルスレッド版のmallocとリンクする環境もあるし >>305
ライブラリが貧弱な環境だと効果はあったんじゃない?
ライブラリが貧弱で有名だったPS3とか。
ゲームエンジン アーキテクチャって本PS専門デベロッパーだった人の著書みたいだし >>306
データ読み込みや通信で「now loading…」、ムービー再生とか以外でマルチスレッドって何に使うの?
いろんな判定でシングルでないと困らない?
俺はコンシューマ長すぎのせいか、マルチスレッド(タイムスライス型)は、そもそもゲームシステムとして実装が思い付かない
どうしてもタスク()で疑似マルチしか作れないや >>306
ポインタのつなぎ替えの部分に一応クリティカルセクション使ってる。
が、これのベンチがねぇ・・・
複数スレッドで同時に確保しまくって人為的にコリジョン起こしても、
シングルの場合と違って純粋な値が取れないので。 スマポあった。同じく10000を10回。
new 0.00696283003770957 100
shared_ptr 0.039324851409757 564.782584046715
生ポインタとboostのshared_ptrね。
下が自作のリンク方式とカリカリにチューンした参照カウント方式のスマートポインタ。
link 0.0273835524999122 393.281932082318
count 0.0157994938635595 226.911956460117
これも、安全をとるなら生より多少遅くてもboostで十分と思う。
自作のスマポは労力の割にはねぇ。 書き忘れてた。>>304はゲームに近いように
10000まで{ 4, 10, 20, 100, 208, 501 }のサイズを巡回して確保していってる。
>>310は同じオブジェクトをずーっと生成してる。
こうするとnewがなぜか結構速いんだけど、その状態で対決してみたかったので。 んーなんか車輪の再発明がどんどん無駄になってくのな
必要な機能が既存のコードにあるなら、わざわざ作る必要は無い、みたいな 自分は今は自作コンパクションを使ってるけど、これも誰かの作ったコードを流用した方が早い時代が来るのかな? >>314
これの詳細を知ってるが、レンダリングはPCだとGPU処理だから、マルチスレッドとは別で非同期でしょ?
それ以外は先程書いた通り
因みにこのフレームワークは自動変数(スタック)以外はメモリは静的に持ってるよ ガチな将棋AIとか作ることになったらやっぱりCPUスレッド数のスレッド作って読みを分散するんじゃなかろうか そもそもメモリ管理なんて個人でやるものじゃないよ
せいぜいオブジェクトプールのように局所的なところで使ったほうがいい
自作アロケータを使ってみたい気持ちはわかるんだけどねぇ >>308
シングルスレッドでパフォーマンス十分なら要らないんじゃない?
その場合アロケーター自作しようとする理由すら解らなくなるけど。
レンダリングスレッドを分けるってのは比較的簡単だからよく使われてる方法だね。
グラフィックスのAPIが全て非同期という訳でもないし、呼ぶ事自体比較的コストが高いものもあるドローコールとか
あとGPUが全てやってくれるわけでもない。
影とかモデルの持ってるマテリアルによってはマルチパスレンダリングが必要になるしね
それら含めて一つの独立したスレッドでレンダリングを行うって事
どこまでやるかはそれぞれのゲームエンジンの実装次第だけど PS3なんかはは汎用コアが貧弱でマルチスレッド使わないとまともに動かないらしいけど
PCはターボブーストなんかもあるし処理分割しなくてもそれなりに動くのかね
ゲームで重い処理って言ったらAIとか物理演算とか?
それらやらなきゃコア使い切る事もなさそう 自分の場合、(作ったのはC#とXNAだったけど)
・更新
非同期・4体のキャラの思考ルーチンをマルチスレッドで(他のキャラの状態は前フレームのものを利用)。
同期・同時に行う必要のある判定類。
非同期・4体のキャラのアニメーション演算(*)
↓
・描画(スキップされることがある)
非同期・キャラの描画コマンド発行(ただし、4体それぞれに(*)を同期)。(**)
同期
非同期・背景などの描画。
↓
・更新
※未了のタスクがあればいったん待機して、最初と同じ。
ということはやっていた。じつはXNAは(**)が異様に重くなるというハンデ持ちで、
(*)はC++だろうと当然重いはずだから、パフォーマンス上がると思うよ。 連投悪い。
というか、マルチコアのCPUなのにシングルで動作させてるって、同人ならともかく
商用ゲームだとハードを全然使いこなせていないんじゃないの。
仮にPS3相当かそれ以上のハードで、シングルで楽々動くゲームがあるとしたら、
それは「CPUスゲー!」じゃなくて「CPUを遊ばせている未熟なプログラム」
もしくは「絵的にボリューム不足」「敢えてシンプル路線のゲームにしただけ」だと思う。 妖精左「マルチスレッド!!」
妖精右「マルチタスク!!」
俺「じっそうできればいいから・・・」
部長「ま だ か は や く し ろ 。」 >>322
C#なんて全然ハード生かせないだろC++で作れよ >>322
たしかにC#だと、ネイティヴDirectX呼び出す時点でカーネル切替が発生し、ボトルネックになる
(ただ一方、GCはちょっと工夫すればシーン切替時以外は抑制できる)。
まあC++が最強という事実は揺るがないし、だからここを覗きに来てるんだけど
今まで作った資産をそっくり移植するのは全部1人開発だと工数的に厳し過ぎるんよ。
自分はあくまでゲームを完成させるのが主眼なもんで。 >>328
> 仮にPS3相当かそれ以上のハードで、シングルで楽々動くゲームがあるとしたら、
> それは「CPUスゲー!」じゃなくて「CPUを遊ばせている未熟なプログラム」
> もしくは「絵的にボリューム不足」「敢えてシンプル路線のゲームにしただけ」だと思う。
こんなこと言う人間が
> 自分はあくまでゲームを完成させるのが主眼なもんで。
なんてよく言えるな 世界は使いやすい道具の前にひれ伏す
これが分からない奴は一生地を這う Unityあつかいづらいから自分でライブラリ作ったわwww アホか。
みなが同じ道具を使ったら、それを売って儲ける奴の小作農になるだけ。
これが分からない人こそ
>一生地を這う >>330
>>322はあくまで>>320に対する客観的な指摘。
それと「自分はあくまでゲームを完成させるのが主眼なもんで」は別問題だよ。 実際PS3の初期タイトルは酷いの結構あったな
アイデアファクトリーとか 作るものに応じて道具を選べない人が一生地を這うのでは
各処理をどんだけ細切れにしても結局全部処理しないと次には進めず、
しかも実は単一の処理は積み重ねても大して時間はかかっておらず、
単なるスレッドの立て損にしかなっていないんならマルチスレッドなんか不要
商業だからだのなんだのと適当な言い訳をしても、
実際は目に付くよさそうに見えるものに振り回されているキョロ充
まずは作りやすい方法で実装してテストして、ダメだったら作り直せばいいじゃん うにちゃんは次期主力ゲームエンジンの座を狙っているからね、仕方ないね
何が悲しくてわざわざ柔軟な使い方のできる言語投げ捨ててゲームエンジンなんぞに…
PHPやらJAVAやらに行った方がマシ そんなに自信があるのなら、自分たちでゲーム機を出せばいいのに
彼らの夢は、所詮は砂上の楼閣なんかね >>338
出来ることは並列でやった方が早く終わるよね。 >>342
それは無理。彼らの夢は、ゲーム業界に巣喰う寄生虫になる事だから。 >>344
その前にアルゴリズムを考えた方が早いかもね シングルスレッドで足りるならシングルスレッドで作ればいいと思う
後からマルチスレッドにしようとか考えたら地獄みるけど
ムダに作り込んで時間かけても仕方ないしね スレッドの話で盛り上がってるけど、みんなpromiseとかatomicとかcasとかちゃんと理解できてる?
俺は半分も理解してない C++を書いているとJavaやC#にだんだん似てくるし
C++で便利コードを書いても既存のライブラリには適わないし
C++でゲーム用ライブラリを書いていると既存のエンジンに似てきたから
既存のエンジン使うことにした。困ったらエンジン改造すればいい。 おーい、誰かクマが釣り針見つめてるAA持ってない?
>>348
promiseはFutureパターンのSTL実装かな。
casは不勉強だったわ。いちいちロックしなくても非同期でノード更新できるってことかな。 casって言われてもメモリのclしか思いつかないです
これの事でいいの
http://ja.m.wikipedia.org/wiki/コンペア・アンド・スワップ visual c++2010です
コードを書いていると、未定義エラーなどのエラーが起こっている部分を波線で表示する機能がありますが
それをすばやく表示したい(エラーを確認する間隔を早めたい)時はどうすればいいのでしょうか?
オプションでそれらしき項目を探しているのですが、見つけられず困っています… 今表示されてる速度が最速だよ
文句があるならもっと早いCPUに代えろ
もしくはVSのバージョン上げたら改善される可能製はある 何が原因かわからんが仮にnullpoって変数なり型名なりがあるとしてpoにだけ下線とエラー表示が出る謎現象なんかが困る
nullpoの間にスペース入れた後に消すなりコンパイルするなりして文字解析をやり直させると普通に通る コードを書いてるといきなり妙な場所に波線
面食らいつつ原因を探るべくコードを見直しているといつの間にか消える
他にも指摘されて修正した部分の波線がなかなか消えず、
あれ?修正間違ったかなと書き直そうとすると消えたりする
VSに不信感を抱きそう VS2010より2012, 2013はずっと賢いから変えたほうがいい
あとVSの謎の挙動はコードが悪いせいなのできちんと書くように心がけましょう いつもコードが悪いせいではないな
一括置換とかファイル名変更とか,変なことをやるとVSたんはたまにアホになる というわけでついっさっきVS2013導入したった
C++で打ってる時2010だとショートカットキー(Alt→派)でしかインテリセンス出なかったのが改善されてるのが今のところ一番嬉しい JavaやC#ならわかる
だが負の遺産であるクソ構文抱えたC++で
実用的な速度であれだけのことが出来ることそのものが信じられん
動いたらラッキーくらいの謙虚な気持ちで使うべき C++とC#ってそんなにちがうか??
C++って多少手間暇かかる部分はあるが、自前で組めばどうにでもなる事でね?
まあ、プログラムはソースの書き方だけで作る時間に10倍以上の差が出るし、
モジュールやオブジェクト指向を理解してるかどうかで100倍以上の差が出るから、
その辺りの違いだろうけどな。 MSがBC++を買っとけば世界が平和になってたんですよ… 学習コストの高い言語はもう流行んないでしょ
ゲームもコア部分以外はスクリプトで書くのが主流になるだろうし
C++プログラマはゲームエンジン書けるレベルの人しか生き残れないな パソコン自体がもうほとんど進化しなくなったのに、遅い言語を勧められてもな 状況次第ではJavaScriptの方が速いなんて事もあるのに
まだそんな事を言っているのか
http://arewefastyet.com/#machine=28&view=breakdown&suite=asmjs-ubench まずは、JavaとJavaScriptの違いから勉強しようね? いや、C/C++の存在意義を知る上で重要な議論だよ。 しかも、asm-jsってClangで中間コードにしたものをJavascriptに変換するものであって人間が書いてネイティブコードより速くなるもんじゃねえよ 他の言語は実行がVMだから遅い、C++はネイティブコードだから(常に)VMより速いと言う幻想を>>366は持っているようなので
ぶち壊してやった で、JavaやC#がC++と等速になったとかいうデータはマダー?? >>371
>>372 は多分あなたの言っていることが全く理解できていないだろうな。
たぶん初〜中級者に「VMやJSは思ったほど遅くない」という幻想を抱かせるのが目的。 C++の中にCをラップしているという、気味の悪いC++の現状を憂う気持ちは分かる
C++という言語自体がすでに溶岩流状態だよなwww
… >>372
誰もVMだから遅いなんて言ってないと思うんだけど
で、遅いのは確実だろC#がネイティブコードになっても遅いのは変わらないよ
CやC++より実行時に行う事が多いのだから当たり前のこと 中間コードを実行するVMの関数呼び出しや演算がC++より速くなることは原理的にないんじゃないの
速くなったとしても結局記述されたコードのレベルの差でしょ
C++でチューニングしたコード書けばもっと速くなる
Cのコードがチューニングされたアセンブリより遅いのといっしょ 話の流れに乗ってみるが
ゲーム本体はc++でツール等はc#というのを
ちらほら聞くけど実行している人いる?
いるとしたらどれだけ有用か意見をお伺いしたい >>378
いや、そうとも限らないよターゲットが固定されてるなら問題ないが、
ネイティブコードに変換したら実行するCPUを完全に生かすコードを吐けるとは限らない。
JITならターゲットがコンパイラを内蔵してるようなものだから動かす環境のCPUを完全に生かすコードを吐ける。
もちろん実行時だから時間のかかる複雑な最適化は出来ないから元のコード次第だけど
>>379
そういえばUnrealは昔エディタはVB製だったな。 >>361
356ですが、もし自分の事でしたらXeon W5590(8コア3.33GHz)・メモリは12gbです
遅延が起こるコードはDLLを作る用のもので、約5000行
(2000行のファイル2つ・1000行のファイル1つ、それぞれa.cpp b.h c.hとします)です
a.cpp(2000行)の途中でb.hとc.hをインクルードしてる状態ですが
a.cppの一番下の行の方でスクリプトを書きますと、
波線や#if 0-#endifの半透明化が行われるまでにおよそ2分ぐらいかかります 原理的なパフォーマンスより生産性を優先されることで言語の歴史は移り変わってきたし、
機械語 ⇒ アセンブラ ⇒ C
までは割とはっきりと移り変わってきたと思う。
それ以降、C ⇒ C++ ⇒ Java or C#
についてはうろうろしてる感じ・・・。
やっぱり、今もC++は欠かせないでしょ。 >>380
あー確かにターゲットが広いとC++で全部に最適化するのは現実的じゃないな ツールはマルチプラットホームで動く必要が無いってのが大きいんじゃないの?
Windows, Mac, コンシューマ機 で動くとなると C++ しか選択肢が無かった気がする。
そこにモバイルが加わって、必ずしもC++が移植性の面で最良では無くなりつつあるのかもしれない。 問題点がGCを使うことの有無になってきてる気がするな
適切にGC.Collect()を使えばいいというような話はあるが……どちらが良いかはよーわからんw なんか勘違いしてる人が多いみたいだけど、C#は簡単な言語じゃなくて、理想的なオブジェクト指向をするための言語
そもそもオブジェクト指向が出来ない人はC++もC#もまともに使いこなせないから >>386
まーそうだな。
いずれにしても、ちゃんとした設計ができるというのが前提。
その上でパフォーマンスと生産性(クロスプラットフォームかどうかなど)を勘案した上で適切な言語を選択する。
できれば全部C++でやりたい派だけどw 設計気にせずコーディングでゴリゴリやりたい派が居るからなぁ……
ライブラリが充実してると有効なんだが、充実してない場合は……お察し下さい C++のコンパイラは事前コンパイラだから
実行前にはプログラム全体のネイティブコードが得られるが
プログラム全体を無差別に最適化する分コンパイルに時間が掛かるし
実行時の状況を見て最適化する事も出来ない
JITコンパイルは実行時によく使われたコードだけを最適化するから割と高速に実行できる事が多い
http://ja.wikipedia.org/wiki/実行時コンパイラ その中間がGPUのシェーダーって感じかな。
動的ではないけど、同じコードをデバイス(ドライバ)に応じて実行直前に一度コンパイルする。 JITだと最適化すべき所があまりに多いと最適化が間に合わないし、あまり複雑な最適化はできないだろうけど
プロファイラで遅いところを見つけてそこだけC++で書くことも出来る
そうすれば速度が下がるデメリットより生産性が上がるメリットの方が上回ると思う
Android 5.0は中間コードから事前コンパイル出来るらしいが
インストールに時間取りそうだな
MonoはJITコンパイルが禁止されているiOS向けには事前コンパイルするらしい >>391
だからってJavaやC#が速いってことにはならんからな。
そこを勘違いすんなよ ただでさえ動的な型付けやジェネリクス、クロージャなんかでスクリプトの最適化にかかるコストは高いし
かけられるコストに制限のかかるJITが静的なコンパイラ超えるのはまだまだ先の話だろうな C++入門系の本だと「STLは難しいので分からなくてOKです^^;」とか書いてあるけど
Javaとかの入門書だとジェネリクスやリフレクションも簡単に分かって当たり前が前提
程度の低い人がC++入門書の内容も理解できずに「C++はすごいんだ」と威張っている どこの入門書だよ…
STLのような便利ツールを分からなくてOKなんて書くような入門書はクソ本認定必至だぞ
Unityに絡まれたりC#やJavaに絡まれたり大変だな
一体何が始まるんです? ここで何の言語が速いだのマルチスレッドだの騒いでる連中は怪しいってこと >>394
> Javaとかの入門書だとジェネリクスやリフレクションも簡単に分かって当たり前が前提
何が言いたいのか解らないからここだけに反応するけど、AmazonでJava入門して人気度でソートして一番上に出てきた「スッキリわかるJava入門」って本の目次にはジェネリクスもリフレクションも無いぞ 別にオートマ乗りたい人もマニュアル車乗りたい人も好きにすればいいよ ほんとに最初はSTLなしで勉強したらいいけど、
ある程度できるようになったらSTLを使わない手はない。
STLなしで大規模プログラミングするとか拷問。 そんなことより
Hoge() {}
と
Hoge() {
}
と
Hoge()
{
}
を使い分けるタイミングについて >>401
上は本当に何もすることが無い、空実装の場合だけ
下2段は好み(規約でスタイルが統一されてない場合) バージョンによるかも知れないけどVSでインデント自動だと
Hoge() {}
じゃなくて
Hoge() { }
と中括弧の間に半角空白が入るのが気になる。 大抵のIDEにコーディングスタイル(ルール)の設定あるはず >>389
pragmaでモジュール毎に最適化の指定って一部の処理系のみ? まあ最適化の方針自体が処理系依存だしな
言語仕様で他言語と比較すること自体無意味かも >>381
スペックたけええ
IOくらいしかボトルネックになりそうなところなさそうだけど
2分遅れるってのはちょっと遅すぎだな ソース一枚で2000行ってのはもうちょっとバラせないのかなぁ?
相当大規模なプログラムなんだろうか >>408-409
別の環境(インタプリタ)で作っているゲームがありまして、
一部の重い処理をc++を使ってDLL化し、(インタプリタの方でDLLを読み込んで)使っている状態です
ツール→オプションやプロジェクト→プロパティでいくつか操作した記憶があるのですが、
どれを操作したのかは思い出せなません……。 すみません
http://fast-uploader.com/file/6979396992867/
あまりC++に慣れてなく、アップロード時にどこまで載せるべきなのかが分からないのですが
とりあえずcppファイルとhファイル、defファイルだけ用意したものです
(個人用開発のスクリプトで、本来あまりやるべきではない処理も複数使っているためコード自体はかなり見づらいと思います)
これのdll1.cppの最初の位置の方でコードを書くと波線がすぐ表示され、
dll1.cppの最後の方でコードを書くと波線が表示されるまでに数十秒、#if 0-#endifでの半透明化に2分ほど掛かる状態です かなりの素人っぽいコードになってるな。
これでプログラムは正常動作するんだったらいいけど。 >>354 ガッ ガッ
よくわからんけど、これでいいのか? OpenGLのライトの設定って8つまでしか設定出来ないの? 8つまでは保障されるって書かれてるね
それ以上はGPU次第? 普通にシェーダにuniformで渡せばいいんじゃなかろうか 使わない機能について質問するのは普通なの?
ここってそういうスレッドだった? 未だに固定機能パイプライン使ってるのかよ
ES2.0やCoreプロファイルでは削除されたと言うのに このスレのみんなは何ゲーム作ってる?作ってた?俺は今は2DRPGを作ってる。
作り始めてもう2年は経つが、バイトしながら作っているのでなかなか先に進まない。
その前は剣で敵を殴り倒すサイドビュー2Dアクションとか作ってた。
公開してる作品はまだ無いけれど、今回作ってる作品はようやく公開できそうだ。 いつゲームを思いついてもいいように自分用フレームワーク作ってる
今はポストエフェクトとかの高級機能の追加とパフォーマンスチューニングやってる・・・ 昔3Dのゲーム公開してグラボ必須と明記したのに
オンボードのグラフィックで動かないって言われるから萎えたw 日本語が読めない日本人のコメ欄荒らしなんか今に始まった事じゃないし
ひどいと環境も書かずに動かないのでクソみたいなことを言ってくるぞ
その理由がインストール失敗だったりするし、あの人達は異常
>>425
何か作っちゃえよ…さもないと意味ないってそんな作業 起動時に「こんな貧相な環境では起動できません」とメッセージだすとか 譏斐?ョ繧ェ繝ウ繝懊?シ繝峨げ繝ゥ繝輔ぅ繝?繧ッ繧ケ縺ッ譛ャ蠖薙↓雋ァ蠑ア縺縺」縺溘°繧峨↑窶ヲ
繧ヲ繧」繝ウ繝峨え繧ФI縺ョ謠冗判繧竪PU縺ァ繧?繧雁?コ縺励◆譛霑代?ッ縺九↑繧翫?槭す縺ォ縺ェ縺」縺溘s縺倥c縺ェ縺?縺繧阪≧縺? ごめんなんかすごい文字化けした、なんだこれ
最近になって普通のGUIをGPUで描画するようになって
ようやくオンボードグラフィックの性能も上がってきたよね
的なことを書きたかった・・・ >>430
大半のユーザーにとってはただ処理が煩雑になるだけだな
っつーか、手の込んだおちょくり方だなw 起動時にデバイスの判別とかする?
D3Dの初期化出来るかくらいしか見てないすわ
ていうかデバイスの判別なんて出来るもんなの? GPUのデバイス名を見てショボそうだったらエフェクトを減らしたりして品質を下げるのは良くある やるとしても初期化できるかできなかったらでいいと思う
できなかったらエラーはいてもいいけど,情報をログに出しておくとのちのち面倒になりにくい メーカーや型番を調べるってこと? CAPSじゃなくて。 >>424
いま初めてまともな2Dアクション作ってるんだけども、
当たり判定(四分木・モートン)なんかの実装とか処理の順番で発生する矛盾とか解決するのがしんどい(´・ω・`)
一度作ってしまえば使い回し効くんだろうけれどそれでもunuty辺りに逃げたくなる誘惑ががが box2dでも使ってみれば?
自分で作るよりいろんな意味ではやいと思う >>426
初期のIntel GMA(のドライバ)はD3Dのデバイス機能あると返答する癖に実は使えん
とか、ファンキーな挙動をするゴミカス同然の問題児だなという印象があったが
五年前辺りの製品になるとだいぶマシだたよ
当時、即売会で同人ゲをバラ撒くために貧困糞スペ層対策にPentiumG6950と
i3 540のPC組んでテストしたけど、GF8400GSとRADEON4350載せた時と
速度的にほぼ互角で、プログラム側から見た時のD3DデバイスとしてのIntel IGP
特有のお粗末さに呆れる事も無く、特段配慮せずに適当に組んでも動いたので
感激した憶えアリ
もう五年前の製品なので、今の若い子はこれより新しい世代のハード使ってると
思う。これ以前のGMAの名を持つIntel IGPについては俺はもう完全に無視してる SM2.0〜3.0ぐらいの世代の古いGPUだとD3D11自体は使えてもジオメトリシェーダー等は使えない
https://msdn.microsoft.com/en-us/library/windows/desktop/ff476876%28v=vs.85%29.aspx
D3D11ではFeature Levelsというのを調べればデバイスの対応度が分かる GPUの種類を検出してドライバの問題に対応するのはChromeがやっている
NVIDIA Optimusを使っていると、今アプリケーションが使っているのが内蔵GPUか外部GPUかは検出できないらしいが
検出する方法はないわけでも無さそう
https://code.google.com/p/chromium/issues/detail?id=418418 optimusか…。ウチの場合はIGPでも軽快に動くものを頒布してたから
その辺の不具合報告はたまたま来なかったな。来ても「それドライバ
の設定のせいだろ何とか自力で頑張れ」とか返事しちゃいそうだけど。
対応するとしたらこの辺の情報も使えそうかしら
http://www.garagegames.com/community/forums/viewthread/136127 Optimusは拡大鏡のようなMagnification APIが使えないので
背景を透過させるような処理が使えなかった
GDI通すと負荷が半端無いうえに自ウィンドウの裏が不完全 商業ならやって当然だけど、サークルや個人製作でD3X10以上の機能が必須の
3Dゲーム作るって凄いと思うわ。
自分は一応プログラマブルシェーダは実装できたけどD3X9が限界だし、
ファーやブラーなどジオメトリシェーダ必須の特殊効果やテセレータによる分割って
「それがないと、どうしても実装できないゲームシステムがある」わけではないから…。 自分の場合は、俺がやりたいことをもっとも簡単に実現する方法が
ジオメトリシェーダで動的生成することだったから、DirectX10/11使ってる
たぶんメッシュを工夫するとかすればDirectX9の範囲でもできたことなんだろうけど
個人的にDirectX9の「お作法」に嫌気がさしてたってのもあったから移行に未練は無かった 質問なんだけど、位置情報ってどうやって保存してる?
1、Matrix4
2、Vector3、クォータニオン
3、Vector3、角度(float) >>447
俺は前回は時期的な都合でD3D9で組んでばら撒いたけど、次は
「楽をするために」D3D9切り捨てでばら撒くことにしてるよ
なお「新APIの新機能使わなくちゃ(使命感)」というのは皆無。
D3D10すっ飛ばしてD3D11のお勉強した感想は、あぁ^〜極楽なn 今って、2DでDirextX9からバージョン上げる必要って何かある?
昔はアルファーブレンド使いたかったらDirextX必須だったけど ベクタグラフィックスを楽に使いたいとか
GDI/GDI+との相互運用がしたいとかなら
Direct2Dと連携できるDirectX10.1以降がいいかもしれない
あと、Direct2Dに関連して、DirectWriteを使うと
文字を出すのが超楽になるかもしれない >>450
その情報が関与する数値積分の計算式の都合で使い分け
俺はオッサンだから流行りのやり方は知らんけど、アニメーションの補間
アルゴリズムの都合が絡む所は四元数で回転情報持ってるけど、それ以外
では使ってないよ
例えばシミュレーション部の数値計算は行列で計算してるからわざわざ
四元数に変換して保存する意味ないんじゃね、というような判断で あと
「移行しない理由」が欲しいなら無理に移行しなくていいのでは、とも思う >>452
XPにしがみ付く人に対応する気ありません、という強い気持ちを表現したい場合
とか 今の自分にはあまりバージョンアップする必要は無さそうですね
このままでいきます だからどうあってもしなきゃいけないんでもない限り別に必要ないって
ウイルス定義やOSのアップデートじゃあるまいに
デバイスロストが怖い
ただそれだけで十分だったりするのは秘密 dxlibでblenderで作った3Dモデリングを表示させたいんだけど
テクスチャのUV座標とかは一個一個代入しないとダメってことはないよね?
ポリゴン数多いと骨が折れるんだけど・・・ デバイスロストは再取得する処理をいくつか書けばいいじゃんいいじゃん >>449
その具体例は?
絵の質を上げたいっていうならまだ分かるけど、ゲームのルールに直結する部分で
ジオメトリシェーダが必須になるって、思い浮かばない。 >>463
太さのあるモデルの稜線や輪郭線を楽して描画したかっただけだよ
最初からモデルにつけとけば出来なくはなかったんだろうけど
ゲームのルールに直結なんかしないよ
俺がそういう画面表現したかっただけ
ルールがどうのって話出てたっけ? ああ、>>447の
>「それがないと、どうしても実装できないゲームシステムがある」わけではないから…。
ってのの話?
だとしたら確かにゲームシステムなんかにゃ関係ない話だったな、すまんね ジオメトリシェーダって技術的には興味あるんだけど、ゲーム用途だとオーパースペックな感が。
絵のセンスを求めてる人はいても、絵のリアリティを求めてるゲーマーって少ないし。
同じ「プログラム技術」でも、経路探索とか衝突判定の方がゲーム内容に直結してる気がするんよ。 2Dのゲームだと未だに画像貼り付けで十分だったりするからなぁ
3Dになると途端に描画系に求められるものが跳ね上がる……というか、中途半端だとショボく見えやすい そういや昔、DX9やだやだDX7でいい、と駄々捏ねてた連中がいたっけ 2Dでも、画面解像度と色が多くなると、DirctX 3D処理で2Dを書いたのが速くなる。 blenderでエクスポートした拡張子.xの3Dモデルを
下のアドレスのサンプルコードで表示させようとおもったんだけど
ttp://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_3d.html#R1N1
真っ暗で何も表示されない
拡張子.mqoでエクスポートしたやつなら真っ白な3Dモデルがクライアント領域に表示されるんだけど
.xで表示されないのは何が原因なんだろう >>470
ライトの設定?
よくわからないけど「blender directx エクスポート」でググれば? >>471
返答ありがとう
「blender directx エクスポート」あたりは既に昨日から何度もググってるんだが一向に分からないんだ
だけどさっき画面を良く見ると下のほうにすごく小さい点があって
dxlibに付属されてるDxLibModelViewerで例のモデルを見てみたら最大頂点座標と最小頂点座標が約-1〜約1しかなくて
エクスポート時になぜかものすごく小さくされてることが分かったんだ
だからこれはblenderの問題っぽいのでここで失礼する事にする
でももし対処方法を知ってる方がいたら教えてくれるとありがたいです DirectXは旧バージョンとの互換性をガンガン切り捨てるけど、
古いバージョンをラップするのってやっぱり技術的には難しいのだろうか
まあ、根本的な仕様変更の問題もあるんだろうけど 旧バージョンのインタフェースをくれといえば、ちゃんと使えるだろう?
ある世代内では、互換性は維持されるし、仕様変更も無いはずだぞ。
新バージョンのAPI体系がガラッと変わるのは、時代のニーズなので仕方ない。
ただ、よほどのこだわりが無ければ、今後は、ゲームエンジンを使うか、
WebGL の関係で GL 系を覚えたほうが役に立つとは思う。 DirectInput8でジョイスティック設定するようにしてたら9で切り捨てられた。
仕方ないので9でオブジェクトの名称と機能を対応させてたら、ある日名称が変更された。
ガン切捨てくらいはされてるよw APIに依存するようなところは自分でラップしといてバージョン変わったら書き換えるくらいしかないんじゃないかな
インターフェイス変えないと立ち行かなくなって結局大改修になる可能性はあるけど 古いバージョンそのまま使えばええやん。
何か不都合あんの? 無くなったものはその新機能にそぐわないからなくなってんだよ
それぐらい解るだろ どんな理由だろうが無くなれば困る奴はいるんだよ
それぐらい解るだろ 少数の無くなって困る奴を気にしすぎると新バージョンの開発が難しくなるんだよ
それくらい解るだろ そもそもDirectInputって切り捨てられたことあったっけ?
Windows SDKに統合された今でもヘッダとライブラリ残ってるし開発できるでしょ 新しいバージョンで無くなって困るって言ってる奴はその新しいバージョンの設計思想を読み取れないアホなんだから、移行せずに古いほう大人しく使っとけ 3D箱庭ゲーみたいな面の各頂点がバラバラのマップデータの処理ってどうやってるんだろう
正方形の地形が並んだxyデータだったら
指定した座標から地形を読み込んで処理すればいいのは知ってるけど クオータービューも座標変換する前は普通に二次元のマップだと思うけど >>489
クォータービューは3次元なはずだよ(2次元ももちろんあるけど)
xyだけじゃなくてz座標もないと奥行きと上下左右の同時表現が成り立たないし
あとあれも大体は一定の大きさの立方体の集まりだから
指定したxyz座標と立方体の大きさ(16だったら座標/16)で計算すれば読み込むべき地形を特定して処理できる
俺が知りたいのはその立方体の大きさや頂点の位置がばらばらだった場合の処理なんだよね・・・ クォータービューがFFTみたいなの想定してるなら、z座標はセルごとに値で持っとけばいい
3Dの地形だって立体交差とかしない限りは同じでいい >>491
いや同じだと立方体のがくがくした地形しか作れないとおもうんだけど
マリオ64みたいに地形を作りたいんだよなぁ
俺の説明の仕方が悪かったかもしれなかったらすまん ごめんもっと簡単に言うと
大量のポリゴンがある空間の中で座標を指定した時
どうやって適用されるポリゴンを選ぶことが出来るかれるかが分からないんです 地形で簡単なのが、”高さマップ” 碁盤の目の座標に高さデータを加えるだけ。
自由度が高いのが、Xファイルで作る方法。モデリングソフトで作ればよい。
ポリゴン数を少なくするように工夫がひつよう。
非力なパソコン用に使われた方法では、”BSPマップ”がある、
マップを細分化して分割する、その中から必要な部分だけを表示する手法。 もしポリゴンで判定したいなら、基本的には点と三角形の当たり判定になる。
重力判定であれば、その方向の直線がぶつかるポリゴンを見つけるのは難しくは無いだろう。
軽量化のために、メッシュ空間を予め分割しておくこともある。
描画用の細かいメッシュのほかに、当たり判定や移動判定用の荒いメッシュを持つ場合もある。
壁へのめりこみ判定も似たようなものだが、市販のゲームでも「壁抜け」系の
バグがよくあるように、完璧なものはけっこう難しい。 >>493
その程度も解らないなら既成のゲームエンジン使っといた方がいいよ
竹槍で航空機へ挑んでる感じ >>497
一応方法としてはポリゴンごとにオブジェクトと距離測って範囲内にあれば処理するくらいならあったのだよ
でもそれだと処理量がすごいことになっちゃうからね
今からゆっくり理解するよ
ありがとう モートン序列というので大量の判定を軽量化出来るってどっかのサイトにあったが
地面との着地判定にはどう使うんだろうか
オープンワールドの地形よろしく分割されてれば出来そうだが、マップ読み込んだ時に自動的に分割されればデザイナーにも優しいかも あれ、今言われたことを踏まえて改めて調べたんだけど
もしかして重力判定で通過したかどうかは一定の範囲のポリゴン全部チェックする必要があるんだ?
二次元データみたいに指定したxy座標にブロックの有無と種類を判別して処理ってことに近い事はポリゴンでは出来ないって事だよね?
これ重くならないか不安だったんだがこういう認識でOKだよね?
本当頭悪くてすまん >>500
キャラクターだろうが地面だろうがひとつのオブジェクトとして扱うのが一番簡単なんじゃね
今モートン序列当たり判定自作してて各ブロックにオブジェクトを挿入するところまで出来たけれど、
肝心の探索でバグってて総当たりよりも遅くなっててわろえない 同じブロックに入ってても通常より処理が増えるだけだからな
スカイリムみたいなオープンワールドで始めて効果を発揮するんじゃないか?
まぁスカイリムでもマップの反対側で当たり判定動かしてるのかわからないが >>501
ポリゴン全部っつーても、衝突判定に描画に使ってる精細なポリゴンをそのまま使う必要はなく
基本的にはそれを簡易化した描画しないローポリや、球、箱などとの判定でok DirectInput8のためだけにDirect8で止めておく選択肢はあったかもなw
名称が変るのは回避できない可能性があるが。 ポリゴンのあたり判定もそれをやる前にオブジェクト毎にAABB(aligned axis bounding box)を持っといてそれで大まかな判定したあとポリゴンであたり判定するとかね
AABBは描画するときにもつかえる 出来るだけ少ないポリゴン数で遮蔽ポリゴンを作っておく(実際のポリゴンをはみ出ないように)
1.遮蔽ポリゴンだけを使ってデプスのみ描画
2.描画判定するオブジェクトのAABBをそのデプスを使って描画されるか判定(デプステストをパスするピクセル数を返すだけのAPIがある)
3. 2で描画されるピクセルがあると判定されたものだけ実際に描画する
いくつか方法あるけどスタンダードなのはこんな感じ Clipping
Culling
Occlusion
でしょ C++/SFMLライブラリを使った2Dベースのゲームを作っているのですが、
自分で調べた感じですとSFML自体ではz-orderingの機能は持ち合わせていないようです。
こうなるとやはりvectorなどを用いてマニュアルで描画順をうまくやりくりするしかないのでしょうか? >>511
http://en.sfml-dev.org/forums/index.php?topic=7535.0
ちょっと古いやり取りだが、z-orderの機能はないし、リクエストも却下されたらしいぞ。
自前で管理するしかないんじゃないか? >>512
早速の返答ありがとうございます。
dxlib関連の記事のようですが下記のようなサイトを見つけました。
こんなかんじで描画順を管理できるように試してみようと思います!
ありがとうございました。
ttp://ktkrmjskmjds.blog119.fc2.com/blog-entry-4.html BtconというWiiリモンコンをPCで使えるようにするツールを作っているのですが、
これはwiiyourself!ベースでwiiリモコンを制御しています。
しかしwiiリモコンプラスと元祖wiiリモコンで違いがあり、wiiリモコンプラスにwiiyourselfが対応していません。
wiiyourselfのほうがwiiリモコンプラス発売より前に作られたもので、開発が止まっているためです。
自分で調べて動いたという情報を元に改造してみたりしているのですが、動かなくて困っています。
詳しい方がおられましたらヒントをいただければ助かります。
http://xbmc.inpane.com/main/rc/wiiremote.php#mc wiiリモコンプラスはMSスタックは繋がらないようで、東芝のスタックであれば繋がりました。 DirectX9でミップマップって勝手にテクスチャ入れ替えてくれる? シェーダ側では、ミップレベルを指定したい時はわざわざtex2Dlod()を呼び出すくらいだから
一般のtex2D()は自動でミップマップされてると考えていい。
ただもちろん、ハード対応してればだし(今動いてるPCはまずしてるだろうけど)、
「ミップレベルを入れ替える」のではなく「周辺の2つのミップレベルを補間する」実装のはず。 あ、ごめん、サンプラステートのMipFilterのことを忘れてた。 UnrealEngineのコードへのアクセスが無料化されたけどこのスレの住民は興味なし? ゲームエンジンでは実現不能なアイデアばっかりなんで UE4課金してるし無料になるならラッキーって程度。 興味ないどころか、この板自体がウニと非現実のステマに占領されてるので
嫌気が指してる。でもこういうのに限って板分けないだろうな運営。 っていう時代に取り残された人達が多い所か、ここは。
オクルージョンカリングの質問にもまともに答えれるひと居なかったし オクルージョンカリングで思ったんだけど、
例えばキャラクターが建物やらの後ろにいて隠れるけど、
影は建物から出るって時、影は描画されるのん?
判定用モデルでそのまま影描画しちゃう感じ? シャドウマップを作るときはライトからの視点になるから、
また別のオクルージョンカリングを行うとか? オクルージョンカリングね
あれうまいよな
でも俺はポンデリング派だな 影はビューカリングだけじゃない?
z-prepassすればそこまで重いものじゃないし影用モデルでかなり最適化できる。
オクルージョンカリングは描画結果のピクセル数を取得して0なら描画しないだけだよ。 オクルージョンカリングってgpu内で完結できたらいいのに。 大きなトレードオフがないならGPUでやってほしいよね >>528
くだらない事言ってるとお前の*に->するぞ >>530
>>531
簡素な遮蔽ポリゴンと、事前計算した超軽量なAABBでデプステストをパスするか確認するから軽くなるんだよ。
デプステストをパスしなかったら描画する対象のvertex shaderすら動かす必要が無いからね。
GPU内で完結するようにしたら実際のポリゴンを使うしかない。
そうすると、どうやっても全頂点計算するしかない。
それで隠れるポリゴンがあればfragment shaderは実行しなくて済むけど、それはTBDRっていう方法で既にGPUで実現済み。
ピクセルを書き込む回数を減らせるからメモリ帯域の狭いモバイルGPUでよく使われてる方法で、PowerVRが昔からその方法を使ってて有名。
それも半透明とかアルファテスト使うようなポリゴンがあると使えない。 なんか2chの専ブラでハードコーディングしたからAPIキーが割れたって言ってるけどコンパイルしてネイティブコードに変換されて読み取れるもんなの? オーバーフローと配列範囲外のチェックってどうやんの if ( hoge.length() - 1<i ) return; 入門ゲームプログラミングって本買った
まずロベールのC++本で基礎を身につける >>537
lengthがsize_tを返すのであればemptyの時に死ぬね そんなん配列のnullチェック先にするに決まってんだろ >>540
hogeってのは生配列を返す関数持っててnullチェックしないと使えない糞コンテナなのか?そんなもん窓から投げ捨てろ >>541
なんか話噛み合ってないと思ったら、javaと勘違いしてたごめん。
あとjavaにしてもlengthの後の括弧いらんかったごめん。 ヘッダでstatic constな配列を初期化することってできない? const_castとかあるけど使ったことないから分からない DXライブラリで一通りゲームを作って次はDirctX9でゲームを作ろうと思って本なり読んでるけど
入力関連とかメインループ文に入ってるように見えないのになんで操作できてんだこれとか色々わけわかんなくてDXライブラリに逃げちゃいそう 入力の取得関数の所にブレークポイント張ればいつ呼ばれるか解るだろ
ソースレベルで追えないんじゃそのあとも苦労しそうだが メッセージ系の処理の話かな?
Win32の仕組みを知らないといろいろわからないかもしれない
って言うか無理しないでDXLibでいいと思う >>545
まさかまかりなりにもDxlib使ってゲーム作った経験があるのにコールバック関数を知らない訳じゃないだろうな・・・w 最低限の機能を使うだけなら、コールバック要らんぜ? 名前聞けば皆知ってそうなFLASHゲームの製作者なんて構造体すら知らなかったぞw
実装力>>>知識よ。 コールバックの利点ってなんぞ
軽い機能ならswitchすればいいしでかいならクラスごとするし手間かかるだけじゃないのか 誰にも迷惑がかかるわけでもなし
メリットが無いと思うのならば使わず突っ走ってみるのも一興
スマートポインタ?delete忘れるわけねーだろとツッパっていたら
見事に二重deleteを踏み抜いて以来
スマートポインタ教になった俺みたいに スマポ(RAII)は誰もが魅了される素晴らしい作法。 C++も、デフォルトで、ベクトル演算や行列演算のコンパイルができるようになればいいのに
コンパイラに任せると、機械語でオーバーヘッドが膨らみ過ぎるのかな・・・ どうせベクトルや行列の型を指定するんだから見た目だけなら演算子オーバーロードでいいだろ
そうじゃない自動ベクトル化ならIntelCでも使えよ、一応VCにもあるけど >ベクトルや行列の型を指定するんだから見た目だけなら演算子オーバーロードでいい
要するに自分でクラス定義して、そのクラスを引数に取る演算子のオーバーロードするって事だよな。
それって面倒じゃん?
たとえば、ベクトルxとスカラーcがあるとして、
例えば、x-cなんかで、cをベクトルに拡張して四則演算してくれるようにコンパイルをしてくれれば便利だ
記述が、すげースッキリするぜ HLSLとかGLSLはそうとも言えるんじゃね?
C++に含めるのは仕様が膨らみすぎるしどう考えてもありえないけど >>567
スカラーをベクトルに拡張してって話をどうこねくり回しても並列化にたどり着かないんだけど 行列の話と、CPUの最適化の話がごっちゃになっとるなwww
Phiとか扱わんだろうからなぁ >>564
C言語でも、静的配列はsizeof()で、要素数が求まるじゃん。
だから静的配列に限っては、それほど無理なコンパイル要件でもないと思うんだ。 >>571
そいつに言ってるわけじゃないし
ID:0emdsjcu
はどう見てもベクトル命令の方は言ってないだろ返信の為に引用した方から見ても unityとかue使わないのにはなんか理由があるの? >>574
オープンソースじゃないと嫌な宗派の人たちとか
反プロプライエタリエンジン派の人たちとか? ゲームを作るだけが目標じゃなくて
技術習得とか作る行程にもこだわりがあるとか >>576
まさにそれ。
ゲーム以外でも応用できる技術を身に着けるのが楽しくてしょうがない。
会社(非ゲーム)でも役に立ちまくってる。 日本のIT屋はOSやオフィスソフトなんかを作らなかった
結果世界を相手にできない
日本のハード屋はゼロから作ること(メイドインジャパン)にこだわった
結果世界を相手にできてる
unityとかもいいけどゼロからでも作り上げれる技術は保持しときたい
だからC++は捨てれない 俺もだ
つまり、元々ゲームが作りたいんじゃなくて、プログラミングを楽しんで色んな技術や知見を得たい。その過程の一つとしてゲーム作ってるだけ。 >>578
言語は関係ないのでは?
コピペしたいなら別だけど >580
VMでもスクリプトでもなくハードを直接叩けて多くのプラットフォーム向けのコンパイラのあるOOPも関数型もいける高級言語って他にある? ガベージコレクタないらしいじゃん
それだけで使う気になんないわ C++11が神すぎて愛してる。
>>584
ガベコレの必要性が分からない。
スマポじゃダメなの?? たしかガベコレのCライブラリもあったはず
わざわざC++でガベコレの使うぐらいなら
それでこそJavaでよくね?とは思うけど
使いこなせる人はきっといるのだろう
ま、使いやすいと思う言語を使えばいいのさ ジャンルにもよるけどゲームの場合はガベコレはデメリットが大きい
ガベコレ中はどうしても処理負荷がかかってしまう
あとガベコレでも循環参照とかメモリークの危険性はある 循環参照を上手いこと扱ってくれるのをガベコレって呼ばないか?
単純な参照カウントは含まないイメージがある 処理が高速なのが売りの言語にそんな物を突っ込むこと自体が…
しかも、CPUの進化で結構余裕が出るようになってきたとはいえ1フレームを争うゲームで
まあ、処理の速さを活かして動作安定性を高めていると言えないこともないが そのあたりの利便性と実行速度のバランス自体を作り手の技術と裁量次第で自由に出来るのがC++の良さ
例えば、マークアンドスイープをメモリ領域を小分けにしてフレーム単位で分散して実行するとか
同じサイズのオブジェクトが大量に生成破棄されるならそれ用のメモリプール作っておくとか マークアンドスウィープ方式のGCを自分で実装なんて考えたこともないわ boostあたりでgcライブラリを出してくれてもいいんでねえ?
スマポの延長みたいな感じで どうせ何かしらのスクリプト組み込むんだからGC必要な処理はそっちでやればいい プログラミング初心者にはわからないと思うけど、プログラミングそのものが有名ゲームをプレイする以上に楽しかったりするんだよね
むしろお金を払わないでプログラミングができるってだけで結構楽しかったり 料理とかプラモデルみたいな感覚って説明してる。
それを楽しいと思えるかどうかは別として。 問題は覚えるべき要素も多くて取っ付きにくいことと、
言語仕様がとっ散らかってて時々その仕様に悩まされることだ C++11は洗練されてて好き。
まぁ、それでもプログラミングを楽しめるかどうかは適性次第だろうね。
自分はC++11が超キモチイイ。 それは幸せなことだ
初心者は喜びを知り
中級者は苦しみを知り
上級者は無常を知る
それがこの世界の理よ 当方ビジュアルスタジオ2010にてアクションゲームを作っているんですが、
デバッグ中、配列に格納したマップ情報とオブジェクトとの判定をする部分で
ごくまれにエラーが起きて停止します。
経験則で判断すると、マップ判定でのエラーは
マップ情報の無い部分にオブジェクトが飛び出すというものが多かったんですが
今回は目視ですべてのオブジェクトが飛び出してるか否か確認出来る状態で
毎回エラー発生時に怪しいオブジェクトがいないので、今までのエラーとは違うような気がします。
しかも、滅多にそのエラーが出ないため、原因を探れません。
ただ、気持ち悪いことがひとつありまして、そのエラーで停止したあと、
マップの情報を入れた配列にカーソルを当てて、要素を見たら、
途中から「?」という状態になって表示されてるんです。
http://download1.getuploader.com/g/zipcodezipcode/91/B.png
http://download1.getuploader.com/g/zipcodezipcode/90/A.png
これがおかしなことに、見るのを止めて、もう一度カーソルを合わせてみると
今度はちゃんと中身が入ってる状態で表示されたりします。
ビジュアルスタジオの扱いにまだ慣れてないせいもあり、
中身が「?」で表示されたのは初めてだし、覗き直すたびに
「?」だったり、ちゃんと中身が見れたりすることが気持ち悪いんですが
これは別に、問題ないのでしょうか?(もともとそういうものだ、とか)
もし、ゲーム中に配列の中身が「?」みたいになる瞬間があるのなら
そりゃいきなりオブジェクトがど真ん中にいてもエラーになると思うんです。。。
これが原因なのかと思うんですが、、違いますか?
もしくは配列覗いたときの、「?」表示はビジュアルスタジオのバグなんでしょうか?
ちなみに、マップ配列の中身の格納はゲームが始まる最初に行っているので、
ゲーム中にマップ配列の中身が変わることは考えられない仕様です。
だとするとこの「?」はなんなんでしょうか?
考えられる要因を教えて下さい、お願い致します。 その覗き直すってのは、実行を停止してる状態での話? >>603
深夜なのにレスありがとうございます。
リリースで実行中に、エラーが起きて「中断」します。
そのときに黄色の矢印がつきますよね、エラーが起きたところで。
中断状態ですね、デバッグモードになってるんでしょうか、
その時の話です。 DXライブラリでデータベースと連携させてアカウント制のオンラインゲームとかって作れる? DXライブラリは、ただのDirectXのラッパだ
別のライブラリなり、自前なりで用意して組み合わせれば当然出来るだろう
DXライブラリにそういう機能があるか?って質問なら、無い。
そういう質問をするレベルの人が作れるかと問われれば、相当厳しいが頑張れとしか。 >>601
マジで最近は技術の陳腐化がものすごく早まって、
ちょっと前までこれが最新最適とされていたコードがもう古い役に立たないコード扱いされてたりして、
そういう意味では無常ではある 安定の99BASICとDarkBASIC。(キリッ ゲームのAI作るの楽しいな
一応動いてくれた時の感動がたまらない
けど相手に合わせて学習するようなAIはデバッグが難しいね >>611
わざわざ99BASIC未満の環境なんか逝くかよw お前ならヒーローになれると思ったのになー、残念だわー 参考書増えすぎて置き場所がなくなってきた
ブックエンドいくつか使って何とか置いてたけど
ちゃんとした本棚買うべきか・・・ 本棚買う金で新しい参考書買えるんじゃね?って考えてしまう気持ちもあってなぁ・・・ 今日発売の ゲームプログラマのためのコーディング技術 って読んだ人いる?
少し立ち読みして良かったら買おうと思って近所の本屋に寄ったけど置いてなかった
ゲームのシステムがある程度の規模になってくるとゴチャゴチャしてきて
わけわからなくなってくるから綺麗なコード書けるようになりたいんだけど参考になるかね?
専門学校時代も入れるとゲーム製作は3本目なんだけど、
いまだに悩んでるスパゲッティコードをなんとかしたい あ、3本目って言うのは一人で全部プログラミングしたって意味
分担ならもっと多いです 読んでないけどゲームプログラマのためのコーディング技術なんて
ループしないで並べるとか細かくメモリとらないとか、
綺麗なコードとは関係なさそうなイメージしかないけどな 汚いコード書く奴ほどバグ出してると感じることはある
綺麗に書こうと努力してるコードは何かしらのこだわりを持って書いているからだろうか
必然的に保守し易くなる傾向にあるとも思える
しかし何にも増して重要なのはやはりセンス >>622
まったくの同意。
美意識の低い人間のコードは見辛い、保守性悪い、汎用性、可搬性が考慮されていない等々、機能的にも美しくない。
こういうやつの尻拭いがまわってくる度に怒りが込み上げてくる。
うっかりミスや、見通しが難しい段階でのコーディングなど、止むを得ないことは仕方ないが、
もうちと考えるなり拘るなりしようや・・・。 とりあえず動けばいいやと考えて作るから場当たり的になってコードが汚くなるんだよ
はじめに全体像を大まかにでも作り上げておいて、それに従って体系だったコードを書いて
場合によっては書き直しも視野に入れるくらいしないと後でバグ探しが大変だよ 継承しまくってもはやどれだけの要素が絡んでるのかわからない子クラスとか、
ソースで使う要素が書かれていないヘッダとか、
あまり意味のないtypedefのせいで紛らわしくなってるソースとか、
ろくに改行もせずにごちゃごちゃ書きなぐってるソースとか…
可読性は落とそうと思えばいくらでも落とせそうだからなぁ >>625
たぶん、「とりあえず動けばいい」というコーディングをしつつも、
最低限の体裁が整ってるような、基礎力が必要なんだろうなあ
勉強しなきゃ いつオープンソース化しても恥ずかしくないような
きれいな設計を心がけている 3回も書き直せばマシになると思う
というか当たり前だけど、設計って細かい点までどうしてそうしたか説明できないと >>619の本がアマゾンのゲームプログラミングカテゴリで売れ筋1位になってんな そのニッチなことに興味あるのがこのスレに居る奴らだろう 技術テストだから・・・と書き始めたコードを、体裁整えて本番用にしてしまいました。
構造体には、今後を見据えた無駄が沢山ヽ(`Д´)ノ
関数には、アップデートの過程で使われなくなった関数そこそこヽ(`Д´)ノ
グローバル変数こそ控え目なものの、そこかしらに謎の変数int i;が溢れていますヽ(`Д´)ノ
うん、もう少し頑張ろう。 >>619の読んだ人はいない?
まだ現物見てないからすでに手に入れた人がいたら感想聞きたいが >>635
バージョン管理ソフトで定期的にバックアップを取りつつ、
使わなくなった関数は消してあげるといいよぉ
っつーか、使わないなら消してくれ 頼むから 幸福を固定された状況で規定するのは無意味
重要なのはどれだけそれを望むかということ
それに富と名声が同時に手に入らないと決まっているわけでもない
わざわざ自分から天井作ることはないだろ
ニートよ大志を抱け 前スレ >>996 です
やっと移植終わりました
60ポリの飛行機が120fpsでしたがw
とりあえずOS(バイナリのみ)ともとにしたPC版ソースあげてみます
http://www1.axfc.net/u/3540804 14歳からはじめるC言語わくわくゲームプログラミング教室 Visual Studio 2013編p148に
//画像を読み込み
if (LoadGameImage() == FALSE) return -1;
というのがあるんだが
画像をこれで読み込んでるらしいが
プログラムに異常があったときの処理があるようにしか見えない
それともC++とDXライブラリではこれが画像読み込みを意味するんだろうか・・・ >>646
読み込みとエラー判定を兼ねているのではなく? >プログラムに異常があったときの処理があるようにしか見えない
これが具体的に何を指すのかが分かれば
答えようもあるんだが http://www12128uf.さくら.ne.jp/forum/viewtopic.php?t=16197&p=128079
ここに>>646が言ってるものと思われるコードが載ってるけど、
エラー判定をするif文に何か関数が入ってれば当然その関数もif文を判定するときに実行される
だからエラー判定の一行だけで画像の読み込みも同時に済む
これはDXライブラリの仕様ではないよ
>プログラムに異常があったときの処理があるようにしか見えない
これは失敗した時に-1を返すようになってるからそう思ったんだと思う
DXライブラリの関数でもそうなっているね if(!Func()) return 0;
みたいな書き方を俺はよくしてるけど
"!"よりも"== FALSE"の方が可読性高かったりする? 俺も!だと一瞬で理解できないな。
!strcmpとか書かれるとそこで1秒固まる。 んなことはない
俺は!でも分かるし
オープンソースソフトウェアのソースコードでもよく使われている あああ ありがとうございました
if文の中の関数が実行されるとは・・・ !はよく使うけど、if文の中に関数は書かないな。
エラー処理とかしたい時は一旦hogeでも挟む。
strcmpとか条件分岐で使うのが前提みたいな関数は書くけど。
ってか人多いな。 >>653
!がわかりにくいのではなくて
strcmpのような真偽値でない値を返す関数に対して!を使ってる
本質的に正しくない書き方だからじゃないか? !か==FALSEかの可視性に関してはその関数が何を返してくるかによると思うけどね
>>658
自分も一旦変数で受けてから評価するかな 半年ぶりの書き込みだって言うのに結構レスついたな
書き込みなかっただけでチェックしてる人はいたのか !使うときって、正常終了時は0が返ってきて、エラーの時は0以外(エラー番号)、
ってな関数の時に使うこともある
他人に判りやすく書くなら、S_OKとか使った方がいいんだろうけど 今回の件の反動で>>656が変態Cプログラマーになる確率90% でも多少の文法の違いはあれど、
C/C++以外でも頻出する用法よね… 確かに戻り値0orNot0とstrcmpは分けるべきだったな、失礼。
お願いだから、0<strcmp(a,b)って
書き方だけは止めてくれーーー!!(心の叫び) strcmp(a,b)<0は、a<bって脳内変換できるけど、
0<strcmp(a,b)はa>bになって、不等号が逆になっちゃうんだよね
if (a==1) を if(a=1)としてもエラーにならないから
if(1==a)って書きましょうっていう
コーディング規約の影響なんだけと Javaのコーディング規則で、必ず左側に、
小さい方を書く、というのを見たことがある
a < b OK
a > b これはダメ 不等号は基本的に小なりを使いたいってのは、分からんではないかな?
「必ず」ってなると面倒そうだが。 「統一した方がいい」という発想は分かるけど、何でも絶対的な規則で
統一するのが正しいと考えるのは中級プログラマの悪い癖だよ
文脈上、xという変数が意味を持つ箇所で「x > 0」でなく「0 < x」と書くのは
だだの教条主義。「臨機応変」が正解なんだ 「初心者がgotoを連発するよりは、全面禁止にしてしまったほうがトラブルが少ない」
みたいな類かもしれない 原則的に不等号は直接書かないようにしている。
比較なりなんなりは“ホニャララ”かどうかを判断するためにあるのだから
“ホニャララかどうか”というマクロなり関数なりメソッドにしてる。 その発想も確かに正しいが、
比較1つ程度でなんでもかんでもそれやると、逆にわかりにくくならん? >>672
よくある規則としては
特別な理由がない限り従うこと
だ。
特に共通部品系を作成する奴はスキルが高い事が大前提のため、規則を無視することが多い。
十分にデバッグするしね リスト構造ってゲームの場合どういう時によく使われるんだろう? 大量のオブジェクトを駆使するゲームなんかだと
まだ使うことはあるのかなあ…? Siv3D触ってみたけど
while (System::Update())
{
}
こういうスタティック上等、エラーも返すで^^な書き方って何の影響を受けてんの? リストは削除と挿入のコストがO(1)だから増えたり減ったりが多いような時に使う
ただし検索コストはO(n)になる >>677
2Dゲーム作ってます。
リストはキャラ情報繋ぐのに使用。
先頭さえ押さえておけば、キャラ情報領域を総当りしなくても良いので便利。
ついでに作画順番も決まるので、順番を調整すれば重ね合わせも制御できます。 exists みたいなフラグが1つ減るというのは
ちょっとだけスマート。。。かもしれない リストじゃなかったら配列ってメモリ配置の事言ってるのか?
データ構造の事なら他にも色々あると思うが こういうデータ構造が向いてる、ってのが分かってるなら、そっちを使うだけで
用途を限定しなかったら一般的には配列になるんじゃね むしろデータ構造なんて用途ありきなんだから用途を限定せずにって前提は無意味な気が
超汎用のコンテナ作ってるならともかく ゲ製板の任意ワッチョイの導入についての投票を8月7日(日)に行います。
ご希望の方は是非参加お願い致します。
http://tamae.2ch.net/test/read.cgi/vote/1469829608/ 今からDirectXやろうと思ったらDirectX11でいいんだろうか
9のほうがサンプルとか記事は多いけど… 9に比べて若干ハードル高いけど11から始めた方がいい 1週間前にも告知いたしましたが再度告知致します。
ゲ製板の任意ワッチョイの導入についての投票を8月7日(日)に行います。
スレの>>2の訂正部分に気を付けて是非参加お願い致します。
http://tamae.2ch.net/test/read.cgi/vote/1469829608/ C++ゲーム制作ライブラリで
https://developer.mozilla.org/ja/docs/Web/CSS/border-image
こういう処理を提供しているのってありますかね?
会話ウィンドウとかこういうのあると結構便利だと思うんだけど 【訂正】
>>694において8/7(日)に行うと告知されたワッチョイ導入についての投票ですが、
自治スレでは投票の是非について結論が出ておらず、
現時点において投票の実施が決まったという事実はありません
なお、ワッチョイ導入そのものが否決されたわけではありません
導入についての議論は現在も自治スレにおいて継続中です
ご意見のある方は自治スレまでお越しください
■ ゲーム製作技術板自治04 [無断転載禁止]©2ch.net・
http://echo.2ch.net/test/read.cgi/gamedev/1469698797/ 荒らしが出没しておりワッチョイの議論だけでなく投票自体もまとまらないから
投票を開始しましたが【訂正】と言い投票自体を妨害する方が出没しています。
投票自体は20:59まで行っており、確認時間も23:59までの3時間行っておりますので
是非参加お願いいたします。
http://tamae.2ch.net/test/read.cgi/vote/1469829608/ >>695
可変サイズを求めなければ、ピクチャの上にテキスト配置するだけじゃないの ,彳;;;;;;;;;;;;;;;;;;;;;;;;;;、
/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;,ヽ 涙が あとからあとから あふれ出て
/;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;t、
,';;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;z 止めることができなく なる
!;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;i
|''';;;;;;;;;;;;;'''" ,;;;;;;;;;;;;;;;;;;;;f ニ;、 マヨーレマヨーレ!
{丁 "'' _ ,;;;;;;;;;;;;;;;;;//万 !
! .i厂\( \ 六夂 i、__ http://goo.gl/kY6CYb
! .{.\ \ \ ,' ! ‐ ´  ̄ ̄ Zz、
i >、 ヽ \ \ | | \
.| \\\ ヽ ー= ! .\
! \\\ 、,. `' | ヽ
} ≧! 、,,. ! !
ノ .', | |
./ 八 ', !
/ ./ .>‐、 .∧ :; .!
./ / / ヽ \ ∧ !: ハ
/ / ./ ', ヽ .∧ / ノ i
/ / , ', ∧ ! ' !
// ! ∨ ∧ ,' i .!
/ / セ、 ∨ ∧ ! ! .|
/z ´ .\ ∨ \ _| .' .| 並列処理しても、キャッシュ機構がネックになるから、
参照するヒープが膨大だと、
必ずしも速度倍率=動員コア数とはならないな 3dモデルを描画するときってどうするのが一般的?マテリアルごと? >>705
マテリアル別、テクスチャ別でソートしてた希ガス namespace GameObject{
namespace Player{}
class Player;
}
visual studioで上記のことやりたいんだけどできないんだけ?
前提としてフォルダとnamespace構造をいっしょにしたい。
現状の実装
namespace Player{
class Player{};
//PlayerHelperClass,Function
}
みたいなことやっているけど
GameObject::Player::Playerってなんだか気持ちが悪い
これを避けるためにnamespace PlayerHelperを作ったほうがいいのか悩んでるんですけど
皆様はどうしてます? >>708
PlayerHelperをクラス内クラスにするってのは無し? ありですな
ありがとう
クラス内クラスにする場合、クラス内に前方宣言しとかないといけないのが欠点だけど
大した手間ではないけどうーんこれがベターか?
c++ではpartial class的なことできればな
ヘッダー汚れなくて済むのに
他のコンパイラだとnamespaceとclass被ってもコンパイルできたりするのに
player.hとplayerhelperfuncを同じフォルダに入れたかったから今の設計にしたんだと思うけど、別に同じフォルダに入れなくてもいい気もしてきた
ありがとうございました 簡単にお金が稼げる方法興味ある人だけ見てください。
グーグル検索⇒『来島のモノノリウエ』
L23CW9IZ1K ■ このスレッドは過去ログ倉庫に格納されています