Vẽ và cập nhật thứ tự trong đồ họa 3d


7

Trong tất cả các mẫu mã mà tôi đã xem, vòng lặp trò chơi trông giống như thế này:

while(true)
{
   InputAndUpdate();
   Draw();

   SwapBuffers();
}

Tuy nhiên, điều này không phá hủy sự song song giữa CPU và GPU? Sau cuộc gọi bộ đệm trao đổi, GPU sẽ ngồi yên trong khi CPU đang xử lý đầu vào và cập nhật. Sau đó, khi CPU đã hoàn thành việc đưa ra các lệnh vẽ, nó sẽ đợi cho đến khi GPU kết thúc kết xuất. Tại sao nó không được thực hiện như thế này? :

while(true)
{
   Draw(); //First issue the draw commands
   InputAndUpdate(); //Update while the GPU is busy rendering

   SwapBuffers(); //Now block and wait for the GPU to finish
}

Đây là điều mà tôi chưa bao giờ xem xét. +1 câu hỏi thú vị.
Vịt Cộng sản

Cái đầu tiên. Nếu thực hiện lần thứ hai, bạn tăng độ trễ đầu vào bằng một khung hình đầy đủ, có thể nhiều hơn tùy thuộc vào cách bạn nhận đầu vào ở vị trí đầu tiên và đồng bộ hóa V. Luôn đảm bảo không tăng độ trễ đầu vào
Peter lsted

Câu trả lời:


5

Điều này sẽ đúng trừ khi bạn có thêm bộ đệm trở lại để kết xuất (đệm đôi). Điều đó cho phép CPU tiếp tục và thực hiện công cụ mà không phải chờ đợi quá trình hoán đổi bộ đệm thực sự xảy ra (điều này thường xảy ra khi bạn không thể bắt đầu sửa đổi bộ đệm phía sau cho đến khi nó được sao chép vào bộ đệm trước mà không gặp rủi ro làm hỏng những gì bạn vừa kết xuất). Khi thực hiện cuộc gọi rút thăm hoặc trao đổi, yêu cầu sẽ đi vào bộ đệm các lệnh mà GPU có thể xử lý, cho phép CPU tiếp tục thực hiện các việc khác trong khi GPU chạy phía sau. Đây là cách phần cứng hiện đại có được song song. Tôi tin rằng D3D có giới hạn về số lượng khung hình bạn có thể hiển thị trước khi "Hoán đổi" sẽ chặn (bạn '

Khái niệm về một vòng lặp trò chơi như một trong những ví dụ trên là khá cũ. Với việc giới thiệu nhiều đơn vị xử lý trên CPU, bạn có khả năng thực hiện kết xuất trên một luồng trong khi thực hiện một số "cập nhật" trên một hoặc nhiều đơn vị khác. Bạn có thể muốn xem xét khái niệm hàng đợi công việc để giúp tối đa hóa toàn bộ sức mạnh xử lý CPU có sẵn.


-1

giải pháp mà bạn đã nói không làm cho CPU và GPU hoạt động bình thường, nó chỉ thay đổi thứ tự họ đang chờ đợi nhau, vì câu trả lời khác ngụ ý rút ra luôn đưa kết quả của nó vào một bộ đệm và sử dụng bộ trao đổi, bạn chỉ thay đổi những gì giám sát hoạt động với điều mới nhất được rút ra, để tận dụng hết tiềm năng của cả CPU và GPU, bạn phải gọi vẽ và cập nhật theo hai luồng khác nhau và sử dụng bộ đệm thứ hai cho CPU đang làm gì (để CPu tạo kết quả cập nhật trong bộ đệm 2 GPU đọc từ Bộ đệm 1 và khi CPU hoạt động với Bộ đệm 1 GPu, hãy sử dụng Bộ đệm 2 giống như bộ đệm trao đổi Sử dụng GPU để ngăn thay đổi trong khung đã được vẽ)


@Gajet bạn có đề xuất đệm đôi tất cả dữ liệu trò chơi ở phía cpu không?
Maik

một cái gì đó như thế, nhưng không phải tất cả dữ liệu, chỉ có những thứ có thể di chuyển. để cả GPU và CPU đọc từ CPUbuffer [0] và mỗi người thực hiện các phép tính của họ và lưu kết quả của họ vào bộ nhớ đệm / CPUBuffer [1] và khi cả hai công việc của họ kết thúc, họ bắt đầu đọc từ CPUBuffer [1]
Ali1S232

Điều này là quá mức cần thiết, không thực tế và kết thúc trong một cơ sở mã lộn xộn vì thực thể trò chơi sẽ có các thuộc tính bộ đệm và bình thường liên quan đến kết xuất. Có nhiều giải pháp dễ dàng hơn cho việc giao tiếp từ luồng trò chơi đến luồng kết xuất, như hàng đợi lệnh. -1 cho gợi ý này
Maik

đồng ý nhưng tôi nghĩ đó là cách duy nhất bạn có thể sử dụng đồng thời toàn bộ sức mạnh của CPU và GPU, ví dụ lệnh hàng đợi sẽ không hoạt động vì mỗi khi CPU hoàn thành dữ liệu khung tạo ra, nó sẽ cung cấp tất cả dữ liệu cho GPU và điều này có nghĩa là bạn Phải đợi CPU hoạt động xong và sau đó sao chép tất cả bộ đệm vào thời điểm đó, hãy nhớ rằng không có gì trên thế giới thay đổi trong khi GPU đang vẽ thế giới, vì vậy nếu bạn sử dụng hàng đợi lệnh thì sẽ không có thay đổi nào về CPU và GPU Chờ nhau.
Ali1S 232

Việc người ta đợi người kia kết thúc không có nghĩa là họ không chạy song song, họ làm, nhưng người đầu tiên hoàn thành phải chờ, vì kết xuất và cập nhật trò chơi phải được đồng bộ hóa. Nhưng họ hoàn toàn chạy song song. Vì vậy, đề xuất bộ đệm đôi giải quyết một vấn đề không có ở đó.
Maik
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.