Tôi đang phát triển một trò chơi 2D, và tôi có rất nhiều họa tiết. Tôi đã sử dụng các mô hình và hoạt hình 3D để kết xuất thành 2D, để cung cấp cho chúng "Fallout" hoặc "Diablo" nhìn vào chúng. Nó cũng dễ hơn vẽ bằng tay, lol.
Tôi đã phải cắt giảm tốc độ khung hình xuống còn 15 khung hình / giây, đây là mức thấp nhất tôi có thể hạ xuống mà không khiến chúng có vẻ ngoài khó chịu với chúng. Tuy nhiên, thật đáng buồn vì 24 khung hình trông cực kỳ mượt mà.
Có hai lý do tôi đã làm điều này:
1) Cắt giảm dung lượng ổ cứng. Hình ảnh càng ít, tổng số trò chơi của tôi sẽ càng nhỏ.
2) Cắt giảm mức tiêu thụ RAM. Càng tải ít hình ảnh, tôi càng có nhiều khả năng tránh các vấn đề làm hạn chế RAM.
Tuy nhiên, nếu có một cách để nén hình ảnh trong cả không gian ổ cứng và RAM, tôi sẽ làm như vậy. Tôi đã thử nghiệm nó trước đây và hầu hết không nhận được bất kỳ thay đổi nào về chất lượng khi cung cấp từ RGBA8888 sang RGBA5555 và chỉ một chút nhấn khi chuyển đổi sang RGBA4444 trong chương trình TexturePacker của tôi. Hiện tại tôi không làm điều này, vì SFML dường như sử dụng cùng một lượng bộ nhớ cho dù đó là loại hình ảnh .PNG nào. Tôi đã nghiên cứu làm thế nào để tải nó khác nhau, nhưng không tìm thấy bất cứ điều gì về chủ đề này.
Tôi đã đọc rất nhiều về cách xử lý các trò chơi video 2D. Sự đồng thuận là rất lớn: Đóng gói Sprites của bạn thành một kết cấu lớn hơn cho hiệu suất tuyệt vời! Vì vậy, tôi gói các sprite nhỏ của mình vào một spritesheet lớn hơn nhiều bằng TexturePacker.
Tuy nhiên, tôi dự định sẽ có 10-15 hình ảnh động cho mỗi nhân vật, 5 hướng để di chuyển và 15-40 khung hình cho mỗi hình ảnh động (có thể là trung bình 24). Với 15 hình động, 5 hướng và trung bình 24 khung hình cho mỗi hình ảnh động; Đó là 1800 khung hình riêng cho mỗi nhân vật. Nếu được đóng gói trong một tấm sprite, đó chỉ là 75 hình ảnh. (Một tờ sprite cho mỗi Hoạt hình, mỗi Hướng. 15 * 5)
Đối với một nhân vật ông chủ khổng lồ trong trò chơi, tôi không thể sử dụng một spritesheet và phải lập trình một cách đơn giản để tải một hình ảnh tại một thời điểm. Tôi không biết nếu tôi có thể làm điều này cho hiệu suất chưa.
Đối với các nhân vật, tôi đã đóng gói chúng trong một spritesheet. Đối với một nhân vật duy nhất đi bộ về, điều này dường như hoạt động hầu hết thời gian, mặc dù đôi khi nó bị trì hoãn. Tuy nhiên, tôi cho rằng mã được hình dung xấu của tôi thay đổi kết cấu thay vì tải trước tất cả các kết cấu cho ký tự đó.
Nếu tôi đã tải trước các kết cấu, nó có ý nghĩa cho các tấm sprite. Tôi chỉ tưởng tượng đó là một ý tưởng tồi để tải trước 1800 hình ảnh nhỏ cho mỗi nhân vật.
Tuy nhiên, tôi tưởng tượng việc truyền chúng vào và ra khỏi bộ nhớ một lần sẽ cực kỳ nhanh, vì vậy tôi chỉ cần có một hình ảnh duy nhất trong bộ nhớ cùng một lúc. Điều này có nghĩa là tại bất kỳ thời điểm nào, tôi sẽ chỉ có mỗi nhân vật tiêu thụ một vài KB thay vì 45 + MB?
Tôi tưởng tượng điều này sẽ giết chết hiệu suất của tôi, vì việc truyền phát cần phải cực kỳ nhanh (15 hình ảnh đi vào và ra khỏi bộ nhớ và kết xuất, mỗi giây) và mặc dù các hình ảnh sẽ rất nhỏ - có thể là một ý tưởng tốt hơn để tải các ký tự viết ký tự vào bộ nhớ thay thế. Nhưng tôi sẽ phải mã hóa một hệ thống kết xuất giống như một luồng hình ảnh cho nhân vật ông chủ lớn hơn của mình.
Tôi đã thử nghiệm, nhưng nó không phải là một quá trình đơn giản. Đặc biệt là với thực tế tôi đang làm việc trên các phần khác của công cụ trò chơi không xử lý đồ họa ngay bây giờ.