現在、リアルタイムグラフィックスアプリケーションのレンダリング部分にプロデューサーコンシューマーモデルを使用しています。コンシューマーは、キュー内のデータを継続的に検索します(無限ループ)。ただし、これによりシミュレーションがメインループの同期から外れる可能性があるのではないかと心配しています。これは、高速生産者と低速消費者の問題だと思います。シミュレーションが一定の時間に制限されているという事実によってさらに複雑になっています。
質問-これをすべてバランスを保ち、消費者が終了するのに十分な時間を確保するだけでなく、現在のフレームのレンダリングが完了する前にシミュレーションが次のフレームに移動しないようにするための最良の方法は何ですか(または少なくともこれを検出して次のフレームのレンダリングをスキップする-またはレンダリングされている現在のフレームを中断する)現在、各コンシューマーが終了した後、中断して参加しています
2番目の質問:以下のコードを見ると、現在、キューにレンダリングジョブを追加した後、割り込みと参加を呼び出していることがわかります。これにより、スレッドは操作を完了し、割り込みに応答する必要があります。終わった時に。その後、interrupt_allとjoin_allが呼び出された後、スレッドプール内のスレッドを再利用するにはどうすればよいですか?(つまり、drawNextFrameを再度呼び出す場合)
プロデューサーは実行のメインスレッドの一部です(これは何にも影響しないと思います)
pseudo code:
void renderSystem::init()
create queue to hold work;
create consumer threads of type RenderConsumer set to watch our queue;
add threads to thread_pool of consumers called 'RenderThreads'
void renderSystem::drawNextFrame()
for each thread in 'RenderThreads' divy up work;
add work assignment to queue;
//RenderThreads will now successfully start pulling data from our queue
renderThreads.interupt_all();
renderThreads.join_all();
int main()
renderer = renderSystem class;
renderer.init()
while(not_gameover)
renderer.drawNextFrame();
doOtherCoolStuff();
profit(?)
return(0)
コンシューマークラスを確認する必要がある場合は、以下を参照してください。
pseudo code:
RenderConsumer::operator () ()
while(true)
try to dequeue from queue
//digest any packet we get
for each ( pixel in packet )
computePrettyStuff()
//we are now done with packet that we got
this_thread::interruption_point();
私はこれを簡単で素早く消化できるようにしようとしました、お時間をいただきありがとうございます