C/C++ゲーム製作総合スレッド Part1

このエントリーをはてなブックマークに追加
952名前は開発中のものです。:2012/10/21(日) 11:05:03.38 ID:2HisPjSj
マシン性能におんぶにだっこで、できる改善をやらないのは、プログラマの行動じゃないと思う。
953名前は開発中のものです。:2012/10/21(日) 11:12:14.23 ID:VgVyyYQT
じゃあ全部ハードウェアで実装しろ
954名前は開発中のものです。:2012/10/21(日) 11:26:14.12 ID:utAVkLK4
改善というのは、できうる限りマシン性能におんぶにだっこさせることなんだが、
それがプログラマの行動じゃ無いというのは、いったいどれだけ愚か者なんだろう?
955名前は開発中のものです。:2012/10/21(日) 11:29:52.39 ID:uEOq6DXM
ハードに頼れない馬鹿なプログラマはクビだ
956名前は開発中のものです。:2012/10/21(日) 11:40:08.93 ID:fWFEJkHx
こいつらってハッカソンとか勉強会に参加してない低能なんだろ?
957名前は開発中のものです。:2012/10/21(日) 12:06:12.30 ID:un2TMSqt
できる改善というやつも
結局コーディングの手間と実行速度やリソース消費とのバランスだよな。
一概に言えるもんじゃない。
958名前は開発中のものです。:2012/10/21(日) 12:15:36.14 ID:/1IdSLkb
あーよくいるよね、知識だけ溜めこんで実装できない奴
959名前は開発中のものです。:2012/10/21(日) 12:15:54.46 ID:uEOq6DXM
わかる
俺も中二の頃はハッカソンとか勉強会に参加するだけでカッコいいと思ってたよ
960名前は開発中のものです。:2012/10/21(日) 12:29:22.29 ID:PTum4Ngu
C++を知らないゲームプログラマ達
http://d.hatena.ne.jp/alwei/20111008/1318090538
961名前は開発中のものです。:2012/10/21(日) 13:13:31.85 ID:smvmEgiA
だれこいつ
962名前は開発中のものです。:2012/10/21(日) 14:29:14.20 ID:2HisPjSj
例えば「この処理はハードがやってくれるからそっちに投げよう」というのはアリだろう。
けど「最近のPC処理能力ならできるだろうからやる必要はない」は相手の状況次第だろう。
相手が対象としてるPCが「最近の」だとは限らないし、作るゲームの規模も不明。

少なくともプログラム技術について語るスレで言うようなことじゃない。
963名前は開発中のものです。:2012/10/21(日) 15:22:10.49 ID:8o2Qx0nE
950からの流れでプログラム技術とか言っちゃう人って……
964名前は開発中のものです。:2012/10/21(日) 15:36:19.33 ID:VBPhaVkU
手を抜くための理由以上のモノではないしな
965名前は開発中のものです。:2012/10/21(日) 18:48:08.69 ID:fR9B1EWl
>>925が救われたのかが気になる
スレチだろうけどな
966名前は開発中のものです。:2012/10/21(日) 19:16:33.45 ID:9rCgavl9
>>950は素直にC使った方がいいんじゃないだろうか
そんなところに拘っても可読性落ちるだけで
プレイヤーには誤差にも感じない程度の差しかでないでしょ
967956:2012/10/21(日) 21:43:51.38 ID:fWFEJkHx
>>959
かっこいいって何?
ハッカソンとかGame Jamにも足運んでるし
CEDECとかにも毎年参加してるし
いろいろな勉強会開いたりしてるよ?
バンナム社員の人と会話とかしてTwitterでも話してるし

ちなみに愛機はMBP(MacBook Pro)使ってるかな
UDKで作ったゲームは東方風のシューティング
あとはUnityとかもやってるしね

