Vâng, xây dựng trên những gì Niall Ryan bắt đầu, nếu hiệu suất là một vấn đề, bạn có thể mất một bước xa hơn bằng cách tối ưu toán học và đóng gói này vào một lớp.
Vì vậy, chúng tôi sẽ bắt đầu với một chút toán học. Nhớ lại rằng 800 có thể được viết theo lũy thừa của 2 như:
800 = 512 + 256 + 32 = 2^5 + 2^8 + 2^9
Vì vậy, chúng ta có thể viết hàm giải quyết của chúng tôi như:
int index = y << 9 + y << 8 + y << 5 + x;
Vì vậy, nếu chúng ta đóng gói tất cả mọi thứ vào một lớp học thoải mái, chúng tôi nhận được:
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];
};
Bạn không cần phải 'mới' bộ nhớ. Có lẽ là zbuffer sẽ cần phải sống qua các chức năng. Khai báo nó toàn cầu (hoặc nếu bạn đã bắt đầu với một số lớp, trong lớp tôi giả sử). Bạn có thể làm một cái gì đó như 'int zBuffer [WIDTH * HEIGHT];' giả định rằng chiều rộng và chiều cao không thay đổi. – Mark
Đã được cấp, nhưng tôi sẽ không đề xuất sử dụng toàn cầu vì đó không phải là giải pháp tốt nói chung - nó không cung cấp cho bạn nhiều sự linh hoạt về phạm vi và tuổi thọ. Nó có thể làm việc tốt cho người hỏi này vì vậy hãy tiếp tục và để lại câu trả lời của riêng bạn. –