Build Tags and Configuration
1. unsafe
vs. Safe Mode
The unsafe
build tag has significant effects across the Bappa ecosystem:
In Warehouse:
- Directly affects how entities and components are accessed
- Uses direct memory access for component data retrieval via
table.Accessor
GetFromCursor
operations become more efficient- Critical for high-performance games with many entities
In Coldbrew Client Systems:
- Systems processing many entities (like physics or collision) gain significant performance
- Input systems and rendering pipelines can handle more entities per frame
- More suitable for games with large numbers of active entities
// Performance differences are most noticeable in tight loops:
cursor := scene.NewCursor(query)
for range cursor.Next() {
// Component access is faster in unsafe mode
position := spatial.Components.Position.GetFromCursor(cursor)
// ...
}
Mask Size and Component Limits
The mask size build tags (m256
, m512
, m1024
) determine the maximum number of unique component types you can use per storage:
Default (no tag): 64 component types
m256: 256 component types
m512: 512 component types
m1024: 1024 component types
Impact on Warehouse:
- Directly limits how many component types can exist in a single Storage
- Affects archetype creation and entity queries
- Larger games with many component types require larger masks
Practical Considerations:
- Most small to medium games work fine with 64 component types
- Complex simulations or RPGs might need 256+ component types
- Using larger masks than necessary adds a small performance overhead
Coldbrew Asset Loading Configuration
Coldbrew has special configuration for asset loading that changes between development and production:
Development Mode
- Assets are loaded directly from the filesystem
- Set by default when not in production mode
Production Mode
- Assets are loaded from embedded filesystem (using Go’s embed feature)
- More efficient and ensures assets are included in the binary
- Set using the environment package
// To enable production mode:
go build -ldflags "-X 'github.com/TheBitDrifter/bappa/environment.Environment=production'" .
You can also check the current environment in your code:
import "github.com/TheBitDrifter/bappa/environment"
func main() {
if environment.IsProd() {
// Production-specific setup
} else {
// Development-specific setup
}
}
Cross-Package Configuration Considerations
When setting up a Bappa-based game, there are important cross-package considerations:
Consistent Build Tags: Build tags should be consistent across all packages in the ecosystem
go build -tags="unsafe m256"
Performance vs. Safety:
unsafe
mode provides the best performance but with fewer safety checks- Safe mode is recommended during development for better error messages
Memory Footprint:
- Larger mask sizes increase memory usage slightly
- WASM targets may benefit from smaller mask sizes
Hot Reloading:
- Development mode in Coldbrew enables asset hot reloading
- Production mode embeds assets for distribution
WASM
At its core, a Bappa game is a ebiten game. For WASM please see: https://ebitengine.org/en/documents/webassembly.html
The environment package also provides a utility function to detect WebAssembly environments:
// Check if running in WebAssembly
if environment.IsWASM() {
// WASM-specific behavior
}
Conclusion
Understanding these configuration options allows you to optimize the Bappa ecosystem for your specific game requirements, whether you’re building a simple platformer or a complex simulation with thousands of entities.