あとこう見えてゲームは全くやらないかな(笑)
「ゲーム好き、ゲームヲタク」っていうのはゲーム開発に不要って言われてるからね
普段全くゲームをしない、所詮人が作ったゲーム、自分で作ってやるほうがおもしろいかな
好きなゲームは地球防衛軍、ストリートファイター4
ネトゲは韓国の利益になるからやらないかな
968956:2012/10/21(日) 21:52:32.03 ID:fWFEJkHx
一応できる言語書くね

C,C#,C++,Javascrip(Node.js),Coffeescript,Haskell,Eralng,Go,Scala,Python,Objective-C,OCaml,Scheme,LISP
とか使えるね

あとUnityの本とか全部そろえてるし
今はアンドロイドアプリ作ってるかな
じゃんけんゲームみたいなやつ
969名前は開発中のものです。:2012/10/21(日) 21:58:35.68 ID:70260In1
ここってプロフェッショナルレベルの人たちが集っていたのか
970名前は開発中のものです。:2012/10/21(日) 22:02:03.60 ID:EmtRs25+
>>968
「使える」のレベルが低いことが用意に窺い知れる書き込みだな
971名前は開発中のものです。:2012/10/21(日) 22:07:31.63 ID:9rCgavl9
>>968
はじめて見るのがいくつかあるな
俺もgimpのスクリプト書くのにschemeちょっとやったけど
lisp系の言語ってどういう場面で必要になんの?
やっぱりスクリプト?
972名前は開発中のものです。:2012/10/21(日) 22:22:53.59 ID:koRq+7Oz
lispはemacsの設定で使う場面しか思いつかないな
973名前は開発中のものです。:2012/10/21(日) 22:42:29.46 ID:63szXM1n
>>966
可読性が落ちるのは間違いないが、効果は誤差どころじゃないな・・・。
俺が950で挙げた前者は、みんなもやってるよね。

今時のコンパイラなら後者もOKなら、そろそろ観念してVS2012Pro買うかなぁと思ってさ。
974名前は開発中のものです。:2012/10/21(日) 23:43:39.06 ID:un2TMSqt
プログラミングのスキルは手段であって目的じゃないからな。
自分の作りたいゲームが作れなければ全ては無意味だ。
975名前は開発中のものです。:2012/10/21(日) 23:51:38.77 ID:9rCgavl9
>>973
すいません、やってないっす…

関数細かく作るから同じメンバに何度もアクセスする箇所があんまりない
ループする箇所はSTLにまとめてイテレーターでやっちゃってるな…

もしかして、俺のコード超遅い?
976名前は開発中のものです。:2012/10/22(月) 00:56:42.06 ID:z1W7+ZfO
>>975
いやフレーム毎に収まれば正義ですし、可読性重視でいんでないですかね。

考えてみればExpressならすぐ使えたなと言うわけで、VS2012で試してみました。
うちの環境だと、基底から仮想関数で呼び出した場合に比べ、直で呼び出した場合は、
大体23%くらいの速度で行けるみたい。

最適化オプション色々変えてもあまり変わらず。
最新のコンパイラでも、やっぱり遅いみたいね・・・。

どうでもいいけど2012のUIかっこいいな。メトロというよりレトロだけど。
977名前は開発中のものです。:2012/10/22(月) 02:16:07.30 ID:bfhvnErC
クラスインスタンスのdelete時に、Pure virtual function callのエラーが出て悩まされた。
純粋仮想関数持ってる親クラスのデストラクタに入ってから、その仮想関数を呼んでいることが原因だった。
978名前は開発中のものです。:2012/10/22(月) 02:24:37.14 ID:GibO9cqH
deleteなんて自分で書くものじゃないし
デストラクタもなるべく書かないほうが良い
979名前は開発中のものです。:2012/10/22(月) 02:27:36.24 ID:F1nyTPCI
2012ってXPには未対応なんね
980名前は開発中のものです。:2012/10/22(月) 04:33:45.61 ID:bfhvnErC
>>978
そうなのか?
俺はdeleteもデストラクタも使い放題だぜ。
981名前は開発中のものです。:2012/10/22(月) 06:01:48.56 ID:87TUN/xt
>>978
気になる。理由は?
982名前は開発中のものです。:2012/10/22(月) 08:33:50.88 ID:19qPn/dP
boostの参照カウンタ使えばdelete書かなくてもなんとかなる…かも?
983名前は開発中のものです。:2012/10/22(月) 09:11:31.91 ID:wKQ4qRL6
>>982
移植の際にコンパイルエラー出たときの対応コストがboostは大きくつく。
ジャンルによってはカウンタ同期のコストが馬鹿にできないこともあるだろうし。

