2012-06-22 30 views
5

[[EDIT 2x] Tôi nghĩ rằng tôi đã viết sai câu hỏi ban đầu của tôi, vì vậy tôi đã scooted nó xuống dưới đây và viết lại chính xác những gì tôi đang cố gắng để có được, cho độc giả trong tương lai. ]Thời gian theo dõi Chi tiêu trong Debugger

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~
[Câu hỏi mới, sáng bóng, rõ ràng với từ ngữ tốt hơn]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~

Tôi có vòng lặp đang chạy cho khung mô phỏng/chơi trò chơi. Vòng lặp này có một số nơi trong đó nó cần xác định bao nhiêu thời gian - trong thực tế - đã trôi qua, để logic trong những vị trí đặc biệt này - đặc biệt, Rendering và Updating - có thể hoạt động chính xác. Nó có tùy chọn là một Bước Thời gian Cố định (unfixed[update/render] là sai) hay không.

Sự cố xảy ra khi việc gỡ lỗi dựa trên Breakpoint được thực hiện ở bất kỳ điểm nào trong ứng dụng, vì nó sử dụng đồng hồ bấm giờ để tìm ra số lượng thời gian thực đã trôi qua (với mục đích vật lý và hoạt ảnh di chuyển với tốc độ thực tế) dựa trên số lượng khung mà máy tính có thể thoát ra).

Nó trông giống (khoảng) như thế này, sử dụng nhiều stopwatches cho mỗi 'phần' của vòng lặp ứng dụng mà cần phải biết bao nhiêu thời gian đã trôi qua kể từ đó là một phần 'cuối cùng xảy ra:

while (RunningTheSimulation) { 
    /* ... Events and other fun awesome stuff */ 

    TimeSpan updatedifference = new TimeSpan(updatestopwatch.ElapsedTicks); 

    if (unfixedupdate || updatedifference > updateinterval) { 

     Time = new GameTime(updatedifference, 
            new TimeSpan(gamestopwatch.ElapsedTicks)); 
     Update(Time); 
     ++updatecount; 
     updatestopwatch.Reset(); 
     updatestopwatch.Start(); 
    } 

    TimeSpan renderdifference = new TimeSpan(renderstopwatch.ElapsedTicks); 

    if (unfixedrender || renderdifference > renderinterval) { 

     Time = new GameTime(renderdifference, 
           new TimeSpan(gamestopwatch.ElapsedTicks)); 
     Render(Time); 
     ++rendercount; 
     renderstopwatch.Reset(); 
     renderstopwatch.Start(); 

    } 
} 

một số thông tin về các biến:

updatestopwatch là một Stopwatch cho thời gian bên ngoài của Update() chức năng,

renderstopwatch là một Stopwatch cho thời gian bên ngoài Render() chức năng, và

gamestopwatch là một Stopwatch cho tổng thời gian trôi qua trong những mô phỏng/bản thân trò chơi.

Sự cố phát sinh khi tôi gỡ lỗi mọi nơi trong ứng dụng. Vì đồng hồ bấm giờ đang đo thời gian thực, Mô phỏng sẽ hoàn toàn bị loại bỏ bởi bất kỳ loại gỡ lỗi dựa trên Breakpoint nào vì Đồng hồ bấm giờ sẽ tiếp tục đếm thời gian, cho dù tôi có đang gỡ lỗi ứng dụng hay không. Tôi không sử dụng Đồng hồ bấm giờ để đo lường hiệu suất: Tôi đang sử dụng chúng để theo dõi thời gian giữa các lần xuất hiện lại của Cập nhật, Hiển thị và các sự kiện khác như các sự kiện được minh họa ở trên. Điều này cực kỳ bực bội khi tôi breakpoint và phân tích và sửa lỗi trong Update(), nhưng sau đó Render() thời gian là như vậy hoàn toàn tắt mà bất kỳ hiển thị các kết quả của mô phỏng là vengefully đá vào mặt.

