std::listの優先順位の続き

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
夢幻ノ月夜
記事: 143
登録日時: 9年前
住所: Stens;Gate世界線

std::listの優先順位の続き

#1

投稿記事 by 夢幻ノ月夜 » 8年前

コード:

void Object_Manager::AddTask(CObject *obj){
	if(List.empty()){
		List.push_front(obj);
		return;
	}
	for(auto itr=List.begin();;){
		if(itr==List.end()){
			List.push_back(obj);
			return;
		}else if((*itr)->operator>(obj)){
			itr=List.insert(itr,obj);
			return;
		}
		itr++;
	}	
}
こうすることで最終的に優先順位が反映されたのですが、何故か物凄く動作が重くなってしまいます
何が原因で負荷がかかっているのでしょうか?
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
夢幻ノ月夜
記事: 143
登録日時: 9年前
住所: Stens;Gate世界線

Re: std::listの優先順位の続き

#2

投稿記事 by 夢幻ノ月夜 » 8年前

コンパイル設定を変えてoperator >をinlineにしてみたらFPS58まで改善しました
毎回ゲーム作ろうとするたびに壁にぶち当たる

NNN

Re: std::listの優先順位の続き

#3

投稿記事 by NNN » 8年前

・ここ以外にもソースを変更していいて、それが原因の可能性はないか
・リストにどれくらいオブジェクトを追加しているか
・「物凄く重く」とか具体的にどの程度か(FPS表示しているなら1桁しか出ないレベルなのか、45程度は出るのか)
・追加するオブジェクトの優先度はどうなっているのか(例えば弾幕の弾が追加していたら、追加するたびにリスト末尾まで毎回判定してたら重くなりそうです)
このあたりの情報が無いと推測回答しか出来ないので的確な回答をするのは難しいと思います。

アバター
夢幻ノ月夜
記事: 143
登録日時: 9年前
住所: Stens;Gate世界線

Re: std::listの優先順位の続き

#4

投稿記事 by 夢幻ノ月夜 » 8年前

NNN さんが書きました:・ここ以外にもソースを変更していいて、それが原因の可能性はないか
・リストにどれくらいオブジェクトを追加しているか
・「物凄く重く」とか具体的にどの程度か(FPS表示しているなら1桁しか出ないレベルなのか、45程度は出るのか)
・追加するオブジェクトの優先度はどうなっているのか(例えば弾幕の弾が追加していたら、追加するたびにリスト末尾まで毎回判定してたら重くなりそうです)
このあたりの情報が無いと推測回答しか出来ないので的確な回答をするのは難しいと思います。
他の部分の改変はしていません
リストには1000個入ってないはずです
FPS28くらいになっていました→58まで回復
先頭から判断して優先度的に入れるところで入れてリターンしています
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: std::listの優先順位の続き

#5

投稿記事 by みけCAT » 8年前

複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
夢幻ノ月夜
記事: 143
登録日時: 9年前
住所: Stens;Gate世界線

Re: std::listの優先順位の続き

#6

投稿記事 by 夢幻ノ月夜 » 8年前

またコンパイラの設定したら3000個でFPS60出たので解決です
毎回ゲーム作ろうとするたびに壁にぶち当たる

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: std::listの優先順位の続き

#7

投稿記事 by へにっくす » 8年前

解決しちゃったので見てないかもしれませんが。
add_taskは以下のようにできますね。
わざわざempty()とか調べなくともよいです。

コード:

#include <iostream>
#include <list>


class CObject {
public:
    int priority = 0;
    CObject() {
        priority = 0;
    }
    CObject(int prio) {
        priority = prio;
    }
    
    bool operator <(const CObject &obj)const{
        return priority < obj.priority;
    }
};


std::list<CObject*> g_list;


void add_task(CObject *obj) {
    std::list<CObject*>::iterator ptr = g_list.begin();
    for (; ptr != g_list.end(); ptr++) {
        if (*(*ptr) < *obj) {
            g_list.insert(ptr, obj);
            return;
        }
    }
    g_list.push_back(obj);
}


