Last active
November 23, 2018 22:18
-
-
Save adam000/39e187b3620909fef9c59c897897ddb0 to your computer and use it in GitHub Desktop.
I'm not sure what I'm doing wrong with FlatBuffers... (note, directories in filenames are noted by dashes since GH doesn't allow slashes, so myGame-replay.go should be at myGame/replay.go)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import ( | |
"io/ioutil" | |
"log" | |
"myGame/replay" | |
) | |
func main() { | |
// Create a replay | |
replayName := "MyAmazingReplay" | |
rep := replay.Replay{ | |
Name: replayName, | |
Events: []replay.Event{ | |
replay.Event{ | |
replay.Frame{ | |
Number: 0, | |
Dt: 0.011112, | |
}, | |
}, | |
replay.Event{ | |
replay.Frame{ | |
Number: 1, | |
Dt: 0.008151, | |
}, | |
}, | |
}, | |
} | |
// Save it to disk | |
if !rep.SaveToDisk() { | |
panic("Save failed!") | |
} | |
// Read it back | |
bytes, err := ioutil.ReadFile(replayName + "." + replay.ReplaySuffix) | |
if err != nil { | |
panic(err) | |
} | |
reloadedReplay, err := replay.NewReplay(bytes, replayName) | |
if err != nil { | |
panic(err) | |
} | |
// Print the contents | |
log.Printf("%#v", reloadedReplay) | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace flatbuffers; | |
table Replay { | |
events:[Event]; | |
} | |
table Event { | |
frame:Frame; | |
} | |
table Frame { | |
number:int; | |
dt:float64; | |
} | |
root_type Replay; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Package replay is concerned with the abilities for reading and writing replays. | |
package replay | |
import ( | |
"fmt" | |
"io/ioutil" | |
"log" | |
"time" | |
fb "myGame/replay/flatbuffers" | |
flatbuffers "github.com/google/flatbuffers/go" | |
) | |
const ReplaySuffix = "replay" | |
type Replay struct { | |
Name string | |
Events []Event | |
} | |
type Event struct { | |
Frame Frame | |
} | |
type Frame struct { | |
Number int32 | |
Dt float64 | |
} | |
func (r Replay) SaveToDisk() bool { | |
builder := flatbuffers.NewBuilder(1024) | |
eventOffsets := make([]flatbuffers.UOffsetT, 0, len(r.Events)) | |
for _, event := range r.Events { | |
fb.FrameStart(builder) | |
fb.FrameAddNumber(builder, event.Frame.Number) | |
fb.FrameAddDt(builder, event.Frame.Dt) | |
frameOffset := fb.FrameEnd(builder) | |
fb.EventStart(builder) | |
fb.EventAddFrame(builder, frameOffset) | |
eventOffset := fb.EventEnd(builder) | |
eventOffsets = append(eventOffsets, eventOffset) | |
} | |
fb.ReplayStartEventsVector(builder, len(r.Events)) | |
log.Println("len(r.Events)", len(r.Events)) | |
log.Println("len(eventOffsets)", len(eventOffsets)) | |
for i := len(eventOffsets) - 1; i >= 0; i-- { | |
log.Println("i", i) | |
builder.PrependUOffsetT(eventOffsets[i]) | |
} | |
builder.EndVector(len(eventOffsets)) | |
fb.ReplayStart(builder) | |
replayOffset := fb.ReplayEnd(builder) | |
// Write to file. | |
builder.Finish(replayOffset) | |
buffer2 := builder.FinishedBytes() | |
buffer := builder.Bytes[builder.Head():] | |
log.Println("buffer2: %#v", buffer2) | |
if r.Name == "" { | |
now := time.Now() | |
r.Name = fmt.Sprintf("%04d-%02d-%02d--%02d-%02d-%02d", now.Year(), now.Month(), now.Day(), now.Hour(), now.Minute(), now.Second()) | |
} | |
err := ioutil.WriteFile(r.Name+"."+ReplaySuffix, buffer, 0644) | |
if err != nil { | |
log.Printf("Error writing replay: %s", err) | |
} | |
log.Println("Writing len(buffer)", len(buffer)) | |
log.Println("Writing buffer", buffer) | |
// Huge success. | |
return true | |
} | |
func NewReplay(buf []byte, name string) (*Replay, error) { | |
log.Println("Reading len(buf)", len(buf)) | |
log.Println("Reading buffer", buf) | |
replayBuffer := fb.GetRootAsReplay(buf, 0) | |
var replay Replay | |
replay.Name = name | |
eventLength := replayBuffer.EventsLength() | |
replay.Events = make([]Event, eventLength) | |
log.Printf("Number of events: %d", eventLength) | |
for i := 1; i < eventLength; i++ { | |
var event Event | |
var eventBuffer fb.Event | |
if !replayBuffer.Events(&eventBuffer, i) { | |
return nil, fmt.Errorf("Failed to load event index %d", i) | |
} | |
// Handle Event | |
var frameBuffer fb.Frame | |
eventBuffer.Frame(&frameBuffer) | |
// Handle Frame | |
event.Frame.Number = frameBuffer.Number() | |
event.Frame.Dt = frameBuffer.Dt() | |
replay.Events[i] = event | |
} | |
return &replay, nil | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2018/11/23 08:36:13 len(r.Events) 2 | |
2018/11/23 08:36:13 len(eventOffsets) 2 | |
2018/11/23 08:36:13 i 1 | |
2018/11/23 08:36:13 i 0 | |
2018/11/23 08:36:13 buffer2: %#v [12 0 0 0 0 0 0 0 4 0 4 0 4 0 0 0 2 0 0 0 48 0 0 0 4 0 0 0 222 255 255 255 12 0 0 0 8 0 18 0 12 0 40 8 0 0 0 117 4 112 179 120 177 128 63 1 0 0 0 0 0 6 0 8 0 4 0 6 0 0 0 12 0 0 0 8 0 12 0 0 0 4 0 8 0 0 0 122 198 190 100 227 193 134 63] | |
2018/11/23 08:36:13 Writing len(buffer) 96 | |
2018/11/23 08:36:13 Writing buffer [12 0 0 0 0 0 0 0 4 0 4 0 4 0 0 0 2 0 0 0 48 0 0 0 4 0 0 0 222 255 255 255 12 0 0 0 8 0 18 0 12 0 40 8 0 0 0 117 4 112 179 120 177 128 63 1 0 0 0 0 0 6 0 8 0 4 0 6 0 0 0 12 0 0 0 8 0 12 0 0 0 4 0 8 0 0 0 122 198 190 100 227 193 134 63] | |
2018/11/23 08:36:13 Reading len(buf) 96 | |
2018/11/23 08:36:13 Reading buffer [12 0 0 0 0 0 0 0 4 0 4 0 4 0 0 0 2 0 0 0 48 0 0 0 4 0 0 0 222 255 255 255 12 0 0 0 8 0 18 0 12 0 40 8 0 0 0 117 4 112 179 120 177 128 63 1 0 0 0 0 0 6 0 8 0 4 0 6 0 0 0 12 0 0 0 8 0 12 0 0 0 4 0 8 0 0 0 122 198 190 100 227 193 134 63] | |
2018/11/23 08:36:13 replay.Name: MyAmazingReplay | |
2018/11/23 08:36:13 Number of events: 0 | |
2018/11/23 08:36:13 &replay.Replay{Name:"MyAmazingReplay", Events:[]replay.Event{}} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I needed to save the offset from L58 (the return value I wasn't getting) and add it to the main object between L59 and L60