使用一個線程從攝像頭或者其他設備循環讀取圖像數據寫入鏈表,另一個線程從鏈表循環讀取數據并做相應的特效處理,由于寫入的速度比讀取的快,最終必然會因為寫入過快導致線程讀寫一幀而引發沖突和數據幀正常數據幀被覆蓋。最好使用共享內存,以節省拷貝的時間。
1.一個懶惰的處理方式是,使用線程鎖當讀寫沖突時,讓讀取線程向前快速移動若干幀,移動幀數和寫入的速度有一定關系,這能處理正確沖突,但會丟幀,而且跳幀過于頻繁體驗會變差。
2.如果寫線程遇到讀線程沖突,也可以阻塞,等若干時間一樣也會導致掉幀。
3.一個好的方法是一方面降低寫入,比如寫入時加一個過濾器,如果圖像變化比較小,可以不跳過,一方面提高讀取處理速度,使兩者速度接近,以減少沖突,這樣在遇到沖突需要跳幀時能減少丟幀。如果能使用信號量每隔一段時間讀寫對齊一次就很好。
4.一個不丟幀的方式,從攝像頭獲取的數據分一大一小兩個buffer,大的用于直接顯示,不處理不減幀,小的用于特效處理,處理一幀,發送一幀,生成標定數據狗,貓,人然后把這些標注按大小比例合并到原始圖上。