Esto está en C++.Buffering doble para objetos de juego, ¿qué es una buena forma genérica y limpia de C++?
Por lo tanto, estoy empezando desde cero escribiendo un motor de juego para divertirme y aprender desde cero. Una de las ideas que quiero implementar es hacer que el estado del objeto del juego (una estructura) sea de doble buffer. Por ejemplo, puedo hacer que los subsistemas actualicen los nuevos datos del objeto del juego mientras se renderiza un hilo de renderización a partir de los datos anteriores, garantizando que haya un estado consistente almacenado dentro del objeto del juego (los datos de la última vez). Después de que el renderizado anterior y la actualización de nuevo hayan finalizado, puedo intercambiar buffers y volver a hacerlo.
La pregunta es, ¿cuál es una buena forma de OOP genérica y con visión de futuro para exponer esto a mis clases al tratar de ocultar los detalles de implementación tanto como sea posible? Me gustaría saber sus pensamientos y consideraciones.
Pensaba que se podía utilizar la sobrecarga del operador, pero ¿cómo sobrecarga la asignación para un miembro de la clase de plantilla dentro de mi clase de memoria intermedia?
por ejemplo, creo que este es un ejemplo de lo que quiero:
doublebuffer<Vector3> data;
data.x=5; //would write to the member x within the new buffer
int a=data.x; //would read from the old buffer's x member
data.x+=1; //I guess this shouldn't be allowed
Si esto es posible, que podía elegir para activar o desactivar estructuras de doble búfer sin cambiar mucho código.
Esto es lo que yo estaba teniendo en cuenta:
template <class T>
class doublebuffer{
T T1;
T T2;
T * current=T1;
T * old=T2;
public:
doublebuffer();
~doublebuffer();
void swap();
operator=()?...
};
y un objeto de juego sería así:
struct MyObjectData{
int x;
float afloat;
}
class MyObject: public Node {
doublebuffer<MyObjectData> data;
functions...
}
Lo que tengo en este momento es las funciones que devuelven punteros a la memoria intermedia de viejo y nuevo , y creo que cualquier clase que los use debe ser consciente de esto. ¿Hay una mejor manera?
cambio pequeño para mayor claridad – gtrak
Gary: La sobrecarga del operador es una mala opción denotational. No estás haciendo una variante de un operador aceptado, estás haciendo algo bastante único. Desea una llamada de función que observe la singularidad de la solución. –
sí, una versión más concreta de mi idea original era que podía tener operator + call operator + en el miembro apropiado de la estructura de datos apropiada y pasar el argumento. Sin embargo, veo lo que quieres decir, podría ser confuso. La ventaja en mi mente es que los datos con doble copia de seguridad podrían ser un reemplazo en reemplazo de los datos normales si los utilizo, si impongo algunas reglas, como que los miembros solo pueden ser números o agregados. – gtrak