我想在C構建一個簡單的實體/組件系統++的基礎上的第二次回答這個問題:Best way to organize entities in a game?映射類實例
現在,我想有一個靜態的std ::地圖返回(如果可能,甚至會自動創建)。
我在想什麼是沿着線的東西:
PositionComponent *pos = systems[PositionComponent].instances[myEntityID];
什麼會實現,最好的方法是什麼?
我想在C構建一個簡單的實體/組件系統++的基礎上的第二次回答這個問題:Best way to organize entities in a game?映射類實例
現在,我想有一個靜態的std ::地圖返回(如果可能,甚至會自動創建)。
我在想什麼是沿着線的東西:
PositionComponent *pos = systems[PositionComponent].instances[myEntityID];
什麼會實現,最好的方法是什麼?
也許這樣?
std::map< std::type_info*, Something > systems;
然後,你可以這樣做:
Something sth = systems[ &typeid(PositionComponent) ];
只是出於好奇,我查了一下這個C++代碼
#include <typeinfo>
#include <cstdio>
class Foo {
virtual ~Foo() {}
};
int main() {
printf("%p\n", &typeid(Foo));
}
的彙編代碼,以確保它確實是一個常數。彙編(剝離)由GCC輸出(沒有任何的優化):
.globl _main
_main:
LFB27:
pushl %ebp
LCFI0:
movl %esp, %ebp
LCFI1:
pushl %ebx
LCFI2:
subl $20, %esp
LCFI3:
call L3
"L00000000001$pb":
L3:
popl %ebx
leal L__ZTI3Foo$non_lazy_ptr-"L00000000001$pb"(%ebx), %eax
movl (%eax), %eax
movl %eax, 4(%esp)
leal LC0-"L00000000001$pb"(%ebx), %eax
movl %eax, (%esp)
call _printf
movl $0, %eax
addl $20, %esp
popl %ebx
leave
ret
所以它實際上有閱讀L__ZTI3Foo$non_lazy_ptr
符號(雖然我不知道這是不是恆定的 - 也許與其他編譯器選項或與其他編譯器,它是)。所以常量可能會稍微快一點(如果編譯器在編譯時看到常量),因爲您保存了讀取。
static is bad,mmkay? – Puppy 2010-07-18 18:49:41
我同意,但讓我們假裝它不是靜態的。有沒有辦法將類映射到實例? – sharvey 2010-07-18 18:53:32
PositionComponent是一個位置向量? – Albert 2010-07-18 18:54:14