ということで今回から、私、駆け出しゲームプログラマ山崎のプログラミング奮闘記をこちらの日記に書かせて頂こうと考えております。
まだプロではないので至らない点ばかりだと思いますが、気が向きましたらコードの指摘やアドバイス、講評を頂ければ、と思います。
さて、初回はアロケータについて喋りたいと思います。なお、参考としているサイトはこちら。http://www.geocities.jp/ky_webid/cpp/language/036.html
まず私は、「アロケータとは、placement newとメモリプールを使った、高速なnewとdelete実行を実現するメモリ管理システム」という風にとらえています(なお、ここではC++による実装のみを想定しており、他の言語で可能かどうか、そもそもこういった概念があるかどうかについては全く考慮しておりません)。メモリプールとは、placement new を実行する前に予め確保しておいたメモリ領域、だと思っています。
以前からゲーム作りの際、newとdeleteにかかる処理時間によって処理落ちが発生する、という問題に悩んでいました。敵の撃ち出すたくさんの弾を何も考えずにnewによって作り出していたところ、敵が弾を撃つたびに処理落ちが発生してしまうのです。しかしplacement new の存在だけは知っていたため、いつかそれを使ったメモリ管理システムを実装してみたい、と思っていました。
「処理に時間がかかることは、プレイヤーの操作中にはなるべく行わず、フィールド遷移時やメニュー画面の開閉時など、プレイヤーの手が一瞬止まるタイミングでまとめて行うべきではないか」というのが今のところの私の考えです。処理に時間がかかるnewやdeleteは、プレイヤーの操作中には極力行わないようにする、という方針を取っています。
ということで、今回はアロケータとは何ぞやということと、なぜアロケータを使いたいと思ったのかについて触れました。次回はどんなシステムにするか、その構想を書きたいと思います。
山崎のC++日記:アロケータ練習1
山崎のC++日記:アロケータ練習1
最後に編集したユーザー 山崎 on 2010年10月18日(月) 09:59 [ 編集 1 回目 ]
Re: 山崎のC++日記:アロケータ練習1
リンク先の二つめのソースコードですが
delete( p, global_area );
と書けばデストラクタが呼ばれたあとオーバーライドしたoperator deleteが呼び出されます。
いちいち別々に呼び出す必要はないですし、
delete( p );
をオーバーライドしてその中で独自アロケータを呼び出すようにしておけば独自アロケータを使う/使わないをクラス定義の変更だけで切り替えることができます。
いつでも切り替えられるようにしておかないと独自アロケータにバグがあったときそれ以外に何もできなくなってしまいます。
delete( p, global_area );
と書けばデストラクタが呼ばれたあとオーバーライドしたoperator deleteが呼び出されます。
いちいち別々に呼び出す必要はないですし、
delete( p );
をオーバーライドしてその中で独自アロケータを呼び出すようにしておけば独自アロケータを使う/使わないをクラス定義の変更だけで切り替えることができます。
いつでも切り替えられるようにしておかないと独自アロケータにバグがあったときそれ以外に何もできなくなってしまいます。
Re: 山崎のC++日記:アロケータ練習1
プロフィールにBREWの経験ありと書かれてますね。
最初にグローバルなnewとdeleteのオーバーライド関数を書いたと思うのですけど、そこでMALLOCやFREEを直接使わずに独自のアロケータを仕込むことができるというわけです。
BREWでは基本的に静的アドレスを使えないのでplacement new/placement deleteで独自アロケータのインスタンスを渡す感じになります。
placement newで渡すことができるアドレスはこれから割り当てるメモリでなくても何でもOKなのです。
最初にグローバルなnewとdeleteのオーバーライド関数を書いたと思うのですけど、そこでMALLOCやFREEを直接使わずに独自のアロケータを仕込むことができるというわけです。
BREWでは基本的に静的アドレスを使えないのでplacement new/placement deleteで独自アロケータのインスタンスを渡す感じになります。
placement newで渡すことができるアドレスはこれから割り当てるメモリでなくても何でもOKなのです。
Re: 山崎のC++日記:アロケータ練習1
初めまして^^
以前に掲示板にこのスレが立っていたときに密かに興味を持って見てました。
そこで、placement newの存在を初めて知りました。
今後の日記を楽しみにしています^^
以前に掲示板にこのスレが立っていたときに密かに興味を持って見てました。
そこで、placement newの存在を初めて知りました。
今後の日記を楽しみにしています^^
Re: 山崎のC++日記:アロケータ練習1
ISLeさん
コメントありがとうございますっ!以前もこのplacement newの記事に返信して頂きましたね、またしても私などの記事にコメント頂き、感謝するばかりです!そして参考になるお話、本当にありがとうございます。まだまだ修行中の身ですので、非常に役に立ちます。実はBREWはただ触ったことがある程度で「経験あり」とはちょっと言いがたいレベルなのですが、自己紹介の肥やしに書かせていただいております。よろしければまた日記にいらしてください~!
Cielさん
私などの日記にようこそいらっしゃいましたっ!私もCielさんのお名前は掲示板で拝見しております、お声をかけていただいて嬉しいですよ!また是非お越しくださいね。
コメントありがとうございますっ!以前もこのplacement newの記事に返信して頂きましたね、またしても私などの記事にコメント頂き、感謝するばかりです!そして参考になるお話、本当にありがとうございます。まだまだ修行中の身ですので、非常に役に立ちます。実はBREWはただ触ったことがある程度で「経験あり」とはちょっと言いがたいレベルなのですが、自己紹介の肥やしに書かせていただいております。よろしければまた日記にいらしてください~!
Cielさん
私などの日記にようこそいらっしゃいましたっ!私もCielさんのお名前は掲示板で拝見しております、お声をかけていただいて嬉しいですよ!また是非お越しくださいね。
Re: 山崎のC++日記:アロケータ練習1
placement newはnew/deleteのオーバーライド実装のひとつなので、placement newとnew/deleteのオーバーライドは区別して考えないといけなかったです。
BREWのケータイアプリのメモリは非常に限られているしガベージコレクションもなく自己管理なので、できるだけ一気にメモリ確保して汎用的に使い回したり、new/deleteをオーバーライドして配列から空いた要素を割り当てるようにしたり、といった工夫が盛りだくさんなのです。
BREWのケータイアプリのメモリは非常に限られているしガベージコレクションもなく自己管理なので、できるだけ一気にメモリ確保して汎用的に使い回したり、new/deleteをオーバーライドして配列から空いた要素を割り当てるようにしたり、といった工夫が盛りだくさんなのです。