921

921

# 研究目的

  • ゲームの通信方式にはクライアントサーバ方式とp2p方式がある
  • データの安全性やチート対策などでクライアントサーバ方式が主流
  • サーバに接続してマルチプレイなどのデータ同期を実現させているため、低速
  • 高速かつ安全に通信を行たい
    • 並列分散フレームワークChristieがある
    • Christieを利用してp2pで通信を行う
  • ゲーム開発で主に使用されているUnityに対応するためにChristieをC#へ書き換えを行う

# 今週の進捗

  • RemoteDGのバグをいくつか修正できた
    • 自作クラスではなくstirngで試してみたところ送信できた
      • ソケット部分は問題なさそうMessagePackがやはり原因
    • 次から次へとバグが出てくる…

# これまでにあったバグ

MessagePackでうまくシリアライズできない問題

1
2
3
4
MessagePack.MessagePackSerializationException: Failed to serialize System.Object value.
 ---> System.TypeInitializationException: The type initializer for 'FormatterCache`1' threw an exception.
 ---> System.TypeInitializationException: The type initializer for 'FormatterCache`1' threw an exception.
 ---> MessagePack.Internal.MessagePackDynamicObjectResolverException: can't find matched constructor. 

can’t find matched constructor

https://github.com/neuecc/MessagePack-CSharp/issues/547

  • プロパティー名とコンストラクタ内の変数が一致していないとダメらしい
    • プロパティは使用していなかったが、keyとフィールド変数名が一致していなかったため修正した
1
2
3
4
5
6
7
8
[Key("command")]
public string cmd;

public RTCommand(string line, string cmd, int i) {
    this.line = line;
    this.cmd = cmd;
    this.offset = i;
}
1
2
3
4
5
6
7
8
[Key("command")]
public string command;

public RTCommand(string line, string command, int offset) {
    this.line = line;
    this.command = command;
    this.offset = offset;
}

# 自作クラスのデシリアライズがうまくいかない

1
2
3
 at Christie_net.datagear.dg.DataGear`1.SetData(T data) in /Users/e165729/konoLab/Christie_net/datagear/dg/DataGear.cs:line 49
at Christie_net.datagear.dg.MessagePackDataGear`1.GetData() in /Users/e165729/konoLab/Christie_net/datagear/dg/MessagePackDataGear.cs:line 46
Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.

プリントデバッグの結果

1
obj: System.Collections.Generic.Dictionary`2[System.Object,System.Object]
  • 何かディクショナリになっていた
  • デバッガー動かしてみたが、マルチスレッドが原因のため?ブレークポイントを掴めなかった

中身

1
2
3
key:line val:insert
key:command val:line
key:offset val:0

RTCommandの宣言

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class RTCommand {
    [Key("line")]
    public string line;
    [Key("command")]
    public string command;
    [Key("offset")]
    public int offset;
    
    public RTCommand(string line, string command, int offset) {
        this.line = line;
        this.command = command;
        this.offset = offset;
    }

なぜかデシリアライズするとディクショナリーに変換されてしまう

  • 受け取ったディクショナリーから動的にクラス、インスタンス生成する?
  • DG部分を書き換えてディクショナリーで受け取れられるようにする?

### 就活について

  • 完全に終了した
    • 名古屋か東京に行きます
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy