1

Goをいじり始めてから約1週間になりますが、非常に感銘を受けています。しかし、まだ頭を悩ませることができないいくつかの問題があります。

現在の主な問題は、接続処理コードが機能しているときに、接続ループとは独立したメインゲームループを追加したいということです。どのようにこれを行うのですか?

package main

import (
  "fmt"
  "net"
  "strconv"
  "time"
  "galaxy"
)

const PORT = 5555

func main() {
  playerFactory := galaxy.NewPlayerFactory()

  server, err := net.Listen("tcp", ":" + strconv.Itoa(PORT))
  if server == nil {
    panic("listen failed: " + err.Error() + "\n")
  } else {
    defer server.Close()
  }

  // main loop  
  go func() {
    for {   
      // entity updates
      playerFactory.Update()
    }
  }() // adding this just blocks everything after the goroutine

  // connection handling
  for {
    conn, err := server.Accept()
    if err != nil {
      fmt.Printf("client error: %s\n", err.Error())
    } else {
      playerFactory.CreatePlayer(conn)
    }
  }

}

現在の記述方法では、メインループが実行されますが(これは私が追加しようとしている部分です)、接続処理コードは無視されます。これは、チャネルを使用して制御を渡す場所ですか?解決策は、経験豊富なGoプログラマーには明らかだと思います。あなたの回答を楽しみにしています。

4

1 に答える 1

4

CPUを解放しない場合playerFactory.Update()(たとえば、リソースをブロックすることによって)、他のゴルーチンが実行される保証はありません。

GOMAXPROCSを変更しようとすることもできますが、それはCPUの数によって異なり、他の非ブロッキングゴルーチンで問題が後で再発する可能性があります。

そして、ゲームループが中断することなく実行される理由はわかりません。最も頻繁なケースは、定期的に何かをしなければならない場合です。

この場合、コードは次のようになります。

  // main loop  
  go func() {
     timer := time.Tick(100 * time.Millisecond)
     for now := range timer {   
         // entity updates (you could use now for physic engine calculs)
         // this is called every 100 millisecondes
         playerFactory.Update()
     }
  }()
于 2012-12-08T09:09:51.170 に答える