minmalなオレオレsmartptrを作っておくのが一番苦労しない気がする。
984名前は開発中のものです。:2012/10/22(月) 15:22:28.62 ID:buj+NpWL
#include <iostream>
#include <vector>
#include <string>


int main(){
std::vector<std::string> Strings;
std::vector<int> Vector;
Strings.push_back("1-2-3-4-5");
Strings.push_back("9-7-8");
Strings.push_back("6");

for(unsigned int i = 0; i<Strings.size(); i++){
//VectorにStringsの文字列を正規表現等で格納したい
}


return 0;
}

Stringsに格納した文字列を正規表現で数字だけ取り出してVectorに格納したいのですが
正規表現はどうかけばいいのでしょうか?
Vectorを[1,2,3,4,5,9,7,8,6]といった具合です。
よろしくお願いします。
985名前は開発中のものです。:2012/10/22(月) 18:04:08.05 ID:bfhvnErC
誰が調べてあげてたもれ
986名前は開発中のものです。:2012/10/22(月) 18:38:31.04 ID:yaXLi6zV
試してないけどboost::regex_grepに\\d+を突っ込むんじゃダメかな
987名前は開発中のものです。:2012/10/22(月) 19:30:48.30 ID:GibO9cqH
deleteを自分で書くな

std::unique_ptrを使え
ノーコストのスマートポインタだ
スコープから抜けるときに自動的にdeleterを実行してくれる

std::unique_ptrが使えない場面では仕方ないのでstd::shared_ptrを使え
多態が必要なときはstd::shared_ptrじゃないとダメだった気がする

デストラクタを書くのはスマートポインタで自動的に解放できないリソースを扱うクラスのときだけだ
例えば、OpenGLのテクスチャオブジェクトとかな
だがFILEオブジェクトなんかはdeleterにfcloseを指定すればスマートポインタで自動解放可能だ

メンバ変数の解放はメンバ変数のデストラクタに任せて自分で解放しようとするな
抱合した子オブジェクトは親が死んだときに勝手に死ぬし
newしたオブジェクトはスマートポインタに入れとけば勝手に死ぬ

自分でdeleteする必要がある場面なんてまずないだろう
988名前は開発中のものです。:2012/10/22(月) 20:05:28.33 ID:YuwwqXlf
>>984
strtokでググれ

989名前は開発中のものです。:2012/10/22(月) 20:11:20.29 ID:bfhvnErC
でもさ、
あるクラスをアプリ実行期間中、存続させつつづけて、
ゲーム・ステージの切り替わりのタイミングで、
それが持つ配列型メンバをリサイズする場合なんかには
deleteを使わざるを得ないんじゃないか?
こういうケースは頻繁にあるんだが。
全ステージ配列のサイズは固定とか縛り持たせるわけでもあるまい。
990名前は開発中のものです。:2012/10/22(月) 20:20:24.89 ID:GibO9cqH
スマートポインタのvectorを使いなさい

あと、いまどき生配列はないな
固定長配列ならstd::array、可変長ならstd::vectorを使いなさい
Visual C++でデバッグモードでコンパイルすれば、範囲外アクセスしたときに例外投げてくれるはずだ
991名前は開発中のものです。:2012/10/22(月) 20:56:00.85 ID:bfhvnErC
相互に関連していて、deleteでトリガーされるデストラクタの実行順を気にしなきゃいけない時もあるよ。
またブラックボックスな配列ってのは、リサイズ後のメモリアクセス効率性への影響が不安じゃない。
992名前は開発中のものです。:2012/10/22(月) 21:12:58.91 ID:yaXLi6zV
それなりに寿命が短くて、確実に管理できるなら
new/deleteの方が楽よね
993名前は開発中のものです。:2012/10/22(月) 21:21:39.03 ID:oFyoxOqU
>>991 例えばこういう循環参照を持つやつだよね。
struct B;
struct A{ B* b;};
struct B{ A* a;};

