なんか考査期間になってから日記の投稿速度が加速度的に早くなってきている気がします(勉強しろ
と、今回私が勉強そっちのけでやったのは大量のオブジェクトを描画するというモノです。折角一昨日にモジュール化という便利な物
を習得したので、それを使って同じオブジェクトを大量に描画してみよう、ということでよくベンチマークであるような図形を大量に描画させてみました。
で、
最初はオブジェクトの要素数がオブジェクトの生成数を下回り、フルスクリーンモードで起動した時、画面が鮮やかなピンク色になって電源が落ちました。
なんとまぁ自分で作るプログラムはアブナイものかと、その辺をちゃんと考慮して組み直し、適当に重力を付加させて、ぴょんぴょん跳ねるような動作をする
図形を1つのモジュールとして作りました。DXライブラリを使用していますので、図形描画系関数は
DrawLine,DrawPixel,DrawBox,DrawCircle,
とこの4つを基本として描画させてみました。詳細な個数を見たかったのでDrawFormatStringを用いてカウンタの
描画を行おうとしたのですが、何故かその関数を使用すると1500個ほど描画したところでいきなりCPUがフルロードされるようになって使い物にならなかったので10000個毎に
だけ、描画させるようにしました。故に計測値は目分量です。マルチスレッドには対応していないので、4Coreな私のCPUの場合25% +-5%ぐらいしか使用してくれなかったようです。
計測条件:画面サイズはVGA(640x480)にし、フレームレートはココのサイト様の特定のFPSで動作させる、のC言語Verを用いFPSの測定、制御を行いました。
初期FPSは60(=リフレッシュレート)にし、FPSが30を切った時点での描画個数をDrawCircleを除き100000単位での表示を行い、途中だった時は目分量で1/10まで計測する。
DrawCircleに関しては超遅かったので10000単位での表示を行い、それ以後は他のモノと同様に計測しました。
環境
OS:Windows 8.1
CPU:i5-4670 3.4GHz
Mem:16G
GPU:GTX760 OC(最高1115MHz)
コンパイラ:VC++ 2013 for Desktop
ライブラリ:DxLibrary
そして、
DrawPixel:300000個
DrawBox:300000個
DrawLine:340000個
DrawCircle:28000個
という感じの結果になりました。DrawCircleは1/10ほどの速度しかでていません。
加えてこれらのテストでGPUへの負荷は殆ど認められませんでした(2-5%程度)(ただしDrawFormatStringを描画する瞬間だけ95%に跳ね上がる)
ただ描画した個数に比例してCPUへの負荷がかかっているように見えました。
円の描画遅すぎだろ...と言った感じでした。終わり。
と、まったぁ! 画像の描画がまだだぞ! というわけで適当に画像(32x32のwindows標準bmp画像)を用意し、それを用いて描画させてみました
DrawGraphを用いました
DrawGraph:310000個
はい、もうGPUのベンチではありません、ただのCPUベンチになってしまいました。
DXライブラリでの円の描画はCPUを用いているようですね。(DxLibのソースを見たことがないので詳しいことはわかりませんが)
弾幕ゲーではいかに高速化をするか、考えなくてはいけなくなるんでしょうねぇ...
さて、明日はコミュニティ英語Ia 世界史 数学A の三教科の考査だし勉強頑張るぞー(遅い
プログラミング楽しすぎて楽しすぎて...(すっとぼけ
ソースコードは前回の日記のを使いまわしています。(マリオのは無効化してる)
► スポイラーを表示
Main.cpp
CODE:
#include "DxLib.h"
#include "PlayerMgr.h"
#include "LotBoxMgr.h"
#include "KeyBoard.h"
#include "FPS.h"
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
ChangeWindowMode(TRUE);
//DxLib初期化
DxLib_Init();
//ウィンドウサイズの変更
SetDrawScreen(DX_SCREEN_BACK);
//PlayerMgr_Init();
LotBoxMgr_Init();
while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0)
{
if (KeyBoard_Get(KEY_INPUT_T) == 1)
LotBoxMgr_Init();
//PlayerMgr_Init();
KeyBoard_Update();
FPS_Update();
LotBoxMgr_Update();
//PlayerMgr_Update();
LotBoxMgr_Draw();
//PlayerMgr_Draw();
FPS_Draw();
FPS_Wait();
}
PlayerMgr_Finalize();
}
LotBoxMgr.h
CODE:
#ifndef DEF_LOTBOXMGR_H
#define DEF_LOTBOXMGR_H
void LotBoxMgr_Init();
void LotBoxMgr_Update();
void LotBoxMgr_Draw();
#endif DEF_LOTBOXMGR_H
LotBoxMgr.cpp
CODE:
#include "DxLib.h"
#include "LotBox.h"
#include "KeyBoard.h"
static const int NUM = 1000000;
static t_Box m_Box[NUM];
static int m_BoxImg;
static int count = 0;
void LotBoxMgr_Init()
{
m_BoxImg = LoadGraph("fill.bmp");
for (int i = 0; i Img = m_BoxImg;
Box->color = GetColor(255,128,128);
Box->x = pos_Rand;
Box->y = pos_Rand;
Box->size_x = size_x;
Box->size_y = size_y;
Box->x_vel = 2;
Box->y_vel = 0;
Box->vel_G = 1;
Box->get_rand_y = pos_Rand2;
}
void LotBox_Update(t_Box *Box)
{
if ((Box->y + Box->size_y) > WINDOW_Y)
{
Box->y_vel = -Box->get_rand_y;
}
if (Box->x > 640) Box->x = 0;
Box->x = Box->x + Box->x_vel;
Box->y = Box->y + Box->y_vel;
Box->y_vel+=Box->vel_G;
}
void LotBox_Draw(t_Box Box,int count)
{
DrawGraph(Box.x, Box.y, Box.Img,false);
if (count % 100000 == 0)
DrawFormatString(0, 24, white, "%d", count);
//DrawBox(0, 0, 20, 20, GetColor(255,255,255), true);
}
頭の悪さが一瞬でわかってしまうコード...なんとかしたい。