ゆとりーなの日記

日記的な事を書いて行くと思はれる

listよりもvectorの方が速かったでござる

コンテナの要素のまんなからへんをよく引っこ抜く弾幕シューティングにおいてはvectorよりもlistの方が速いだろうと思っていたのですが、それは幻想でした。昨日のコードは以下の様に修正すると幸せになれることが判明しています。

// objectlist.h
#pragma once

#include <boost/ptr_container/ptr_vector.hpp>

class Object;

typedef Object *ObjectPtr;
typedef boost::ptr_vector<Object> ObjectList;

void pushBackObjectList(const ObjectPtr &ptr);
void objectLoop();

// objectlist.cc
#include "objectlist.h"
#include <vector>
#include <algorithm>

namespace {
ObjectList object_list_;
std::vector<Object*> add_list_;
}

void pushBackObjectList(const ObjectPtr &ptr) {
    add_list_.push_back(ptr);
}

// でも実装はerase_if
void objectLoop() {
  object_list_.erase_if([](Object &x) {return m.main();});
    std::copy(add_list_.begin(), add_list_.end(), std::back_inserter(object_list_));
    add_list_.clear();
}

listからvectorになったことで、要素の走査中に要素の追加とかを行うと落ちてしまうので、push_back()処理は外に出してあげる必要があります。この変更でこのくらいの弾幕も最大FPS55程度までの低下で耐えます。

因みにlistだとFPS30位まで落ちてしまいます。要素の中らへんを引っこ抜く場合はlistが優れていてvectorは苦手という話を聞いていたのですが、この結果をみるとvector最強ということになってしまいます。確かにlistは見た目よりパフォーマンス出ないことが多いという噂や、vectorのコストはかなり小さくなってきているという噂は聞いたことがあります。というわけでみんな弾幕シューティングでもコンテナはlistではなくvectorを選びましょう。
画像については東方Project上海アリス幻楽団さん)の二次創作である東方夢終劇(danmaqさん)内の画像を使用させてもらいました。