2010-11-13 12 views
8

Tôi đang sử dụng SDL cho các phần xem của dự án trò chơi của tôi là gì. Và tôi muốn xử lý các sự kiện nhấn phím mà không làm gián đoạn chuỗi chính. Vì vậy, tôi quyết định chạy một vòng lặp vô hạn trong một chuỗi xem khác để bắt bất kỳ sự kiện nào và thông báo cho chuỗi chính. Tuy nhiên, tôi không chắc chắn rằng đây là tốt nhất vì điều này có thể gây ra một khối lượng công việc và giảm hiệu suất hệ thống? Có cách nào tốt hơn để làm những việc như thế này không? Cảm ơn.Cách tốt nhất để xử lý sự kiện với SDL/C++

Trả lời

7

Đừng bận tâm với chuỗi khác. Vấn đề ở đây là gì?

Chủ đề chính của bạn là gì? Tôi tưởng tượng một cái gì đó như thế này:

  1. Cập nhật logic
  2. Render
  3. Chuyển đến 1

Nếu bạn nhận đầu vào sau (hoặc trong) các chu kỳ cập nhật sau đó bạn phải đợi cho đến khi cập nhật tiếp theo trước khi bạn sẽ thấy hiệu ứng. Điều này cũng đúng trong khi hiển thị. Bạn cũng có thể chỉ cần kiểm tra đầu vào trước khi chu kỳ cập nhật và làm tất cả đơn giản.

  1. Input
  2. Cập nhật logic
  3. Render
  4. Chuyển đến 1

Multithreading giành gì ở đây và chỉ làm tăng tính phức tạp.

Để đọc thêm, hãy xem Christer Ericson's blog post about input latency (anh ấy là giám đốc công nghệ cho nhóm tạo nên Chiến tranh).

+0

Điều đó và đầu vào không an toàn chỉ. Nhiều hướng dẫn SDL nêu rõ điều này. – new123456

5

Và tôi muốn xử lý các sự kiện nhấn phím mà không làm gián đoạn chuỗi chính.

SDL vốn không phải là khung làm gián đoạn hoặc sự kiện. IO xảy ra bằng cách đọc các sự kiện ngoài hàng đợi sự kiện bằng cách gọi SDL_WaitEvent hoặc SDL_PollEvent. Điều này phải xảy ra trong chủ đề "chính", được gọi là SDL_SetVideoMode.

Điều đó không có nghĩa là bạn không thể sử dụng nhiều luồng, và có lý do chính đáng để làm như vậy, ví dụ, nó có thể đơn giản hóa giao tiếp mạng nếu nó không phải dựa vào vòng lặp sự kiện SDL. Nếu bạn muốn mô phỏng xảy ra trong một chuỗi riêng biệt, thì nó có thể chuyển thông tin qua lại thông qua các đối tượng được chia sẻ được đồng bộ hóa. Đặc biệt, bạn luôn có thể đặt các sự kiện vào hàng đợi sự kiện SDL một cách an toàn từ bất kỳ chuỗi nào.