thử kĩ thuật này xem xử lí được giật lag ko.
Double buffer
Tức bác coi cả cái màn hình console là 1 mảng char MxN, bác tạo ra 2 mảng như thế: 1 mảng tên frontBuffer, 1 mảng backBuffer. Khi draw lên screen thì luôn vẽ mảng frontBuffer, còn nhưng thao tác mình vẽ lên màn hình vẽ vào backBuffer. Trong vòng lặp thì trc khi bác vẽ thì phải SwapBuffer tức frontBuffer = backBuffer, rồi ms vẽ (tránh việc hình đang vẽ dở đã cho lên màn hình)
Draw
Chỉ dùng gotoxy và cout 1 lần để tránh làm chậm và ko dùng vòng lặp for vì sẽ bắt máy tính toán 1 lượng đáng kể (vd: 802424 = ?? (kích cỡ màn hình * số lần vẽ mỗi giây)) Vì ta có mảng frontBuffer là xâu nên đưa con trỏ về vị trị (0;0), gốc toạ độ, rồi cout 1 lần là xong.
Frame Per Second (FPS)
Ko nên để vẽ lên màn hình liên tục mà ko kiểm soát (mình chưa xem kĩ code của bác nên ko biết có chưa). FPS là số khung hình/lần vẽ trong 1s. Thông thường 24 FPS là nhìn mượt rồi, 60 FPS càng tốt. Bác dùng mấy hàm thời gian của window để điều chỉnh số lần vẽ theo FPS mình mong muốn.
Lưu ý đây là cách FPS tĩnh tức FPS mình tự quy ước, ko thay đổi suốt cả chương trình (mình lấy vd vì nó đơn giản)
// Code giả
#define FPS hằng số (vd: 24)
while (!end) // còn chạy
{
currentTime = GetTime();
elapsed = currentTime - lastTime;
// Update
// Cho chương trình nghỉ nếu update nhanh quá
// chưa hết 1/FPS (thời gian mỗi khung hình)
while (1.f/(GetTime() - currentTime) >= FPS);
SwapBuffer(); // frontBuffer = backBuffer;
Draw(); // draw frontBuffer
lastTime = currentTime;
}