我知道,我知道。这个问题只是尖叫着“你不应该处于那种境地!”但是听我说......
我有一个游戏引擎,可以在一个线程中执行更新,而在另一个线程中执行渲染。渲染器希望读取前一帧中的数据,而更新将更新数据,就像下一帧一样。
所以,为了解决这个问题,我有一个POD结构,mutable_data,即对象中可以改变的一切(速度,位置等等),我在对象内部有两个实例,一个是const,另一个是另一个不。在游戏循环的一次迭代结束时,非const数据将是最新的数据对象,然后我想在const实例上复制它,以便它们现在相等并准备好进行下一次迭代。 / p>
这可能吗?
我已经起草了一个示例程序,希望能够明确我的意思:
#include <iostream>
struct mutable_data
{
int i = 1;
bool j = true;
char k = 'a';
};
struct my_data
{
my_data() : constData() {}
int i() const { return constData.i; }
bool j() const { return constData.j; }
char k() const { return constData.k; }
void set_i(int i) { data.i = i; }
void set_j(bool j) { data.j = j; }
void set_k(char k) { data.k = k; }
void update() { constData = data; }
private:
mutable_data const constData;
mutable_data data;
};
int main()
{
my_data d;
std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl;
d.set_i(10);
d.set_j(false);
d.set_k('z');
std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl;
std::cout << "===============" << std::endl;
d.update();
std::cout << "i: " << d.i() << ", j: " << d.j() << ", k: " << d.k() << std::endl;
}
答案 0 :(得分:4)
为两个数据结构使用访问器,一个用于当前(const),另一个用于即将到来的数据结构。
mutable_data & currentData() { return *currentPtr; }
const mutable_data & upcomingData() { return *upcomingPtr; }
void update() { std::swap(currentPtr, upcomingPtr); }
答案 1 :(得分:1)