所以我正在用c ++和opengl为我的一类制作一个渲染器。我正在制作一个额外功劳的动画程序,它将在我的渲染器在每个帧中读取它们之前更改文本文件中的值。我的问题是这部分代码写得不够快
while (clock() < time_end)
{
timeStep = clock() + fps * CLOCKS_PER_SEC;
for(int k=0; k < currOps.size(); k++)
{
// increase/decrease each set once for the current timestep
// a case for each operation
int pos = currAxis[k];
if(currOps[k] == "loc")
{
opsFile[8+pos] = patch::to_string(atof(opsFile[8+pos].c_str()) + locScale[pos-1]*timeAdjust);
//edit this value by loc adjust
}
else if(currOps[k] == "rot")
{
opsFile[4+pos] = patch::to_string(atof(opsFile[4+pos].c_str()) + rotScale[pos-1]*timeAdjust);
//edit this value by rot adjust
}
else if(currOps[k] == "scl")
{
opsFile[pos] = patch::to_string(atof(opsFile[pos].c_str()) + sclScale[pos-1]*timeAdjust);
//edit this value by scl adjust
}
}
currFile.close(); //save file and restart so we don't append multiple times
currFile.open(files[location[0]].c_str(), ofstream::out); // so we can write to the file after closing
for(int j=0; j <opsFile.size(); j++)
{
// update the file
currFile << opsFile.at(j);
currFile << "\n";
}
while(clock() < timeStep)
{
//wait for the next time steps
}
}
最后是currFile操作。如果我将currFile操作取出,它将以所需的fps运行。 FPS设置为.033,因此它的速度为30 fps。当fps = 0.1时,它也会运行得足够快。任何优化都会很棒。如果需要查看我的代码的任何其他部分,请告诉我,我将上传。整件事大概是170行。 currOps,files和opsFile是字符串的向量 sclScale,rotScale和locScale是双精度矢量 currAxis是整数的载体
答案 0 :(得分:3)
以下是一些可能有所帮助的一般性更改:
curOps
转换为枚举而不是字符串(保存字符串比较。)看起来你应该预先处理该容器并构建一系列枚举(然后你的代码在循环中变为一个switch
)vector<string>
用于curOps
,只需从文件中读取浮点数并将浮点数写出来 - 这将为您节省所有与字符串无关的转换。如果你想进一步使用它,将文件转换为二进制文件(如果练习允许的话),并存储一个包含你需要的浮点数的简单结构并使用内存映射文件(你不需要提升它) ,它只是直接使用mmap
!)在进入mmap
路由之前 - 尝试从文件中读取/写入浮点数。例如,让我们说每个&#34; row&#34;在您的文件中对应于以下内容:
struct transform {
double x, y, z;
};
struct op {
transform scale, rot, loc;
};
为这些声明一组流入/出运算符(例如:
std::ostream& operator<<(std::ostream& os, const transform& tx) {
return os << tx.x << ' ' << tx.y << ' ' << tx.z;
}
std::istream& operator>>(std::istream& is, transform& tx) {
return is >> tx.x >> tx.y >> tx.z;
}
(op
)
现在您的向量为std::vector<op>
,您可以轻松地从文件中流入和传出,例如,阅读:
op i;
while(file >> i) { curOps.push_back(i); }
写:
for (auto o : curOps) file << o << '\n';
如果仍然不够,那么mmap
(顺便说一句 - 它也可以在Windows上使用:Is there a memory mapping api on windows platform, just like mmap() on linux?)
答案 1 :(得分:0)
尝试使用stdio.h
中的功能。 iostreams are terribly inefficient
在您的情况下,您需要的只是fseek()
... fputs()
。每次避免重新打开文件实际上应该有很多帮助。