Initial version of single binary hot-reloading
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
# Hot Reloading
|
||||
|
||||
Instead of having the engine as an exe and game as a dll, and having to jump
|
||||
through hoops to share libraries internal state between them we do it
|
||||
differently. The engine and game live in the same binary, compiled fully each
|
||||
time. We rely mostly on static memory, and register these memory regions. Then
|
||||
when we want to hot reload: we send a close signal to the running instance, it
|
||||
writes a snapshot of the active memory to disk, instance closes, recompile,
|
||||
restart the application, it restores the memory from the snapshot.
|
||||
|
||||
## Byte Layout On Disk
|
||||
|
||||
```odin
|
||||
Snapshot_Header :: struct #packed #all_or_none {
|
||||
magic_string: u32,
|
||||
version: u16, // spec of the snapshot
|
||||
app_version: [4 + time.MIN_YYYY_DATE_LEN + 8]u8, // example: `dev-2026-09-23-a4084b3`
|
||||
region_count: u32,
|
||||
}
|
||||
|
||||
Region_Header :: struct #packed #all_or_none {
|
||||
name_size: u32,
|
||||
data_size: u32,
|
||||
}
|
||||
```
|
||||
|
||||
[ Snapshot_Header ]
|
||||
[ Region_Header ]
|
||||
[ name bytes ]
|
||||
[ data bytes ]
|
||||
[ Region_Header ]
|
||||
[ name bytes ]
|
||||
[ data bytes ]
|
||||
[ etc.. ]
|
||||
|
||||
## Diff Checking
|
||||
|
||||
Use hashing per memory segment to do a sanity diff-check.
|
||||
|
||||
```odin
|
||||
import "core:crypto/hash"
|
||||
|
||||
data: []byte = ...
|
||||
|
||||
digest := hash.hash_bytes(hash.Algorithm.SHA256, data)
|
||||
defer delete(digest)
|
||||
```
|
||||
Reference in New Issue
Block a user