Làm thế nào để chúng tôi giải quyết các yêu cầu bộ nhớ video lớn trong một trò chơi 2D?
Chúng tôi đang phát triển một trò chơi 2D (Factorio) trong allegro C / C ++ và chúng tôi đang phải đối mặt với một vấn đề với việc tăng yêu cầu bộ nhớ video khi nội dung trò chơi tăng lên.
Chúng tôi hiện đang thu thập tất cả thông tin về các hình ảnh sẽ được sử dụng trước tiên, cắt tất cả các hình ảnh này càng nhiều càng tốt và sắp xếp chúng thành các tập lớn nhất càng chặt chẽ càng tốt. Các atlase này được lưu trữ trong bộ nhớ video, kích thước phụ thuộc vào các giới hạn hệ thống; hiện tại nó thường là 2 hình ảnh có kích thước lên tới 8192x8192, vì vậy chúng cần bộ nhớ video 256Mb đến 512Mb.
Hệ thống này hoạt động khá tốt đối với chúng tôi, vì với một số tối ưu hóa tùy chỉnh và chia luồng kết xuất và cập nhật, chúng tôi có thể vẽ hàng chục ngàn hình ảnh trên màn hình trong 60 khung hình / giây; chúng tôi có nhiều đối tượng trên màn hình và cho phép thu nhỏ lớn là một yêu cầu quan trọng. Như chúng tôi muốn bổ sung thêm, sẽ có một số rắc rối với các yêu cầu bộ nhớ video, vì vậy hệ thống này không thể giữ được.
Một trong những điều chúng tôi muốn thử là có một tập bản đồ với những hình ảnh phổ biến nhất và thứ hai là bộ đệm. Các hình ảnh sẽ được chuyển đến đó từ bitmap bộ nhớ, theo yêu cầu. Có hai vấn đề với cách tiếp cận này:
- Việc vẽ từ bitmap bộ nhớ sang bitmap video rất chậm, trong allegro.
- Không thể làm việc với bitmap video ngoài luồng chính, trong allegro, vì vậy nó thực tế không thể sử dụng được.
Dưới đây là một số yêu cầu bổ sung mà chúng tôi có:
- Trò chơi phải có tính xác định, vì vậy các vấn đề về hiệu suất / thời gian tải không bao giờ có thể thay đổi trạng thái trò chơi.
- Trò chơi là thời gian thực, và sẽ sớm được nhiều người chơi. Chúng ta cần tránh ngay cả những người nói lắp nhỏ nhất bằng mọi giá.
- Hầu hết các trò chơi là một thế giới mở liên tục.
Thử nghiệm bao gồm vẽ 10 000 sprite trong một lô cho các kích thước từ 1x1 đến 300x300, nhiều lần cho mỗi cấu hình. Tôi đã thực hiện các thử nghiệm trên Nvidia Geforce GTX 760.
- Bản đồ bitmap video sang bản vẽ bitmap video mất 0,1us mỗi sprite, khi bitmap nguồn không thay đổi giữa các bitmap riêng lẻ (biến thể atlas); kích thước không thành vấn đề
- Bản đồ bitmap video sang bản vẽ bitmap video, trong khi bitmap nguồn được chuyển đổi giữa các bản vẽ (biến thể không có bản đồ), lấy 0,56us mỗi sprite; kích thước cũng không thành vấn đề.
- Bộ nhớ bitmap để vẽ bitmap video thực sự đáng ngờ. Kích thước từ 1x1 đến 200x200 mất 0,3us mỗi bitmap, do đó không quá chậm. Đối với kích thước lớn hơn, thời gian bắt đầu tăng rất đột ngột, ở mức 9us cho năm 201x201 lên tới 3116us cho 291x291.
Sử dụng tập bản đồ giúp tăng hiệu suất lên gấp 5 lần. Nếu tôi có 10ms cho kết xuất, với tập bản đồ tôi bị giới hạn ở 100 000 họa tiết trên mỗi khung và không có nó, giới hạn là 20 000 họa tiết. Đây sẽ là vấn đề.
Tôi cũng đã cố gắng tìm cách kiểm tra nén bitmap và định dạng bitmap 1bpp cho bóng, nhưng tôi không thể tìm ra cách để làm điều này trong allegro.