Hướng dẫn xoá đồ hoạ game giảm CPU hiệu quả NRO
Hướng dẫn xoá đồ hoạ game giảm CPU hiệu quả NRO
Để làm phiên bản mod NRO có thể treo được nhiều acc mà ít tốn tài nguyên máy người ta sẽ thường chỉnh sửa lại mã nguồn của game sao cho tối ưu hơn, cách phổ biến thường được sử dụng sẽ là xoá bớt các đồ hoạ thừa, không cần thiết vì đồ hoạ là phần chính của game, game đồ hoạ càng khủng tài nguyên sử dụng càng nhiều mà trong việc treo up thì ta thường không cần chiêm ngưỡng vẻ đẹp của game.
Vì lý do trên nên việc xoá đồ hoạ là một cách rất tốt để tối ưu tài nguyên sử dụng của game, bài viết này sẽ hướng dẫn xoá các đồ hoạ thừa chuẩn và giảm được nhiều tài nguyên máy tính.
Hoạt động của game NRO
gantt
title Hoạt động của game NRO bình thường
axisFormat %Mms
section 0+
Vẽ đồ hoạ : 0, 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
section 30+
Vẽ đồ hoạ : 0, 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
section 60+
Vẽ đồ hoạ : 0, 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Ở trên là hình ảnh mô phỏng lại hoạt động của game. Lưu ý đây chỉ là mô hình giả sử, thực tế game hoạt động phức tạp hơn rất nhiều.
Các câu lệnh trong game được diễn ra liên tục và lặp đi lặp lại, để tránh chiếm dụng quá nhiều tài nguyên thì game sẽ có một khoảng thời gian nghỉ ngơi giúp giảm thiểu số lượng câu lệnh trên một đơn vị thời gian từ đó việc sử dụng tài nguyên sẽ ít hơn.
Tim hoạt động suốt đời mà không mệt mỏi do thời gian làm việc và nghỉ ngơi hợp lý!
Nếu hiểu được hoạt động trên thì khi muốn giảm tài nguyên của máy ta sẽ phải làm cho thời gian nghỉ của game nhiều hơn.
Phương pháp xoá đồ hoạ
Ta thử xem phương pháp xoá đồ hoạ game (giả sử ta sẽ xoá toàn bộ đồ hoạ).
gantt
title Hoạt động của game NRO khi xoá vẽ đồ hoạ
axisFormat %Mms
section 0+
Các hoạt động khác :0, 6ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 2ms
section 30+
Các hoạt động khác :0, 4ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 4ms
section 60+
Các hoạt động khác :0, 2ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Nghỉ : 1ms
Các hoạt động khác : 6ms
Như đã thấy nếu so sánh với biểu đồ trên thì cùng một khoảng thời gian, thời gian nghỉ từ 9ms tăng lên được 12ms, cần lưu ý đây chỉ là mô hình giả sử nên kết quả trên có thể không chính xác nhưng thời gian nghỉ tăng lên giúp giảm tài nguyên máy tính thì thực sự có. Tuy nhiên cùng với đó thời gian làm những việc khác cũng tăng theo
Giả sử bạn được giao 2 nhiệm vụ và một chút thời gian nghỉ như trên và ngay sau khi thực hiện xong bạn tiếp tục được giao nhiệm vụ mới. Nếu vì một lí do nào đó mà có một công việc bạn không cần làm nữa thì bạn sẽ nhanh chóng thực hiện công việc còn lại để nhận nhiệm vụ mới? Chăm chỉ quá dành thời để nghỉ ngơi sẽ khoẻ hơn.
Vì lẽ trên thay vì xoá bỏ hoàn toàn việc vẽ đồ hoạ ta sẽ thay thời gian vẽ đó bằng thời gian nghỉ như vậy sẽ tốt hơn. Trước khi ta chưa xoá vẽ đồ hoạ thì số lần thực hiện hoạt động khác đã cố định vậy tại sao sau khi bỏ việc ta phải thực hiện nó nhiều hơn? Như vậy ta sẽ tổng kết lại với biểu đồ sau.
gantt
title Hoạt động của game NRO khi thay thế thời gian vẽ bằng thời gian nghỉ
axisFormat %Mms
section 0+
Nghỉ vẽ : 0, 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ vẽ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ vẽ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
section 30+
Nghỉ vẽ : 0, 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ vẽ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ vẽ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
section 60+
Nghỉ vẽ : 0, 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ vẽ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ vẽ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Ta có thể thấy rõ theo mô hình trên thời gian nghỉ tăng rõ rệt, tổng thời gian nghỉ là 36ms như vậy cách làm này thực sự tốt hơn so với chỉ xoá đồ hoạ thông thường.
Phương pháp tăng thời gian nghỉ thêm cho một chu kì
Cốt lõi vẫn là làm cho thời gian nghỉ của game nhiều hơn. Sẽ tăng thời gian chu kỳ lên và dùng thời gian thêm vào đó làm thời gian nghỉ như vậy ta cũng có thể làm thời gian nghỉ của game tăng lên giống như biểu đồ sau.
gantt
title Hoạt động của game NRO khi thêm thời gian nghỉ
axisFormat %Mms
section 0+
Vẽ đồ hoạ : 0, 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ thêm: 5m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ thêm: 5m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ thêm: 5m
section 45+
Vẽ đồ hoạ : 0, 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ thêm: 5m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ thêm: 5m
Vẽ đồ hoạ : 3m
Các hoạt động khác : 6m
Nghỉ : 1m
Nghỉ thêm: 5m
Theo biểu đồ trên tổng thời gian nghỉ sẽ là 36ms tuy nhiên nếu chu kì hoạt động của game tăng lên quá nhiều thì game sẽ trở nên chậm hơn và ảnh hưởng tới trải nghiệm chơi. Vì vậy khi đánh đổi với tài nguyên máy cần cân nhắc và thời gian thêm vào cũng tuỳ với nhu cầu sử dụng.
Sửa mã nguồn của game để giảm tài nguyên
Ta sẽ tìm tới những hàm vẽ đồ hoạ của game (các hàm này trong tên thường chứa từ paint) ở đây mình sẽ chọn 2 hàm SmallImage.drawSmallImage(mGraphics, int, int, int, int, int)
và TileMap.paintTilemap(mGraphics)
để làm ví dụ, nếu muốn giảm được nhiều hơn các bạn có thể tìm thêm. Mình sẽ thêm phím tắt có thể Bật/Tắt chức năng này để tiện sử dụng nhé.
// GameScr
...
// Tạo thêm biến lưu trạng thái Bật/Tắt
public static bool isXoaDoHoa;
public override void updateKey()
{
...
// Phím tắt nút chat
else if (GameCanvas.keyAsciiPress == 114)
{
ChatTextField.gI().startChat(this, string.Empty);
}
// Thêm phím tắt Bật/Tắt đồ hoạ
else if (GameCanvas.keyAsciiPress == 'z')
{
isXoaDoHoa = !isXoaDoHoa;
info1.addInfo("Xoá đồ hoạ game: " + (isXoaDoHoa ? "Bật" : "Tắt"), 0);
}
}
...
Save code trước khi chỉnh sửa tiếp
// SmallImage
...
// Lưu ý ở đây có 2 hàm tên giống nhau nên cần chú ý các biến truyền vào hàm
public static void drawSmallImage(mGraphics g, int id, int x, int y, int transform, int anchor)
{
// Code chèn đầu hàm
if (GameScr.isXoaDoHoa)
{
System.Threading.Thread.Sleep(2);
return;
}
...
}
// TileMap
...
public static void paintTilemap(mGraphics g)
{
// Code chèn đầu hàm
if (GameScr.isXoaDoHoa)
{
System.Threading.Thread.Sleep(15);
return;
}
...
}
Khi vào game sử dụng tính năng bạn có thể cảm nhận được game sẽ giật giật fps giảm đi chút. Vì mình để thời gian nghỉ lơn hơn thời gian game thực hiện 2 hàm này nên phần thời gian kia dư ra làm tăng chu khì hoạt động và giảm tài nguyên máy theo phương pháp 2.
Test trên VPS 1-1
Trước khi giảm
Tra tấn máy thế này vps chắc nó sập mất.
Sau khi giảm
Vẫn cao so với VPS 1-1 nhưng nó vẫn thở được.
như lol
Trả lờiXóa