int main() {
    // 適当に追加してみる
    add_task(new CObject(3));
    add_task(new CObject(4));
    add_task(new CObject(7));
    add_task(new CObject(5));
    add_task(new CObject(2));
    add_task(new CObject(1));
    add_task(new CObject(6));

    // リストの中身を表示する
    for (std::list<CObject*>::iterator ptr = g_list.begin(); ptr != g_list.end(); ptr++) {
        std::cout << (*ptr)->priority << std::endl;
    }
}
コンパイル&実行結果

コード:

C:\Users\guest\Documents>cl /EHsc 1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.31101 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

1.cpp
Microsoft (R) Incremental Linker Version 12.00.31101.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:1.exe
1.obj

C:\Users\guest\Documents>1
7
6
5
4
3
2
1

C:\Users\guest\Documents>
written by へにっくす

アバター
夢幻ノ月夜
記事: 143
登録日時: 9年前
住所: Stens;Gate世界線

Re: std::listの優先順位の続き

#8

投稿記事 by 夢幻ノ月夜 » 8年前

へにっくす さんが書きました:解決しちゃったので見てないかもしれませんが。
add_taskは以下のようにできますね。
わざわざempty()とか調べなくともよいです。

コード:

#include <iostream>
#include <list>


class CObject {
public:
    int priority = 0;
    CObject() {
        priority = 0;
    }
    CObject(int prio) {
        priority = prio;
    }
    
    bool operator <(const CObject &obj)const{
        return priority < obj.priority;
    }
};


std::list<CObject*> g_list;


void add_task(CObject *obj) {
    std::list<CObject*>::iterator ptr = g_list.begin();
    for (; ptr != g_list.end(); ptr++) {
        if (*(*ptr) < *obj) {
            g_list.insert(ptr, obj);
            return;
        }
    }
    g_list.push_back(obj);
}


int main() {
    // 適当に追加してみる
    add_task(new CObject(3));
    add_task(new CObject(4));
    add_task(new CObject(7));
    add_task(new CObject(5));
    add_task(new CObject(2));
    add_task(new CObject(1));
    add_task(new CObject(6));

    // リストの中身を表示する
    for (std::list<CObject*>::iterator ptr = g_list.begin(); ptr != g_list.end(); ptr++) {
        std::cout << (*ptr)->priority << std::endl;
    }
}
コンパイル&実行結果

コード:

C:\Users\guest\Documents>cl /EHsc 1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 18.00.31101 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

1.cpp
Microsoft (R) Incremental Linker Version 12.00.31101.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:1.exe
1.obj

C:\Users\guest\Documents>1
7
6
5
4
3
2
1

C:\Users\guest\Documents>
抽象クラスのポインタを入れて3000個回したらどのくらいの負荷になるんだろう
毎回ゲーム作ろうとするたびに壁にぶち当たる

NNN

Re: std::listの優先順位の続き

#9

投稿記事 by NNN » 8年前

どうなるんだろう・・・ではなく
みけCAT さんが書きました:
と指摘されているわけですし、デバッグ支援関数を作ってみようのページでデバッグ技術を覚えた方が良いと思います。
ゲーム作りしていた身としてはこれを身に付けるだけで変に試行錯誤していた時間を無くせてゲーム作り捗ると思いますよ。

アバター
へにっくす
記事: 634
登録日時: 11年前
住所: 東京都

Re: std::listの優先順位の続き

#10

投稿記事 by へにっくす » 8年前

夢幻ノ月夜 さんが書きました:抽象クラスのポインタを入れて3000個回したらどのくらいの負荷になるんだろう
知るか。ですよ。
自分で取り込むぐらいはできるでしょう?
written by へにっくす

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: std::listの優先順位の続き

#11

投稿記事 by みけCAT » 8年前

夢幻ノ月夜 さんが書きました:抽象クラスのポインタを入れて3000個回したらどのくらいの負荷になるんだろう
undefined behaviorが無ければ最悪O(N^2)ですね。 (Nは要素数)
ここに独り言を書き込む前に、まずは実験すればいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

“C言語何でも質問掲示板” へ戻る