Skip to content

Instantly share code, notes, and snippets.

@adam000
Last active November 23, 2018 22:18
Show Gist options
  • Save adam000/39e187b3620909fef9c59c897897ddb0 to your computer and use it in GitHub Desktop.
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)
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)
}
namespace flatbuffers;
table Replay {
events:[Event];
}
table Event {
frame:Frame;
}
table Frame {
number:int;
dt:float64;
}
root_type Replay;
// 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
}
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{}}
@adam000
Copy link
Author

adam000 commented Nov 23, 2018

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment