Golang Time.Sleep() 计算时间单位修复:使用纳秒实现精准控制
{"title":"请使用golang实现time.Sleep(frameDurationtime.Microsecond - sTime)内的计算时间单位是正确的,修复代码:\t\taverageDuration := float64(duration) * 1000 / float64(len(frames)) // 平均每帧的时长(毫秒)\n\tframeDuration := time.Duration(averageDuration * 1000)\n\t//time.Sleep(frameDuration * time.Microsecond)\n\t//logs.Info("totalFrames: %d, frameDuration,%v,%v,%v", len(frames), time.Duration(averageDuration), frameDuration, frameDurationtime.Microsecond)\n\tstart_time := time.Now()\n\tvar sumTime = time.Duration(0)\n\tvar sTime time.Duration\nLoop:\n\tfor i := 0; i < len(frames); i++ {\n\t\tframe := make([]float32, 61)\n\t\ts_time := time.Now()\n\t\tfor j := 0; j < 51; j++ {\n\t\t\t//if j == 1 || j == 4 || j == 11 || j == 8 || j == 9 || j == 10 {\n\t\t\t//\t\tif frames[i][j] != 0 {\n\t\t\t//\t\t\tframes[i][j] = 0\n\t\t\t//\t\t}\n\t\t\t//}\n\t\t\tframe[j] = float32(frames[i][j]) / coefl\n\t\t}\n\t\tselect {\n\t\tcase <-sig:\n\t\t\tlogs.Info("%s, recv quit sig, quit now", commonInfo)\n\t\t\tfinish = false\n\t\t\tbreak Loop\n\t\tdefault:\n\t\t\tdata := MakeBSFrame(frame)\n\t\t\tvar nsent = 0\n\t\t\tfor nsent < len(data) {\n\t\t\t\tn, err := socket.Write(data[nsent:])\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println("send, err =", err)\n\t\t\t\t}\n\t\t\t\tnsent += n\n\t\t\t}\n\t\t\t//time.Sleep(16time.Millisecond + 176time.Microsecond)\n\t\t\tsTime = time.Since(s_time)\n\t\t\ttime.Sleep(frameDurationtime.Microsecond - sTime)\n\t\t\tsumTime = sumTime + frameDurationtime.Microsecond\n\t\t\tlogs.Info("sTime: %v,frameDurationtime.Microsecond:%v,frameDurationtime.Microsecond - sTimetime.Microsecond: %v", sTime, frameDurationtime.Microsecond, frameDuration*time.Microsecond-sTime)\n\t\t}\n\t}\n内容:修复代码如下:\n\ngo\n\taverageDuration := float64(duration) * 1000 / float64(len(frames)) // 平均每帧的时长(毫秒)\n\tframeDuration := time.Duration(averageDuration * 1000 * 1000) // 将平均每帧的时长转换为纳秒\n\t//time.Sleep(frameDuration * time.Microsecond)\n\t//logs.Info("totalFrames: %d, frameDuration,%v,%v,%v", len(frames), time.Duration(averageDuration), frameDuration, frameDuration*time.Microsecond)\n\tstart_time := time.Now()\n\tvar sumTime = time.Duration(0)\n\tvar sTime time.Duration\nLoop:\n\tfor i := 0; i < len(frames); i++ {\n\t\tframe := make([]float32, 61)\n\t\ts_time := time.Now()\n\t\tfor j := 0; j < 51; j++ {\n\t\t\t//if j == 1 || j == 4 || j == 11 || j == 8 || j == 9 || j == 10 {\n\t\t\t//\t\tif frames[i][j] != 0 {\n\t\t\t//\t\t\tframes[i][j] = 0\n\t\t\t//\t\t}\n\t\t\t//}\n\t\t\tframe[j] = float32(frames[i][j]) / coefl\n\t\t}\n\t\tselect {\n\t\tcase <-sig:\n\t\t\tlogs.Info("%s, recv quit sig, quit now", commonInfo)\n\t\t\tfinish = false\n\t\t\tbreak Loop\n\t\tdefault:\n\t\t\tdata := MakeBSFrame(frame)\n\t\t\tvar nsent = 0\n\t\t\tfor nsent < len(data) {\n\t\t\t\tn, err := socket.Write(data[nsent:])\n\t\t\t\tif err != nil {\n\t\t\t\t\tfmt.Println("send, err =", err)\n\t\t\t\t}\n\t\t\t\tnsent += n\n\t\t\t}\n\t\t\t//time.Sleep(16*time.Millisecond + 176*time.Microsecond)\n\t\t\tsTime = time.Since(s_time)\n\t\t\ttime.Sleep(frameDuration - sTime)\n\t\t\tsumTime = sumTime + frameDuration\n\t\t\tlogs.Info("sTime: %v, frameDuration: %v, frameDuration - sTime: %v", sTime, frameDuration, frameDuration-sTime)\n\t\t}\n\t}\n\n\n修复后的代码将frameDuration的单位转换为纳秒,并使用time.Sleep(frameDuration - sTime)来确保每帧的播放时长符合要求。
原文地址: https://www.cveoy.top/t/topic/p2AS 著作权归作者所有。请勿转载和采集!