こういうときは、生存期間の管理用に一つ使い捨てのクラスを用意して、
struct C{
A a; B b;
C():a(),b(){ a.b = &b; b.a = &a; }; // 循環してるポインタをセット
~C(){} // デストラクタで a と b が 同時に破棄されるようにする。
}; // struct C自体はスタックか std::unique_ptr<C> にまかす。

デストラクタが走るときはコンストラクタと逆の順番だから、循環参照してて
デストラクタの実行順番を気にしないといけないような状態の場合はそれ自体を
struct Cのデストラクタに封じ込めるのはどうだろう。
994名前は開発中のものです。:2012/10/22(月) 23:30:02.44 ID:GibO9cqH
オブジェクトへの参照を保持していることとオブジェクトを所有していることは別だと思うんだ

例えば木構造でなるべくメモリを局所化したい場合だとこういう感じになると思う

class Node { Node* firstChild; Node* sibling; Node* parent; };
std::vector<Node> vNode;

この場合、Nodeは他のNodeへの参照を持ってるけど、所有しているわけじゃない
所有しているのはvNodeを持つオブジェクトだ

あれこれって>993と同じことじゃね
995名前は開発中のものです。:2012/10/23(火) 00:04:00.65 ID:jziPb4Rf
weak_ptrを使うのだてめえら
996名前は開発中のものです。:2012/10/23(火) 01:15:06.83 ID:lf4QviES
class Task {
Task* m_pNext;
Task* m_pPrev;
bool m_Head; //デク先頭フラッグ
bool m_ToBeDeleted; //削除フラッグ
virtual void Exec()=0; //
};

class Filament : public Task { //m_EntryPointにTaskクラスをつなげる。
Task m_EntryPoint; //デク先頭
~Filament() { //親delete時に、連鎖的にdeleteする子の削除フラッグを立てる。
Task* child = m_EntryPoint.m_pNext;
while (!child->m_Head) {
child->m_ToBeDeleted=true;
child = child->m_pNext;
}
};
};

class Fiber : public Filament {...}; //m_EntryPointにFilamentクラスをつなげる。

class Synthesis { Fiber* fibers_active[4]; }; //1次元配列。参照のみ。

class Repository { //シーンの切り替わりで動的に生成・破棄し、インスタンスを必要分だけ保持する。
Task* tasks[1024]; //1次元配列。インスタンスを注入。
Filament* filaments[256]; //1次元配列。インスタンスを注入。
Fiber* fibers[64]; //1次元配列。インスタンスを注入。
};
997名前は開発中のものです。:2012/10/23(火) 01:16:10.47 ID:lf4QviES
↑極端な例だが、
Repositoryクラス内で、シーン中、必要なインスタンスしか確保しないという条件の場合、
 まずSynthesisクラス内の要らないfibers_active要素だけ削除フラッグを立てて、
 次にRepositoryクラス内のフラッグが立ったfibers要素をdeleteして、
 次にRepositoryクラス内のフラッグが立ったfilaments要素をdeleteして、
 最後にRepositoryクラス内のフラッグが立ったtasks要素をdeleteする、
っていうのが効率的なんじゃないか?

要は、麗しのタスクシステムなんだが(笑)
998名前は開発中のものです。:2012/10/23(火) 02:02:33.12 ID:7yJptL6x
>>992
「確実に管理しなければならない」ポイントを減らすためにライブラリ使うんでしょ
999名前は開発中のものです。:2012/10/23(火) 10:35:59.82 ID:8kXxMAJY
お疲れ
1000名前は開発中のものです。:2012/10/23(火) 10:41:49.45 ID:5T7QFGuf
そしてさようなら(#゚Д゚)/~~
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。