2013-08-14 77 views
5

Tôi hiện đang học Haskell vì vui vì tôi luôn muốn xem cách bạn thiết kế chương trình theo nghĩa không định hướng đối tượng.GC tạm dừng trong Haskell cho các ứng dụng thời gian thực mềm

Nhưng tôi cũng nghiên cứu xem có hữu ích khi sử dụng Haskell cho công cụ trò chơi hay không. Mối quan tâm chính của tôi là GC.

Tôi biết rằng GHC là đồng thời và luồng cục bộ.

Tôi đọc rằng GC thường tạm dừng trong khoảng từ 1ms-5ms. Tôi biết rằng nó là khác nhau cho mỗi chương trình, nhưng tôi vẫn cần một số con số để thực hiện một số tính toán.

Giả sử trò chơi của tôi chạy ở 60fps có nghĩa là mọi khung hình cần 0.016666667s quyền tính? Việc tạm dừng gc sẽ tăng số này lên ~0.017666667 dẫn đến 56fps. Do đó, mất hiệu suất là ~4fps hoặc 7%. Đối với tôi đó là một hit khá lớn.

Bây giờ tôi đang đếm trên GC địa phương chủ đề vì tôi muốn công cụ trò chơi của tôi được đồng thời cao.

Tôi muốn sử dụng mô hình Diễn viên cho mã trò chơi để mọi thực thể sẽ có bộ nhớ riêng. Nếu tôi đúng, điều này có nghĩa là mọi thực thể đều có bộ sưu tập rác của địa phương.

Nhưng vấn đề chính vẫn là công cụ trò chơi với vòng lặp chính của nó. Ngẫu nhiên fps giảm 7% là khá lớn.

Tính toán của tôi có đúng không? Bạn có thể cho tôi bất kỳ đề xuất nào không?

+2

Bạn giả định rằng gc được chạy ở mỗi phép tính khung. Điều này có lẽ là sai. – Nicolas

+0

@Nicolas Tôi không cho rằng nó sẽ chạy mọi khung hình. Tôi nghĩ rằng nó sẽ chạy tại một số điểm và sau đó tạm dừng thread địa phương của nó. Nhưng tạm dừng 1ms kết quả ở tốc độ 60 khung hình/giây khi giảm 4fps. Tôi không chắc chắn khi nó chạy, tôi nghĩ rằng có một số thông số mà tôi có thể tinh chỉnh mặc dù. Tôi vẫn hy vọng rằng tôi sai. –

+1

Không, bạn đã thêm 1ms vào mỗi phép tính khung. Nó có nghĩa là bạn giả định rằng tại * mỗi khung *, bạn mất 1ms do GC. Theo tính toán của bạn, GC được gọi là 56 lần mỗi giây và sử dụng 1ms để chạy. – Nicolas

Trả lời

2

Tính toán của bạn bị thiên vị.

Bạn nói đúng: 60 khung hình/giây = 1 khung hình 0,01766667 giây.

Giả sử (trường hợp xấu nhất) rằng GC tạm dừng chương trình trong 5ms. Mỗi lần GC chạy, bạn sẽ mất 0,005. Nó có nghĩa là mỗi lần GC được gọi, bạn sẽ mất 0.333 khung hình/giây.

Để có được tính toán chính xác, chúng tôi cần biết tần suất GC được gọi, mà tôi không biết và chắc chắn liên kết với lượng dữ liệu do chương trình của bạn tạo ra.

+0

Cảm ơn, tôi chỉ không biết tôi sẽ sản xuất bao nhiêu rác để tôi không thể dự đoán được tạm dừng lần. Điều này là bằng cách nào đó xấu nếu tôi bắt đầu ngay bây giờ để viết động cơ của tôi trong Haskell và tôi thấy trong 2 năm rằng thời gian tạm dừng là không thể chấp nhận sau đó tôi đã chỉ mất 2 năm thời gian của tôi. (Sắp xếp) –

+0

Sau đó, sử dụng C++ hoặc viết một bài kiểm tra tải đầu tiên bạn làm. – kqr

+2

@MaikKlein Bạn nên xem bài phát biểu của QuakeCon 2013 của John Carmak. Ông nói về chính xác vấn đề này và đặt ra một giải pháp khả thi. Ông mô tả thực hiện ý tưởng của mình trong C + + nhưng tôi tin rằng bạn có thể làm những gì ông mô tả trong Haskell bằng cách quản lý kết cấu vv thông qua C con trỏ nước ngoài. – asm