// pushproc merge proto and push msgs in batch. func (r *Room) pushproc(timer *itime.Timer, batch int, sigTime time.Duration) { var ( n int last time.Time p *proto.Proto td *itime.TimerData buf = bytes.NewWriterSize(int(proto.MaxBodySize)) ) log.Debug("start room: %d goroutine", r.id) td = timer.Add(sigTime, func() { select { case r.proto <- roomReadyProto: default: } }) for { if p = <-r.proto; p == nil { break // exit } else if p != roomReadyProto { // merge buffer ignore error, always nil p.WriteTo(buf) if n++; n == 1 { last = time.Now() timer.Set(td, sigTime) continue } else if n < batch { if sigTime > time.Now().Sub(last) { continue } } } else { if n == 0 { continue } } broadcastRoomBytes(r.id, buf.Buffer()) n = 0 // TODO use reset buffer // after push to room channel, renew a buffer, let old buffer gc buf = bytes.NewWriterSize(buf.Size()) } timer.Del(td) log.Debug("room: %d goroutine exit", r.id) }