ゲーム開発時の処理負荷コストの考え方

コラム

コストというと、お金の話がパッとで思い浮かぶかもしれませんが、ゲーム開発時には色々なコストが発生し、基本的にはコストを抑えるように開発を行っていきます。
ざっと思い浮かぶものだけでも、

・開発費、人件費(お金)
・開発期間、開発工数(時間)
・実行時の処理負荷、メモリ使用量、アプリ容量
・実装の難易度

などで、個々にコストという言葉で表すことにより、聞き手はどのコストのことを言っているのかを聞き分ける必要があります。
もちろん複数の意味が絡み合っている場合もあります。

今回は、処理負荷コストについてのお話しです。
あるプログラムを書いたときにレビューが来ました。

【書いたプログラム】

for (var i = 0; i < 100; i++)
{
    if (少し負荷がかかる条件判断)
    {
        (実際の処理)
    }
}
【提案があったプログラム】

for (var i = 0; i < 100; i++)
{
    if (負荷の軽い大まかな条件判断)
    {
        if (少し負荷がかかる条件判断)
        {
            (実際の処理)
        }
    }
}

要は、前段階に負荷の軽い判断を入れて、全体のコストを下げようという提案です。
実際にコリジョンチェックなど、実際の衝突判定が重い場合は、事前に処理負荷の軽い大まかなチェックを行い、合格した場合のみ実際のチェックを行うといった実装が行われていたりします。

しかし処理負荷コストを考える上で重要なのは、フレームドロップ(処理落ち)するかどうかです。
フレームドロップとは、ゲームが1/60秒で動いている場合に、1フレームの処理が1/60秒に収まっているかどうかで、収まらない場合は処理落ちします。

処理落ちさせないためには、全体の負荷が上がるときに上がり幅を抑えることが大事になってきます。

提案のプログラムでは、条件を通過する場合、従来よりも処理負荷が少し上がってしまいます。

処理負荷コストを考える場合も、実際にお金に置き換えて考えると分かりやすいです。

負荷の軽い大まかな条件判断:10円
少し負荷がかかる条件判断:30円
実際の処理:70円

10,000円を超えるとフレームドロップする

このような場合、元のプログラムだと全て条件通過する場合、(30 + 70) * 100 = 10000 でギリギリセーフとなります。
提案のプログラムの場合、(10 + 30 + 70) * 100 = 11000 でフレームドロップします。

半分条件通過する場合は、
元のプログラム 30 * 50 + (30 + 70) * 50 = 6500
提案のプログラム 10 * 50 + (10 + 30 + 70) * 50 = 6000
で、500円お得になります。
つまり条件を通過しなければしないほどお得になります。

しかし先ほど述べたとおり、処理落ちさせないためには、全体の負荷が上がるときに上がり幅を抑えることが大事になってきますので、高負荷時においてこの負荷軽減は効果がありません。
ただしほとんどのケースで条件を通過せず、条件を通過する数が多いケースがほぼ発生しない場合には、全体的なコストを抑える方が効果的な場合もあります。
処理負荷コストを考える場合には、ボトルネックになっている部分のコストをどのように軽減するかを意識する必要があります。

また別のコストとして、提案のあったプログラムが問題ないかどうかをチェックする開発コストも発生します。
特に既にテストが済んでるような場合は、再テストが必要になるため、工数が膨らみます。

このあたりのコストまで考えてバランスが取れるようになってくると、リードプログラマーとしての立ち回りが出来るようになってくるんじゃないかと思います。
逆に、プログラムの美しさや自己満足で目先の改善をするような人は、コストバランスの悪い人といえるかもしれません。
そういうのは自分の趣味のプログラミングで行ってもらえれば…と思わなくもないです。

コメント

タイトルとURLをコピーしました