Gim multi-utas - memperbarui, merender, dan cara membaginya


8

Dari pos StackOverflow (disarankan agar saya memindahkan ini):

Jadi, saya sedang mengerjakan mesin game, dan saya telah membuat kemajuan yang cukup bagus. Namun, mesin saya adalah single-threaded, dan keuntungan memisahkan memperbarui dan merender menjadi thread terpisah terdengar seperti ide yang sangat bagus.

Bagaimana saya harus melakukan ini? Mesin game berulir tunggal (secara konseptual) sangat mudah dibuat, Anda memiliki lingkaran tempat Anda memperbarui -> render -> sleep -> repeat. Namun, saya tidak bisa memikirkan cara yang baik untuk menghentikan pembaruan dan render terpisah, terutama jika saya mengubah tingkat pembaruan mereka (katakan saya melewati loop pembaruan 25x per detik, dan memiliki rendering 60fps) - bagaimana jika saya mulai memperbarui setengah melalui loop render, atau sebaliknya?


Jawaban:


6

Anda akan ingin menggandakan / melipatgandakan buffer setiap data yang diperlukan untuk rendering yang diubah dalam pass pembaruan. Dengan begitu Anda tidak akan merender dengan sesuatu yang sebagian telah diubah. Alasan Anda mungkin perlu melipatgandakan buffer adalah membutuhkan 1) salinan yang Anda perbarui, 2) salinan terakhir yang Anda perbarui sepenuhnya, dan 3) salinan yang saat ini digunakan untuk rendering yang tidak ingin Anda ubah .

Bagian tersulit mungkin mencari cara terbaik untuk mengatur data Anda untuk ini.


4

Situs web ini membahas masalah dan telah menerapkan solusi triple-buffer seperti yang disarankan Roger:

http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part1/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part2/ http: // blog. slapware.eu/game-engine/programming/multithreaded-renderloop-part3/ http://blog.slapware.eu/game-engine/programming/multithreaded-renderloop-part4/

Agak sulit untuk diimplementasikan, tetapi situs web memiliki sumber dan distribusi biner implementasi jika Anda tertarik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.