合計 昨日 今日

アバター
山崎
 
記事: 2
登録日時: 2010年10月18日(月) 08:59
お住まい: 北関東
日記: 日記を見る (6)
日記
- 11月 2010
プログラマ恐怖症 (11)
   2010年11月09日(火) 10:05
技発動中のキャラの動きについて (2)
   2010年11月02日(火) 00:24

+ 10月 2010
フォロー
カテゴリー
カテゴリに指定された日記はありません
フィード
次へ

プログラマ恐怖症

パーマリンクby 山崎 on 2010年11月09日(火) 10:05

 私はプログラマがちょっと怖い。

 我らがC言語何でも質問掲示板ができた理由のひとつのように、巷のプログラミングに関わる掲示板というのはなかなか質問しづらい雰囲気がある。
 質問者をののしったり、回答者同士で言い合いになっていたり、汚い言葉や口調が横行していたり――。「マニュアル読め」という心無い一言で、何も知らない初心者を追い返してしまう例を何度も目にしたように思う。

 そういうモノを見てくると、「世のプログラマは、みんなこんな気質なのだろうか?」と不安になってくる。自身にも右も左もわからない初心者だった時代があったことを忘れ、自分の中のモノサシで他人や物事を判断し、他を非難することに抵抗を無くし、まるで自分の技術や知識がさも当然であるかのように振る舞う。
 将来プログラマになるであろう自分が、そんな人間のうごめく世界で耐えられるのかどうか、そして自分もそんな人間になってしまうのだろうかと、割と本気で最近まで不安に思っていた。

 私にとって「職人気質」という言葉は決していいものではなく、高い技術やこだわりを持ち合わせているものの「十分な技術や知識の無い人を邪険に扱う性格」という意味でとらえている。

 もちろん、世の中のプログラマの一人残らず全てが私の懸念するような性格だとは思っていない。ネットの掲示板に書き込みをする一部の人間だけがそんな性格なだけであって、世の大半は赤く熱い血の通った普通の人間であると思いたい。

コメント数: 11 閲覧数: 24537

技発動中のキャラの動きについて

パーマリンクby 山崎 on 2010年11月02日(火) 00:24

 現在、2Dのアクションゲームを制作中だ。アクションと格闘ゲームを合わせたような感じのもので、ネット対戦を主な遊び方にしようと考えている。

 しばらく前までも同じようなゲームを作っていたのだが、就職活動の本格化や研究活動が忙しくなってきたことによって手がつけられないでいた。最近ようやく一段落してきたので、またあのゲームを作り始めたのである。

 さてどこから再開しようかと昔の自分のコードを見ていたが、どうもデータ構造が気に入らない。当たり判定だの何だので1フレームの間に何度もアクセスが行われるであろうオブジェクトのリストが、STLのlistで実装されている。データ構造がスッキリして扱いやすいのだが、やはり自分で作った連結リストの方が早くアクセスできる。他にも気に入らない点があり、0から作り直すことにした。

 現在、キャラクターが繰り出す技に関する部分を制作している。ここで今悩んでいるのが、技を出している最中のキャラクターの動きである。

 格闘ゲームでは、技のコマンドが成功すると、技を出し終わるまでキャラクターを自由に動かすことができない。加えて、ジャンプやダッシュなど、技の発動にキャラクターの移動が伴うものもある。言うまでも無いと思うが、昇竜拳や竜巻旋風脚などのような感じである(漢字が合ってるかどうかは不明。ストリートファイターはやったことが無い)。
 技の発動中のキャラの硬直や移動などを、どうやって制御するかというのに今非常に悩んでいる。
 技の発動中に相手の攻撃を受けた場合など、硬直や移動が解除されることも考慮しなければいけない。

 こういった問題を考えるとき、いつも「プロの現場ではどうしているのだろう。」と思う。将棋や麻雀のように、「こういうときはこうする」という定石が、きっとプロの世界でもあることだと思う。もちろん「そこは担当したプログラマ次第で、定石は特に無い」という問題も多々あることだろうが、やはり自分なりに組むと「常識外れのことをしていないだろうか」と少し心配になることもある。

*「山崎のC++日記:アロケータ練習」の続きはまた気が向いたら書くことに。

コメント数: 2 閲覧数: 22716

入社前の不安

