新刊ピックアップ

ゲーム開発で必要となる プロファイリングの基本

この記事を読むのに必要な時間:およそ 3 分

最適化とパフォーマンス計測

最適化とは,プログラムの処理速度や消費メモリなどを改善し,プログラムのパフォーマンスを向上させることをいいます。ゲーム開発においてはパフォーマンスが重要ですので,最適化は必須といえるでしょう。

ソフトウェア開発においては、最適化を行う前にプロファイリングなどのパフォーマンス計測を行います。これはプログラムの実行時間の大半は、ごく一部の処理によって消費されることが多く、全体の実行時間の大半を占める一部分を最適化した方が効率的であるためです。例えば,実行時間の2割にあたる部分を最適化し,その部分の実行時間を半分にできたとしても,全体では高々10%程度の改善です。しかし,実行時間の8割にあたる部分を最適化し,その部分の実行時間を半分にできたとすると,全体では40%の改善になります。

事前にパフォーマンス計測を行わずに最適化をしようとすると,もともとあまり処理時間がかかっていなかった部分の最適化を行ってしまい,結果全体では速くならなかった,ということもよくおこります。

なお,一口に最適化といっても,GPUなのかCPUなのか,あるいはメモリ消費量なのか処理速度なのか,と多数の分野があります。本稿ではCPUの実行速度に関する最適化のためのプロファイリングについて説明します。

プロファイリングとは

プロファイリングとは,実際にプログラムを実行しながら統計情報を取り,プログラムの実行において,どの部分に時間がかかっているのか調べることをいいます。

またプロファイリングを行うツールをプロファイラといいます。インテル社,マイクロソフト社などの製品がよく使われますが,これらの製品は高価なこともあり,個人の開発でプロファイラを使うのは簡単ではありませんでした。しかし,近年登場したVisual Studio Communityは条件があるものの無料で利用できます。Professionalなどの製品版とほぼ同等な機能があり,これにプロファイラも含まれていますので,個人開発でもプロファイラを使う機会が増えてきました。

プロファイリングのための準備

本稿では,Visual Studio Communityを使ったプロファイリングを紹介します。以下のURLからVisual Studio Communityのインストーラをダウンロードし,インストールを行ってください。

次にプロファイリング対象のサンプルプログラムを準備します。

  1. Visual Studioの[ファイル]メニューから[新規作成⁠⁠→⁠プロジェクト]を選択し,⁠新しいプロジェクト]ダイアログボックスを開きます。
  2. ダイアログボックス左のツリーから[インストール済⁠⁠→⁠Visual C++⁠⁠,中央のリストから[Windowsコンソールアプリケーション]を選択し,⁠OK]をクリックします。
  3. 作成したプロジェクトのConsoleApplication1.cppを開き,リスト1で置き換えます。
  4. [構成マネージャー][アクティブソリューション構成][Release]にします。
  5. [ビルド]メニューから[ソリューションのビルド]を選択し,正常にビルドできることを確認します。

リスト1 プロファイリングするサンプルプログラム

#include "stdafx.h"

  #pragma optimize( "", off )
  
  struct LargeStruct {
    int a;
    int b;
  };
  LargeStruct aosSrc[10000];
  LargeStruct aosDst[10000];
  
  void copy1() {
    for (int i = 0; i < 10000; ++i) {
      aosDst[i].a = aosSrc[i].a;
    }
    for (int i = 0; i < 10000; ++i) {
      aosDst[i].b = aosSrc[i].b;
    }
  }
  
  void copy2() {
    for (int i = 0; i < 10000; ++i) {
      aosDst[i].a = aosSrc[i].a;
      aosDst[i].b = aosSrc[i].b;
    }
  }
  
  void func1() {
    for (int i = 0; i < 100; ++i) {
      copy1();
      copy2();
    }
  }
  
  int main() {
    for (int i = 0; i < 100; ++i) {
      func1();
      copy1();
      copy2();
    }
    return 0;
  }
  
  #pragma optimize( "", off )

著者プロフィール

長谷川勇はせがわいさむ)

株式会社スクウェア・エニックスにて,Luminous Studio,「FINAL FANTASY XV」の開発に参加し,VFX・UIを担当。専門は言語処理系。学会活動にも参加している。

Twitter:@IsamuHasegawa