Streamlined for Performance

Perro provides everything you need to build games with a clean, intuitive scripting language and powerful systems that work together seamlessly, optimized for speed and simplicity.

🐶

Pup Scripting Language

Write your game logic in Pup, a clean and intuitive scripting language designed specifically for game development. With syntax similar to TypeScript, it's familiar and easy to learn.

Pup compiles directly to native Rust code, giving you the simplicity of a scripting language with the performance of native code. No runtime interpretation, no virtual machine, it's just fast, efficient game logic.

Learn Pup →
🔗

Node System

Everything in Perro is a node, managed by the engine's central system in a flat map for fast access. From 2D sprites to 3D meshes, cameras to lights. Build complex hierarchies with simple, reusable components.

The engine manages all nodes in a centralized flat map, providing constant access time. No need to worry about memory management or complex setup. Just create nodes and let the engine handle the rest.

Explore Nodes →
🎬

Scene System

Organize your game world with Perro's powerful scene system. Build levels, manage states, and structure your project with intuitive hierarchies.

Scenes are statically compiled into the executable in release builds, eliminating runtime file I/O and parsing overhead. Load entire scenes in milliseconds, not seconds.

View Features →
📜

Script System

Just write scripts in Pup. The APIs automatically hook into the engine to access nodes. Attach scripts to any node to add behavior and logic. No manual memory management or complex setup needed.

Scripts compile directly into the engine binary, giving you full access to engine internals. The type-safe API bindings automatically connect your scripts to engine nodes, so you can focus on game logic instead of boilerplate.

Learn Scripts →
🎨

UI System with FUR

Build beautiful interfaces with Perro's UI system using FUR (Flexible UI Rules). Create menus, HUDs, and interactive elements with a powerful text based declarative approach.

FUR files are statically compiled at build time, eliminating runtime parsing overhead. Write your UI in a declarative markup format similar to JSX or XAML, and Perro handles the rendering efficiently.

Learn UI →

Write Clean, Simple Code

Pup's syntax is similar to TypeScript, familiar and easy to learn. Here's a simple example of a player script:

@script Player extends Sprite2D    var speed = 7.5    var health = 100     fn init() {        Console.print("Player ready!")    }     fn update() {        var delta = Time.get_delta()        self.transform.position.x += speed * delta    }     fn take_damage(amount: int) {        health -= amount        if health <= 0 {            Signal.emit("player_Died")        }    }

Native Performance, Simple Code

Don't let the simple syntax fool you. Pup compiles down to optimized machine code, running natively alongside the engine with zero interpretation overhead.

Compiled to Machine Code

Your Pup scripts are compiled to native machine code alongside the engine core. No virtual machine, no interpretation, just pure performance.

🔗

Integrated with Engine

Scripts compile directly into the engine binary. There's no boundary between your game code and the engine. Everything runs as native Rust code with full access to engine internals.

🚀

Fast Iteration

Get quick feedback during development. Only modified scripts need to recompile, keeping your workflow smooth and efficient.

Performance Benefits

10,000+
Updates per second
500ns
Signal dispatch time
0ms
Runtime overhead

Write simple code, get native performance. No compromises.

Speeds have been achieved up to 40,000 updates per second on Windows and 200,000 updates per second on Linux VM

Global Signal System

Signals propagate like radio waves across your entire game. No references needed. Any script can emit, any script can listen. Watch signals travel in real-time.

📡
Emitter
Signal.emit("ping")
📡
Emitter
Signal.emit("data")
📡
Emitter
Signal.emit("alert")
📻
Receiver
Signal.connect("ping", handler)
📻
Receiver
Signal.connect("data", handler)
📻
Receiver
Signal.connect("alert", handler)
// Emit from anywhere
Signal.emit("ping");
// Connect anywhere
Signal.connect("ping", handler);
Signals call functions across scenes, scripts, and UI with no references needed

Cross-Platform Development

Write once, deploy everywhere. Perro supports major desktop platforms with a single codebase.

💻
Windows
🐧
Linux
🍎
macOS

Free & Open Source Forever

Perro is built by the community, for the community. No licensing fees, no restrictions, no strings attached. Just pure freedom to create.

💜

Community Driven

Built with input from developers who want a better game engine experience. Your feedback shapes Perro's future.

🔓

No Restrictions

Use Perro for any project whether it's commercial, personal, or educational. No revenue sharing, no hidden costs.

🛠️

Full Control

Access the full source code. Modify, extend, or contribute back to the project. You own your tools.

Ready to Build?

Start creating with Perro Engine today. Simple tools, powerful performance, unlimited creativity.