Điều đó nói rằng, khi tôi ngừng gỡ lỗi hoàn toàn, rõ ràng không phải là vấn đề, nhưng tôi có rất nhiều công việc cần làm và tôi sẽ gỡ lỗi trong một thời gian dài, vì vậy hãy giả vờ rằng điều này không bất tiện sẽ không hoạt động, thật không may. = [

Tôi đã xem Bộ đếm hiệu suất, nhưng dường như tôi không thể xoay quanh cách làm cho chúng hoạt động trong ngữ cảnh của những gì tôi đang cố gắng làm: Render và Update có thể chứa bất kỳ số lượng tùy ý nào mã (chúng cụ thể cho bất kỳ mô phỏng nào đang chạy trên đầu trang của vòng lặp while này), điều này có nghĩa là tôi không thể thực hiện một cách đều đặn một số PerformanceCounter.Increment() cho từng thành phần của vòng lặp.

Tôi sẽ tiếp tục chú ý xung quanh System.Diagnostics và các không gian tên .NET khác, nhưng cho tới giờ tôi đã bật lên khoảng trống về cách "bỏ qua" thời gian dành cho Debugger đính kèm ...

Bất kỳ ai có bất kỳ ý tưởng hoặc thông tin chi tiết nào?

[[EDITS 5x] Đã sửa lỗi chính tả và đảm bảo định dạng trên mọi thứ đều chính xác. Xin lỗi vì điều đó. ]

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[Câu hỏi ban đầu, ít rõ ràng]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Tôi có vòng lặp không đổi chạy trong ứng dụng C#, mà tôi gỡ lỗi mọi lúc. Tôi hiện đang sử dụng Đồng hồ bấm giờ, nhưng tôi có thể sử dụng bất kỳ cơ chế nào khác để theo dõi thời gian trôi qua. Vấn đề của tôi bắt đầu khi tôi làm những việc như Breakpoints sử dụng ở đâu đó trong vòng lặp này (kèm theo trong một điển hình while (true) { ... }:

if (unfixedupdate || updatedifference > updateinterval) 
{ 
    Time = new GameTime(updatedifference, 
         new TimeSpan(gamestopwatch.ElapsedTicks)); 
    Update(Time); 
    ++updatecount; 
    updatestopwatch.Reset(); 
    updatestopwatch.Start(); 
} 

Các biện pháp thời gian riêng của mình tốt, nhưng nó đo thời gian thực thực tế - bao gồm bất kỳ thời gian tôi dành gỡ lỗi. Điều này có nghĩa là nếu tôi chui vào trong vòng 17 giây sau updatestopwatch.Reset(), điều này được kết hợp vào vòng lặp của tôi và - ít nhất 1 lần chạy lại vòng lặp đó - tôi phải xử lý thêm thời gian tôi bỏ ra trong thời gian thực bao thanh toán vào tất cả các tính toán của tôi

Có cách nào tôi có thể móc vào trình gỡ rối để biết khi nào nó đóng băng ứng dụng, vì vậy tôi có thể đếm er-đo thời gian và trừ nó cho phù hợp? Như được gắn thẻ, tôi đang sử dụng .NET và C# cho điều này, nhưng bất cứ điều gì liên quan đến Visual Studio cũng có thể giúp tôi đi đúng hướng.

[EDIT] Để cung cấp thêm thông tin, tôi đang sử dụng một số đồng hồ bấm giờ (để cập nhật, hiển thị và một vài sự kiện khác trong hàng đợi thông báo khác). Nếu tôi đặt một điểm ngắt bên trong Update(), hoặc trong bất kỳ phần nào khác của ứng dụng, các đồng hồ bấm giờ sẽ đo chính xác Thời gian thực được sử dụng giữa các ứng dụng này. Điều này bao gồm thời gian tôi chi tiêu gỡ lỗi các thành phần hoàn toàn không liên quan khác nhau của ứng dụng của tôi được gọi là hạ lưu của Update() hoặc Render() hoặc Input() v.v. Rõ ràng thời gian của mô phỏng (được kiểm soát bởi tham số GameTime được truyền vào các chức năng Cập nhật, Hiển thị, v.v.) hoạt động bình thường nếu, ngay cả khi CPU chỉ mất 13 ms để hoàn thành chức năng cập nhật, tôi dành 13 thêm giây gỡ lỗi (xem biến và sau đó Tiếp tục với mô phỏng); vấn đề là tôi sẽ thấy các đồng hồ bấm giờ khác đột nhiên tính 13 thêm giây. Nếu nó vẫn không có ý nghĩa, tôi sẽ kêu vang một lần nữa.

+0

Bạn có thể mô tả những gì bạn hy vọng sẽ làm với dữ liệu hiệu suất này không? Chi phí của trình gỡ lỗi có thể làm nhiễu loạn các phép đo hiệu suất theo những cách tinh tế hơn là chỉ thêm thời gian chờ giao diện người dùng vào các trường hợp Đồng hồ bấm giờ. Nếu bạn đang cố gắng tối ưu hóa vòng lặp này, bạn nên sử dụng trình gỡ lỗi khi thực hiện các phép đo của mình. –

+0

Bạn có thể không có breakpoint của bạn sau khi Update() nhưng trước khi các cuộc gọi updatestopwatch.Reset()? – davenewza

+0

Tôi có nhiều hơn chỉ là vòng lặp cập nhật; có một vòng lặp Render và các sự kiện khác bị bắt và sử dụng. Vì vậy, đặt Breakpoint ở một nơi khác không thực sự là một giải pháp. –

Trả lời

2

Sử dụng bộ đếm hiệu suất để thay thế. Quá trình CPU thời gian nên cung cấp cho một chỉ số tốt (nhưng không chính xác như một đồng hồ bấm giờ thời gian thực) và không nên can thiệp vào gỡ lỗi.

+0

Tôi chưa bao giờ biết về Bộ đếm hiệu suất. Tôi sẽ cho họ một thử và quay trở lại và đánh dấu một câu trả lời nếu ti làm việc ra ngoài. Cảm ơn sự giúp đỡ của bạn. –

+0

@ ThePhD: Một lợi ích khác là nó nhận được thời gian CPU thực tế ngay cả khi phần còn lại của hệ thống đang được tải. Thời gian thực không thực sự có ý nghĩa nhiều trong những trường hợp đó :) – leppie

+1

@ ThePhD: Bạn có thể thấy một số mã mẫu ở đây: https://github.com/leppie/IronScheme/blob/master/IronScheme/IronScheme/Runtime/Builtins.cs#L519 – leppie

0

Một giải pháp khả thi cho việc này là viết người dân địa phương của bạn (hoặc bất kỳ dữ liệu nào bạn đang cố gỡ lỗi) vào đầu ra bằng cách sử dụng Debug.WriteLine().

+0

Đây là một việc tốt để làm, cho dù tôi có phải là điểm dừng hay không, và tôi làm điều đó.Tôi chỉ cần có thể biết bao nhiêu thời gian là tính toán chi tiêu làm những việc như Update (hoặc Render hoặc bất kỳ thành phần nào khác của vòng lặp chính), mà không có thêm thời gian gỡ lỗi được gắn vào nó. –

Các vấn đề liên quan