想利用Unity來完成SSVEP實驗,具體說就是通過Unity創建一個Panel,Panel上有5個圖片,想要使每個圖片實作閃爍,即由白變為黑,再由黑變為白,但是每個圖片的閃爍時間不一樣,分別為0.075ms,0.066ms,0.058ms....,利用多執行緒+執行緒沉睡來實作之后發現閃爍時間和預設的不一樣,請問該怎么解決?語言描述能力不好,貼上代碼,望大神指點
public class TestSSVEP : MonoBehaviour
{
private List<StimulateInfo> stimulateLists = new List<StimulateInfo>();
/// <summary>
/// 每個方塊的位置,其實就是四張圖片
/// </summary>
public List<Image> imageLists;
/// <summary>
/// 頻閃頻率,自己規定的閃爍時間
/// </summary>
public List<float> stimulateFrenquencyLists;
private List<Thread> threadList = new List<Thread>();
private void Start()
{
Initial();
}
/// <summary>
/// 初始化方塊,確定其頻閃頻率以及所對應的位置
/// </summary>
private void Initial()
{
for (int i = 0; i < imageLists.Count; i++)
{
StimulateInfo stimulate = new StimulateInfo(imageLists[i], stimulateFrenquencyLists[i]);
stimulateLists.Add(stimulate);
}
foreach (StimulateInfo item in stimulateLists)
{
Thread newThread = new Thread(ChangeColor);
newThread.Start(item);
threadList.Add(newThread);
}
}
/// <summary>
/// 進行頻閃
/// </summary>
/// <param name="o"></param>
private void ChangeColor(object o)
{
#region 執行緒沉睡
StimulateInfo stimulate = o as StimulateInfo;
while (true)
{
//ThreadCrossingHelper是一個執行緒交叉訪問助手,用于在非主執行緒中使用UnityAPI
ThreadCrossingHelper.Instance.ExecuteOnMainThread(() =>
{
stimulate.Img.color = Color.black;
});
Thread.Sleep((int)(Math.Round(1.0f / stimulate.FlickerFrequency / 2, 3) * 1000));
ThreadCrossingHelper.Instance.ExecuteOnMainThread(() =>
{
stimulate.Img.color = Color.white;
});
Thread.Sleep((int)(Math.Round(1.0f / stimulate.FlickerFrequency / 2, 3) * 1000));
}
#endregion
#region 協程
#endregion
}
private void OnApplicationQuit()
{
for (int i = 0; i < threadList.Count; i++)
{
threadList[i].Abort();
imageLists[i].color = Color.black;
}
}
}
uj5u.com熱心網友回復:
代碼中thread.sleep的引數的單位是毫秒喲。即使你代碼沒問題,螢屏的重繪率也跟不上啊。0.075ms換算成螢屏重繪率是多少呢?

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/9350.html
標籤:Unity3D
上一篇:如何學習51單片機
