C言語コンパイラの動作

ソースコードがどんな処理をされて実行ファイルになるのか書いてあるサイトが少ないので、ちょろっと書いておきます。

1 プリプロセス
#define構文や#include構文等、行頭に#のついた行を処理します。たとえば、#include "poe.h"と書いてあったら…?この段階でその行がpoe.hの内容に置換されます。
2 コンパイル
C言語のソースコードをオブジェクトファイル(機械語ファイル)に変換します。注意すべきことは、この段階では未だ実行ファイルは生成されません。ソースコード一つ一つに対応するオブジェクトファイルが生成されます。
3 リンク
オブジェクトファイルをつなぎ合わせて実行ファイルを作ります。

また、少し定義宣言を区別しておく必要があります。
定義とは関数の処理内容や変数の実体を使えるようにすることです。宣言とは関数や変数の名前や型を決める作業です。
よく変数を宣言するといいますが、変数は宣言すると同時に定義も行われることを覚えておいてください。

さて、ソースコードではなくヘッダファイルに関数の定義を書いてしまって実行ファイルの生成に失敗した経験はありませんか?
ヘッダファイルは大抵の場合複数のソースコードからインクルードされます。上記の場合だと複数のソースコードに関数の定義が存在することになります。ところが、コンパイラは普通にコンパイル作業を終えてしまいます。なぜなら、コンパイラは一度にひとつのソースコードしか見ていないからです。定義がダブっていようが足りなかろうが、自分の見ているソースコード以外はお構いなしです。兎に角機械語を出力するだけ出力して終了します。そして、生成されたオブジェクトファイルの中には同名の実体が複数存在することになってしまいます。
同じ名前の実体が複数あると困るのはリンカです。どれを使って良いのかわかりませんからね。どれが正しくてどちらが間違っているのか、もしかすると同じ内容かもしれない。しかし、リンカはエラーを吐きます。リンカの役目はあくまでオブジェクトファイルをつなぎ合わせることで、どれが正しい実体なのか判断することではないからです。

これに関連して、externの意義も説明します。
といっても、前述の関数と状況は似ています。要するにexternを付けることで変数の宣言と同時に定義が行われないようにしているだけです。

DXPを使った際の速度向上などについて

DXPは多くの場合、最高のパフォーマンスを発揮できるように製作されています。ですが、ライブラリ使用者がいくつか注意することによってさらにパフォーマンスを高めることができるでしょう。

1 描画する画像を小さくする。
描画範囲が同じでも拡大処理をして描画することで速度向上が可能です。おおきなサイズの画像も読み込めますが、なるべく無駄の無いように注意が必要です。
2 できるだけ同じグラフィックスハンドルの描画が連続するようにする。
弾幕STGなどは特に注意してください。GPUの内部で大量の切り替え処理が発生するとかなり遅くなってしまいます。
3 自分のソースコードを見直す。
PSPはGPUに限らず、CPUも非力です。特に浮動小数点関係の処理は極力減らしましょう。計算式の変形によって高速化できる場合もあります。整数演算だけでも工夫次第ではクオリティーの高い作品が作れます!固定小数点数などをつかうと良いでしょう。