Đây là một bài viết cũ nhưng nó vẫn bật lên vì vậy muốn thêm 2 xu của tôi vào đây.
Danh sách đầu tiên dữ liệu nên được lưu trữ trong UI / luồng hiển thị so với luồng logic. Trong luồng UI, bạn có thể bao gồm lưới 3d, kết cấu, thông tin ánh sáng và bản sao dữ liệu vị trí / xoay / hướng.
Trong luồng logic trò chơi, bạn có thể cần kích thước đối tượng trò chơi ở chế độ 3d, nguyên thủy giới hạn (hình cầu, khối lập phương), dữ liệu lưới 3d đơn giản hóa (ví dụ như va chạm chi tiết), tất cả các thuộc tính ảnh hưởng đến chuyển động / hành vi, như vận tốc của đối tượng, tỷ lệ xoay, v.v. và dữ liệu vị trí / xoay / hướng.
Nếu bạn so sánh hai danh sách, bạn có thể thấy rằng chỉ sao chép dữ liệu vị trí / xoay / hướng cần được truyền từ logic sang luồng UI. Bạn cũng có thể cần một số loại id tương quan để xác định đối tượng trò chơi mà dữ liệu này thuộc về.
Làm thế nào bạn làm điều đó phụ thuộc vào ngôn ngữ bạn đang làm việc với. Trong Scala, bạn có thể sử dụng Bộ nhớ giao dịch phần mềm, trong Java / C ++ một số loại khóa / đồng bộ hóa. Tôi thích dữ liệu bất biến vì vậy tôi có xu hướng trả về đối tượng bất biến mới cho mỗi bản cập nhật. Đây là một chút lãng phí bộ nhớ nhưng với máy tính hiện đại, nó không phải là một vấn đề lớn. Tuy nhiên, nếu bạn muốn khóa cấu trúc dữ liệu chia sẻ, bạn có thể làm điều đó. Kiểm tra lớp Exchanger trong Java, sử dụng hai hoặc nhiều bộ đệm có thể tăng tốc mọi thứ.
Trước khi bạn bắt đầu chia sẻ dữ liệu giữa các luồng, hãy tính xem bạn cần truyền bao nhiêu dữ liệu. Nếu bạn có một octree phân vùng không gian 3d của bạn và bạn có thể thấy 5 đối tượng trò chơi trong tổng số 10 đối tượng, ngay cả khi logic của bạn cần cập nhật tất cả 10 bạn chỉ cần vẽ lại 5 đối tượng bạn đang nhìn thấy. Để đọc thêm, hãy xem blog này:
http://gameprogrammingpotypes.com/game-loop.html
Đây không phải là về đồng bộ hóa nhưng nó cho thấy cách logic trò chơi được tách khỏi màn hình và những thách thức bạn cần vượt qua (FPS). Hi vọng điêu nay co ich,
dấu