パーマリンクby 山崎 on 2010年10月25日(月) 10:17

 最近、私は毎日ある不安に駆られている。

 幼いころからの夢が叶い、私は来年からプロのゲームクリエイターになることが決定した。
 就活中は、私は過剰と言えるほど自信に満ちていたと思う。私はずっとプログラミングを独学してきた。いろんな言語を習得し、いろんな作品を作り、いろんな経験を積んだ。学校の勉強もおろそかにしなかったし、生活態度も悪くないはずだ。私のやってきたことはきっと無駄にはならないはず、努力は報われるためにあるのだ。
 ゲーム業界に入れたら、どんなことでもやってやる。つらい仕事も乗り越えて見せるし、積極的に仕事に関わり、いろんな技術を吸収してやる。
 ――私はそう自分を励まし続け、就活に臨んできた。

 しかしいざ内定が決まると、私に急に不安が襲いかかってきたのだ。
 本当に私の実力なんかが通じるのだろうか?入社までに何をすればいいのだろう。他の同期のプログラマたちに追い抜かれ、使い物にならなくなるのではないか?私の業界に対する知識は不足しているのだろうか?
 学生のプログラムの技術と、プロの現場のプログラムは天と地ほどの差があると、就活中何度も耳にしてきた。私がいつも構想していたデータ構造は、プロの現場では笑われてしまうのだろうか。私が全く知らないような、別の言語じゃないかと思うような、そのような技術を現場では使っているのだろか。
 私は入社までに何を勉強しておくべきなのだろう。3Dを使ったプログラムだろうか、音声ファイルを編集できるプログラムだろうか。それともパソコンを自作でもしてハードウェアの知識を身につけるべきなのか、OSを自作するべきなのか。はたまた、BoostやWINAPIなどのライブラリの使用経験を深めるべきなのか。これまでのようにゲームプログラミングの経験を積めばいいのか。
 ――不安は次から次から次へと湧いてくる。

 周りの友人たちは、大企業と呼べるような、誰でも知っている会社に内定が決まっている。初任給も私よりはるかにいい。私は大企業を選ぶ道もあったものの、給料や知名度は完全に2の次にして、ゲーム業界を選んだ。
 この選択は間違っていたのだろうか?親にも迷惑をかける道だったのだろうか。

 今は研究で忙しい毎日である。以前のように、ゲーム作りに心おきなく没頭できる時間はあまり無い。しかしあまり無いとは言え、完全に無いわけではない。私はその時間がもったいなくて仕方がないのだ。そのわずかな時間を、自分を成長させるための時間に充てたい。
 しかし現状は、そのわずかな空き時間を私は何もせずに過ごしている。そして、自分はこんな時間の使い方をしていいのだろうかと不安になる。結局、不安になっているのは自分のせいなのである。

 もはや、後は入社して働くまで何もわからないということは自分でもわかっている。しかしそれでもやはり、不安というものを拭い切れない性分であるようだ。

コメント数: 8 閲覧数: 24040

山崎のC++日記:アロケータ練習2

パーマリンクby 山崎 on 2010年10月20日(水) 09:54

普段から「だ・である」調で文章を書いているので、「です・ます」調で文章を書くと何を言いたい文なのか分からなくなってしまうという弊害に昨日気付かされた。少し淡々となってしまうとは思うが、今回から「だ・である」調で文章を書かせて頂こうと思う。

前回のアロケータの日記に、placement newについて詳しくコメント頂いたISLeさんにこの場を借りて再度お礼申し上げたいと思う。

さて、今回も前回の日記に引き続き、素人のアロケータ奮闘記を書きたい。前回は「なぜアロケータに興味を持ったか」を簡単に書いたので、今回は本当にアロケータが必要なのか、その疑問を書きたいと思う。

私はゲーム中に出現するキャラクター、敵、弾などのオブジェクトに共通するメンバやメソッドを基底クラスObjectにまとめ、必要に応じて「プレイヤーキャラクタークラス」や「弾クラス」としてObjectクラスを継承させている。Objectクラス型のリスト構造に主人公や敵弾などのオブジェクトを全て挿入し、先頭から動きの制御や描画を行うという手法をとっている。この「全てのオブジェクトを一括管理するクラス」に、私はいつもObjectManagerというクラス名をつけている。

