Pues bien, a partir de lo Niall Ryan comenzó, si el rendimiento es un problema, se puede tomar un paso más allá mediante la optimización de las matemáticas y encapsular esto en una clase.
Así que comenzaremos con un poco de matemática. Recordemos que 800 se puede escribir en potencias de 2 como:
800 = 512 + 256 + 32 = 2^5 + 2^8 + 2^9
lo tanto, podemos escribir nuestra función de direccionamiento como:
int index = y << 9 + y << 8 + y << 5 + x;
lo tanto, si se encapsula todo en una clase agradable obtenemos:
class ZBuffer
{
public:
const int width = 800;
const int height = 800;
ZBuffer()
{
for(unsigned int i = 0, *pBuff = zbuff; i < width * height; i++, pBuff++)
*pBuff = 0;
}
inline unsigned int getZAt(unsigned int x, unsigned int y)
{
return *(zbuff + y << 9 + y << 8 + y << 5 + x);
}
inline unsigned int setZAt(unsigned int x, unsigned int y, unsigned int z)
{
*(zbuff + y << 9 + y << 8 + y << 5 + x) = z;
}
private:
unsigned int zbuff[width * height];
};
No es necesario 'actualizar' la memoria. Presumiblemente, el zbuffer va a necesitar vivir en todas las funciones. Declararlo global (o si se ha abstraído a alguna clase, en la clase, supongo). Puede hacer algo como 'int zBuffer [ANCHURA * ALTURA];' asumiendo que el ancho y la altura no cambian. – Mark
Concedido, pero no voy a sugerir el uso de un global porque esa no es una buena solución en general, no le da mucha flexibilidad en términos de alcance y duración. Puede funcionar bien para este interrogador así que adelante y deje su propia respuesta. –