Phân tích hiệu suất Windows Phone giúp trò chơi chạy nhanh hơn. Lý do có thể?


7

Một trò chơi XNA tôi đang thực hiện đang chạy chậm trên thiết bị WP7 của mình. Tuy nhiên, khi tôi khởi động nó trong Phân tích Hiệu suất Windows Phone để tìm ra nút cổ chai, trò chơi đã chạy trơn tru trên cùng một thiết bị.

Tôi đã tìm ra vấn đề một lát sau, và đó là một chức năng kiểm tra kề. Tôi đã tối ưu hóa chức năng và trò chơi hoạt động tốt.

Tại sao trò chơi tăng tốc một cách kỳ diệu trong chế độ Phân tích hoàn hảo? Bất kỳ lời giải thích có thể?

Đây là mã chạy nhanh hơn ở chế độ Phân tích hoàn hảo, nhưng ngược lại thì chậm. Nó là một chức năng gây sát thương trong một trò chơi phòng thủ tháp.

 foreach (Target myTarget in _targets)
 {
        for (int x = -1; x <= 1; x++)
        {
                for (int y = -1; y <= 1; y++)
                {
                    if (x == 0 && y == 0) continue;
                    try
                    {
                        Tile adjacent = _tiles[(int)myTarget.CurrentTile.X + x, (int)myTarget.CurrentTile.Y + y];
                        if (adjacent.Tower != null)
                        {
                            DealDamage(myTarget, adjacent.Tower);
                        }
                    }
                    catch
                    {
                    }
                }
            }
 }

Tôi đã tối ưu hóa nó sau bằng cách kiểm tra thiệt hại cho từng tòa tháp thay vì từng mục tiêu.


Tôi không có kiến ​​thức để giúp đỡ, nhưng có thể thêm mã trước và sau khi sửa lỗi của bạn sẽ giúp người khác.
George Duckett

Để rõ ràng, cùng một mã liên tục chạy nhanh hơn trong khi tôi chạy nó trong chế độ Phân tích hoàn hảo. Tôi không hiểu lý do đằng sau việc này xảy ra. Việc tôi tối ưu hóa mã sau này là không liên quan.
ApoorvaJ

1
Nó có thể không liên quan, có vẻ như mã bạn đã thay đổi nhanh trong chế độ Per Phân tích và không bình thường. Có lẽ bạn có thể cô lập nó. Vì vậy, nếu bạn đăng trước và sau, sự khác biệt có thể là chế độ Phân tích Hiệu suất làm tốt hơn (vì bất kỳ lý do gì).
George Duckett

@GeorgeDuckett: Điểm hợp lệ. Tôi đang thêm mã.
ApoorvaJ

2
Có lẽ là một vấn đề bộ nhớ đệm. Có thể độ hoàn hảo đọc các biến giống như mã này, nhưng kích hoạt một số cơ chế lưu trữ, vì vậy dữ liệu của bản đồ luôn nằm trong bộ nhớ.
Tei

Câu trả lời:


1

Tôi đoán là chi phí thử / bắt cho mỗi lần lặp của một vòng lặp lồng có khả năng lớn đang giết chết hiệu suất của bạn và công cụ phân tích bằng cách nào đó đã ảnh hưởng đến chi phí xử lý ngoại lệ. Bạn có thể dễ dàng kiểm tra điều đó bằng cách loại bỏ xử lý ngoại lệ và chạy bình thường mà không cần trình lược tả.

Bạn chắc chắn không muốn thử / bắt vào bên trong một vòng lặp chặt chẽ. Bạn sẽ tốt hơn nhiều khi đảm bảo rằng bạn tính đến bất kỳ thứ gì có thể tạo ra ngoại lệ trong vòng lặp của bạn thông qua kiểm tra có điều kiện hoặc ít nhất là đặt toàn bộ thử / bắt xung quanh vòng lặp.


Sẽ thử, mặc dù tôi nghi ngờ hành vi này có liên quan đến bộ nhớ đệm.
ApoorvaJ

0

Tôi không quen thuộc với công cụ này, tôi cũng không phải là một chuyên gia về tối ưu hóa trình biên dịch, nhưng lý do có thể nằm trong dòng:

Tile adjacent = _tiles[(int)myTarget.CurrentTile.X + x, (int)myTarget.CurrentTile.Y + y];

Điều có thể xảy ra ở đây là một Tileliền kề được tạo trên ngăn xếp, với các giá trị được sao chép từ ô bên phải _tiles[](bạn không sử dụng tham chiếu nào trong C ++ và tôi không biết liệu chúng có tồn tại trong C # không). Do đó, bạn liên tục tạo và phá hủy một Tileđối tượng, và hơn nữa, bên trong 2 vòng lặp lớn lồng nhau. Mặc dù trên stack, điều này chắc chắn có thể ảnh hưởng đến tốc độ. Điều có thể xảy ra là chế độ Phân tích hoàn hảo đã nhận ra kịch bản này, phân bổ trước một Tileđối tượng bên ngoài vòng lặp lồng nhau và tiếp tục sử dụng nó thông qua chức năng, tránh chi phí tạo / hủy.


Tôi nhận ra vấn đề này sớm và đã khắc phục nó. Nó không giúp tôi tăng hiệu suất đáng chú ý và cũng không thay đổi tốc độ thần kỳ trên chế độ phân tích hoàn hảo.
ApoorvaJ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.