敵キャラが敵弾を撃つときは、newによって生成した敵弾をObjectManagerに挿入し、処理や描画、メモリの解放も全てObjectManagerに任せきりにしている。敵弾は役目を終えれば「自分を解放してもいいよ」というフラグが立ち、それに気づいたObjectManagerはその敵弾を解放する、という仕組みである。この方式をとれば敵弾を放った敵キャラと敵弾の依存性を薄くすることができ、好きなだけ敵弾を撃っては後のメモリ管理をObjectManagerに押し付けることができる。敵弾がプレイヤーに向かって飛んで行っている最中に、その弾を撃ちだした敵キャラがObjectManagerから削除されても問題無いのが大きな利点だ。もちろん、通常のnewで大量の敵弾を生成していては、弾を打ち出すたびに処理落ちが発生する。

この処理落ちをどうにかするため、私はplacement newにを使ったアロケータに非常に興味があった。とりあえずステージ移動などプレイヤーの操作が一瞬止まる隙に十分な量の敵弾用のメモリを確保しておき、敵弾用のメモリはそのメモリプールから取ってくることによってnewとdeleteの高速化を図る。

しかしよく考えてみると、「それをplacement newで実装する必要が本当にあるのか?」という疑問が湧いてきた。

敵弾は敵キャラのメンバとして十分なサイズの配列として用意しておき、必要に応じてObjectManagerに敵弾のポインタを渡し、役目が終わった敵弾は解放するのではなくObjectManagerから外すだけにする。そうすれば、いちいちアロケータを実装する必要性は薄くなるのではないか、こんな疑問が湧いてきたのである。

ただそれだけでは、先ほど利点として述べた「弾が飛んでいる最中に、その弾をメンバとして持つ敵キャラが撃破されてObjectManagerから削除されたとき、一緒に削除された弾にObjectManagerがアクセスしてしまいエラーを起こす」という問題が残る。すぐには解決策が浮かんでこないが、何とかそれさえ直せればアロケータを作る必要性が殆どなくなるように思えてきたのである。

今は本業の研究が忙しく、アロケータを試しに実装してみる余裕が無いので疑問やアイデアだけがモヤモヤと頭の中を行ったり来たりしている。

コメント数: 2 閲覧数: 22747

山崎のC++日記:アロケータ練習1

パーマリンクby 山崎 on 2010年10月18日(月) 09:57

ということで今回から、私、駆け出しゲームプログラマ山崎のプログラミング奮闘記をこちらの日記に書かせて頂こうと考えております。

まだプロではないので至らない点ばかりだと思いますが、気が向きましたらコードの指摘やアドバイス、講評を頂ければ、と思います。

さて、初回はアロケータについて喋りたいと思います。なお、参考としているサイトはこちら。http://www.geocities.jp/ky_webid/cpp/language/036.html

まず私は、「アロケータとは、placement newとメモリプールを使った、高速なnewとdelete実行を実現するメモリ管理システム」という風にとらえています(なお、ここではC++による実装のみを想定しており、他の言語で可能かどうか、そもそもこういった概念があるかどうかについては全く考慮しておりません)。メモリプールとは、placement new を実行する前に予め確保しておいたメモリ領域、だと思っています。

以前からゲーム作りの際、newとdeleteにかかる処理時間によって処理落ちが発生する、という問題に悩んでいました。敵の撃ち出すたくさんの弾を何も考えずにnewによって作り出していたところ、敵が弾を撃つたびに処理落ちが発生してしまうのです。しかしplacement new の存在だけは知っていたため、いつかそれを使ったメモリ管理システムを実装してみたい、と思っていました。

「処理に時間がかかることは、プレイヤーの操作中にはなるべく行わず、フィールド遷移時やメニュー画面の開閉時など、プレイヤーの手が一瞬止まるタイミングでまとめて行うべきではないか」というのが今のところの私の考えです。処理に時間がかかるnewやdeleteは、プレイヤーの操作中には極力行わないようにする、という方針を取っています。

ということで、今回はアロケータとは何ぞやということと、なぜアロケータを使いたいと思ったのかについて触れました。次回はどんなシステムにするか、その構想を書きたいと思います。
最後に編集したユーザー 山崎 [ 2010年10月18日(月) 09:59 ], 累計 1 回

コメント数: 5 閲覧数: 23438

オンラインデータ

登録ユーザー: なし