From ab06eb488de192686e58a6dfaab26a0a9255cc23 Mon Sep 17 00:00:00 2001 From: giongto35 Date: Wed, 5 Jun 2019 20:48:43 +0800 Subject: [PATCH] Optimize --- emulator/nes/apu.go | 4 +++- vpx-encoder/encoder.go | 20 +++++++++----------- webrtc/webrtc.go | 12 ++++++++---- worker/overlord.go | 5 ----- worker/room/room.go | 10 ++++++++-- 5 files changed, 28 insertions(+), 23 deletions(-) diff --git a/emulator/nes/apu.go b/emulator/nes/apu.go index 8a1a2aff..614fb77b 100644 --- a/emulator/nes/apu.go +++ b/emulator/nes/apu.go @@ -1,6 +1,8 @@ package nes -import "encoding/gob" +import ( + "encoding/gob" +) const frameCounterRate = CPUFrequency / 240.0 diff --git a/vpx-encoder/encoder.go b/vpx-encoder/encoder.go index a247bf69..531734cd 100644 --- a/vpx-encoder/encoder.go +++ b/vpx-encoder/encoder.go @@ -148,18 +148,16 @@ func (v *VpxEncoder) startLooping() { v.frameCount++ // Get Frame - for { - goBytes := C.get_frame_buffer(&v.vpxCodexCtx, &v.vpxCodexIter) - if goBytes.bs == nil { - break - } - bs := C.GoBytes(goBytes.bs, goBytes.size) - // if buffer is full skip frame - if len(v.Output) >= cap(v.Output) { - continue - } - v.Output <- bs + goBytes := C.get_frame_buffer(&v.vpxCodexCtx, &v.vpxCodexIter) + if goBytes.bs == nil { + continue } + bs := C.GoBytes(goBytes.bs, goBytes.size) + // if buffer is full skip frame + if len(v.Output) >= cap(v.Output) { + continue + } + v.Output <- bs if *config.IsMonitor { log.Println("Encoding time: ", time.Now().Sub(beginEncoding)) diff --git a/webrtc/webrtc.go b/webrtc/webrtc.go index 750c150c..2d6de54d 100644 --- a/webrtc/webrtc.go +++ b/webrtc/webrtc.go @@ -59,9 +59,9 @@ func NewWebRTC() *WebRTC { w := &WebRTC{ ID: uuid.Must(uuid.NewV4()).String(), - ImageChannel: make(chan []byte, 100), - AudioChannel: make(chan []byte, 1000), - InputChannel: make(chan int, 10), + ImageChannel: make(chan []byte, 30), + AudioChannel: make(chan []byte, 30), + InputChannel: make(chan int, 100), } return w } @@ -113,8 +113,12 @@ func (w *WebRTC) StartClient(remoteSession string, iceCandidates []string, width w.encoder = encoder log.Println("=== StartClient ===") + m := webrtc.MediaEngine{} + m.RegisterCodec(webrtc.NewRTPOpusCodec(webrtc.DefaultPayloadTypeOpus, 48000)) + m.RegisterCodec(webrtc.NewRTPVP8Codec(webrtc.DefaultPayloadTypeVP8, 90000)) + api := webrtc.NewAPI(webrtc.WithMediaEngine(m)) - w.connection, err = webrtc.NewPeerConnection(webrtcconfig) + w.connection, err = api.NewPeerConnection(webrtcconfig) if err != nil { return "", err } diff --git a/worker/overlord.go b/worker/overlord.go index 1e44ccda..39fc9430 100644 --- a/worker/overlord.go +++ b/worker/overlord.go @@ -2,8 +2,6 @@ package worker import ( "log" - "runtime" - "time" "github.com/giongto35/cloud-game/config" "github.com/giongto35/cloud-game/cws" @@ -107,9 +105,6 @@ func (h *Handler) RouteOverlord() { if room.IsPCInRoom(session.peerconnection) { h.detachPeerConn(session.peerconnection) } - start := time.Now() - runtime.GC() - log.Printf("GC takes %s\n", time.Since(start)) return cws.EmptyPacket }, diff --git a/worker/room/room.go b/worker/room/room.go index e8683739..16105efc 100644 --- a/worker/room/room.go +++ b/worker/room/room.go @@ -6,8 +6,10 @@ import ( "log" "math/rand" "os" + "runtime" "strconv" "sync" + "time" emulator "github.com/giongto35/cloud-game/emulator" "github.com/giongto35/cloud-game/webrtc" @@ -46,8 +48,8 @@ func NewRoom(roomID, gamepath, gameName string, onlineStorage *storage.Client) * roomID = generateRoomID() } log.Println("Init new room", roomID, gameName) - imageChannel := make(chan *image.RGBA, 100) - audioChannel := make(chan float32, emulator.SampleRate) + imageChannel := make(chan *image.RGBA, 30) + audioChannel := make(chan float32, 30) inputChannel := make(chan int, 100) // create director @@ -88,6 +90,10 @@ func NewRoom(roomID, gamepath, gameName string, onlineStorage *storage.Client) * log.Printf("Room %s started", roomID) director.Start([]string{path}) log.Printf("Room %s ended", roomID) + + start := time.Now() + runtime.GC() + log.Printf("GC takes %s\n", time.Since(start)) }(path, roomID) return room