String_Split
MB MFC | MB STL | WC MFC | WC STL | ||
99103040 | 5714 | 0 | 20 | 0 | 70 |
99103036 | 14192 | 10 | 130 | 10 | 380 |
99103032 | 27636 | 10 | 400 | 20 | 1400 |
99103051 | 41128 | 20 | 900 | 20 | 3200 |
99103026 | 65388 | 50 | 2400 | 50 | 7200 |
単位は m sec
表では MFC と表現しているが,実際は CStringArray を利用している程度.
ちょっと意外だったのが,STL のコードで,UNICODE 版が MBCS 版の 3 倍以上になってしまっている.
STL を利用しているコードは以下の通り.
std::vector<tstring> String_Split (const tstring& str_,LPCTSTR sp=_T(" \r\n"))
{
std::vector<tstring> strAry ;
tstring str = str_ ;
{
tstring::size_type spPos = tstring::npos ;
while ((spPos=::String_FindFirstOf(str,sp)) != tstring::npos) {
if (str.empty()) { break ; }
TCHAR fc = str[0] ;
if (fc == _T(‘\"’) || fc == _T(‘\”)) { // "—" or ‘—‘
if ((spPos=::String__Find(str,fc,1)) == tstring::npos) {
break ;
}
if ((spPos = ::String_FindFirstOf(str,sp,spPos)) == tstring::npos) {
break ;
}
}
tstring splitS = str.substr(0,spPos) ;
strAry.push_back(splitS) ;
str = str.substr(spPos+1) ;
if (str.empty()) { break ; }
}
if (!str.empty()) {
strAry.push_back(str) ;
}
}
return strAry ;
}
String_Join も同様だが,MFC 版 StringArrayToLine1 の 1 割程度なので,このままとする.
MFC 版 StringArrayToString は十分速い.
3DS
3DS 出力で正しくないのが生成されたので,バイナリを解析した時のメモ
http://www.dcs.ed.ac.uk/home/mxr/gfx/3d/3DS.spec
http://www.martinreddy.net/gfx/3d/3DS.spec
Chunk ID | 2 | |
データ長 | 4 | この次のデータの長さ + 6 |
データ |
4D4D
3D3D
AFFF
A000 名称
A020 15
0011 9 RGB
AFFF
…
4000 名称
4100
4110 頂点情報 ( WORD 頂点数 , [ float x , y , z ] )
4140 テクスチャ ( WORD 点数 , [ float x , y ] )
4160
4120 面情報 ( WORD 面数 , [ WORD 3 頂点のインデックス , WORD 面の情報 ] )
4130 材質名 , WORD 面数 , [ WORD 面のインデックス ]
4130
…
B000
…
頂点数が WORD を超えていたのが原因.
PgonsA_To3DS の objIs1==TRUE で,vp3Ary.GetCount() >= 0x10000 の時,PgonsA_To3DS (…,FALSE,…) .