Mobile Game State Sync Implementation – Full Stack

TRUETECH is engaged in the development, support and maintenance of iOS, Android, PWA mobile applications. We have extensive experience and expertise in publishing mobile applications in popular markets like Google Play, App Store, Amazon, AppGallery and others.

Development and support of all types of mobile applications:

Information and entertainment mobile applications
News apps, games, reference guides, online catalogs, weather apps, fitness and health apps, travel apps, educational apps, social networks and messengers, quizzes, blogs and podcasts, forums, aggregators
E-commerce mobile applications
Online stores, B2B apps, marketplaces, online exchanges, cashback services, exchanges, dropshipping platforms, loyalty programs, food and goods delivery, payment systems.
Business process management mobile applications
CRM systems, ERP systems, project management, sales team tools, financial management, production management, logistics and delivery management, HR management, data monitoring systems
Electronic services mobile applications
Classified ads platforms, online schools, online cinemas, electronic service platforms, cashback platforms, video hosting, thematic portals, online booking and scheduling platforms, online trading platforms

These are just some of the types of mobile applications we work with, and each of them may have its own specific features and functionality, tailored to the specific needs and goals of the client.

Showing 1 of 1All 1734 services
Mobile Game State Sync Implementation – Full Stack
Complex
~5 days
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_mobile-applications_feedme_467_0.webp
    Development of a mobile application for FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Development of a mobile application for XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Development of a mobile application for RHL
    1159
  • image_mobile-applications_zippy_411_0.webp
    Development of a mobile application for ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Development of a mobile application for Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Development of a mobile application for the FLAVORS company
    562

Implementing Mobile Game State Sync – Full Stack

State sync is the foundation of any multiplayer experience. The core problem: two devices must see the same game world at the same moment despite network latency, packet loss, and different compute power. There are several approaches, and the choice depends on genre. We implement full-stack sync: from protocol selection to testing under millisecond latency. For example, for a shooter, low latency and smoothness are critical, so we use client prediction and delta compression. For a turn-based strategy, event sourcing with fixed-point math suffices. Without proper architecture, players will face lag, desync, and progress loss.

What is State Sync in Mobile Games?

Sync is a mechanism that ensures data consistency between the server and all clients. Without it, multiplayer is impossible: players see different enemies, bullets fly through walls, progress is lost. The main dilemma: full accuracy requires bandwidth that mobile internet rarely provides. So we balance detail and traffic.

Snapshot vs State Delta vs Event Sourcing

Three main approaches to state distribution:

Full snapshot: the server sends the complete world state every N ms. Simple but wasteful. With 20 entities at 50 bytes each, 20 Hz – 20 KB/s per client. For 10 clients, the server sends 200 KB/s. Suitable for small games.

Delta compression: send only changes from the last acknowledged snapshot. The client confirms ack: last_received_tick, the server computes delta. Reduces traffic by 3-10x on dynamic scenes. Implementation is more complex: need to store state history for delta calculation, handle packet loss of a delta (without the base snapshot, delta cannot be applied).

Event sourcing: the server broadcasts events (PlayerMoved, BulletFired, EntityDied), the client replays them on top of the base state. Good for deterministic games: chess, card games, strategy. Bad for physics simulations: any float precision error diverges states within 30 seconds.

How Determinism Affects Sync?

For event sourcing, both platforms (iOS ARM64, Android ARM64/x86) must produce the same result from the same computations. Standard float in C# is deterministic on one platform but can give different results on different CPUs. Solution – fixed-point math: instead of float 1.5f, use FixedPoint 15000 (scale 1/10000). Addition and multiplication of integers are deterministic everywhere. Libraries: FixedMath.Net for Unity, libfixmath for native C++. Godot uses deterministic physics via _physics_process – all steps fixed. Unity Physics (DOTS) supports determinism with consistent object processing order. Classic Unity PhysX – not deterministic across platforms.

Why Fixed-Point Math Over Float for Sync?

Float can produce different results on different architectures due to rounding differences. Fixed-point guarantees determinism, critical for event sourcing. Additionally, fixed-point operations can be faster on some processors as they don't require hardware FPU. However, precision is lower: at 1/10000 scale, max error is 0.0001, acceptable for positions but may be insufficient for high-speed physics. We help choose the optimal format for your game.

Client-Side Prediction and Reconciliation

Detailed breakdown of the pattern for real-time games:

Client tick 100: apply input locally, send InputPayload{tick:100, input}
Client tick 101-110: continue predicting locally
Server: receive InputPayload{tick:100}, simulate, respond StatePayload{tick:100, pos, vel}
Client tick 112: receive server response for tick 100
  → Compare predicted state at tick 100 with server state
  → If discrepancy > threshold: rollback to server state at tick 100
  → Re-apply input buffer 101-112

The input buffer is a circular array of fixed size (typically 64-128 ticks). Each element: { tick, inputData, predictedState }. On reconciliation, iterate over buffer reapplying inputs. Threshold for reconciliation: non-zero. If 0.001 units discrepancy -> rollback -> client constantly jitters. Typical threshold: 0.1-0.5 units depending on character speed.

When is Interpolation Needed for Other Players?

Own character: client prediction. Other players: interpolation.

Client stores a buffer of snapshots with server timestamps:

[{time: 1000ms, pos: (10,0,5)}, {time: 1050ms, pos: (10.5,0,5)}, ...]

Rendering happens with an interpolation delay (usually 2-3 snapshots = 100-150 ms at 20 Hz). At render time, find two closest snapshots and linearly interpolate position:

float t = (renderTime - fromState.time) / (toState.time - fromState.time);
renderPosition = Vector3.Lerp(fromState.position, toState.position, t);

For rotation – Quaternion.Slerp. For speed – Hermite interpolation or Catmull-Rom over multiple points – smoother when changing direction.

How Client Prediction Reduces Latency?

Without prediction, the player sees latency equal to RTT/2 (time to server and back). With prediction, input is applied instantly, and the server only corrects. This cuts perceived latency by 2-5 times. For shooters, this is critical: even 50 ms latency is noticeable.

The Desync Problem

In deterministic games, desync doesn't appear immediately. Standard diagnosis: state hash comparison – every N ticks all clients send a hash of the current state to the server. If hashes don't match – desync, the server broadcasts a full snapshot for synchronization. The hash is computed from critical state fields (positions, HP, statuses) – not everything, to exclude irrelevant differences (animation weights, UI state).

How Mobile Internet Affects Sync?

Mobile internet is unstable. Design for worst case: 150 ms RTT, 5% packet loss, traffic budget 50 KB/s per player. Practical measures:

  • Positions: int16 instead of float32 with scaling (50% savings)
  • Rotation: quaternion → two int8 angles (75% savings)
  • Entities out of sight: don't send or reduce update frequency
  • Priority-based updates: fast-moving objects update more often

BitPacking libraries: NetStack (C#), LiteNetLib BitWriter – pack multiple small values into one byte.

How desync detection works in practice? We implement state hash comparison once per second. On desync, the server sends a full snapshot to all clients for resync. Additionally, we use checksums for each packet to detect bit errors.

What the Work Includes

Stage Deliverable Duration (estimate)
Analysis Sync protocol, traffic estimate 3-7 days
Design Architecture specification, stack selection 5-10 days
Development Sync implementation, client prediction, reconciliation 30-60 days
Testing Load testing, desync simulation 7-14 days
Deployment Integration with CDN/backend, monitoring 5-10 days

The cost is calculated individually based on complexity. Request a consultation – we'll evaluate your project in 1-2 days. Contact us – we'll tell you how to reduce latency and traffic.

Timelines

Snapshot sync with interpolation for 4-10 players: 2-3 weeks. Client prediction, reconciliation, delta compression, desync detection: 1.5-3 months. Deterministic simulation with fixed-point math: adds 3-6 weeks. Get in touch – we'll find the optimal solution for your budget.

Comparison of approaches:

Approach Traffic Latency Complexity
Snapshot High Medium Low
Delta compression Low Low Medium
Event sourcing Medium High High

Delta compression is 3-10x more efficient than snapshot in traffic, and event sourcing avoids server authority at the cost of complexity.

How to Start Integrating API into a Mobile App?

The request goes out, the response doesn't come, timeout — 30 seconds. The user stares at the spinner. No network — mobile card in the subway. Or the network is there, but the server returns 200 with an HTML error page instead of JSON — and the app crashes on JSONDecoder.decode(). We see such cases on every second project. So integrating API into a mobile app is not just calling an endpoint, but designing a reliable network layer: error handling, caching, offline mode, certificate pinning. Order an audit of your current network layer — we will evaluate the project in 1 day. Our team guarantees a thorough analysis and provides a detailed roadmap.

Standard libraries like URLSession and OkHttp provide basic HTTP clients, but for production you need retries with exponential backoff, status code validation, typed deserialization, and network state monitoring. Without this, the app loses data and users. We have been doing mobile development for 5 years and implemented more than 30 projects with API integration on iOS, Android, and Flutter — from startups to enterprise solutions.

How to Choose a Protocol for API Integration?

Protocol Response Size Parsing Speed Caching Suitable For
REST Large (fixed structure) Medium HTTP cache + local CRUD, typical screens
GraphQL Minimal (only needed fields) Medium (normalized cache) In-memory cache (Apollo) Complex UIs with different queries
gRPC Minimal (protobuf) High Stream-level High-load, real-time, IoT
WebSocket — (binary/text) Manual Chats, quotes, synchronization

REST remains the standard for most projects. But when a profile screen needs 5 fields out of 40, GraphQL eliminates over-fetching and reduces traffic by 30–60%. gRPC is justified for thousands of requests per minute (trading, IoT) — binary serialization is 3–5 times faster than JSON. WebSocket is the only choice for real-time without polling (messages, notifications).

Practical example: For a fintech app, we replaced REST (40 fields) with GraphQL — response size dropped from 12 KB to 2.5 KB, screen render time decreased by 70%. Traffic savings were significant. Our certified iOS and Android developers have deep experience with all these protocols — you can rely on proven solutions.

How to Ensure Reliable Connection and Offline-First?

Users lose network in the subway, elevator, tunnel. A mobile app must work without internet — at least in read-only mode. We implement the offline-first pattern:

  1. On screen open, first show data from the local cache (Core Data / Room).
  2. Simultaneously perform a network request, update UI after response.
  3. If network is unavailable — show cached data and a 'no connection' label.
  4. When network is restored, automatically synchronize changes.

For HTTP response caching we use URLCache (iOS) and OkHttp Cache (Android) with Cache-Control support. For structured data — SwiftData / Room. NWPathMonitor / ConnectivityManager.NetworkCallback monitor network state and trigger updates.

REST and Client Library Selection

Alamofire (iOS) — de facto standard for Swift projects. On top of URLSession it adds request chaining, response validation, automatic retry, certificate pinning via ServerTrustManager. AF.request() with .validate() returns an error for any status code outside 200–299. Without .validate(), Alamofire considers 404 and 500 as successful responses. With Swift Concurrency — async version via serializingDecodable.

Retrofit (Android) — annotation-based HTTP client on top of OkHttp. An interface with annotations compiles into implementation. @GET, @POST, @Path, @Query, @Body — declarative API description. OkHttp under the hood: connection pooling, transparent gzip, HTTP/2 multiplex. HttpLoggingInterceptor — logging in debug builds. Authenticator — automatic token refresh on 401.

Ktor (KMM/Flutter) — multiplatform HTTP client. On iOS it works via Darwin engine (URLSession), on Android — via OkHttp. Single code for both platforms with KMM architecture.

GraphQL: When REST Falls Short

REST returns a fixed structure. A profile screen needs name, avatar, email — the server sends 40 fields. Over-fetching. GraphQL solves this: the client requests exactly the needed fields. This is critical for mobile where traffic and parsing time are real constraints. Apollo iOS and Apollo Kotlin generate typed classes from schema: schema.graphql + query files → strict types at compile time. Subscriptions via WebSocket — real-time without polling. Limitation: GraphQL is harder to cache at the HTTP level. Apollo uses a normalized in-memory cache InMemoryNormalizedCache — requests with overlapping data update the cache without duplication.

WebSocket: Real-Time Without Extra Traffic

Polling (setInterval every 5 seconds) — battery and traffic waste. WebSocket is a persistent bidirectional connection. iOS: URLSessionWebSocketTask (native, iOS 13+). Android: OkHttp WebSocket. Mandatory reconnect handling: on onFailure — exponential backoff (1s → 2s → 4s → 8s → max 60s). Socket.IO is an overlay with automatic reconnect, but for new projects native WebSocket is preferable (fewer dependencies).

gRPC: For High-Load Services

gRPC with protobuf — binary serialization: smaller size, faster parsing. grpc-swift for iOS, grpc-kotlin for Android. The protobuf schema compiles to typed classes. Streaming (server-side, client-side, bidirectional) is a native feature. Application threshold: high request frequency (trading, IoT) or critical latency. For regular CRUD, REST is simpler to debug and monitor.

Certificate Pinning and Security

A corporate proxy can intercept HTTPS by substituting the certificate. Certificate pinning prevents this: the app accepts only a specific certificate or public key. Alamofire: ServerTrustManager with PinnedCertificatesTrustEvaluator. OkHttp: CertificatePinner with SHA-256 hash. Apple's App Transport Security documentation recommends pinning certificates for sensitive data. Operational complexity: on certificate rotation, older app versions stop working. Solution — pinning to the CA public key or support multiple pins with a grace period.

What Is Included in the Work

Stage Duration Result
API and requirements analysis 1–2 days Endpoint specification, protocol selection, caching schema
Network layer implementation 3–5 days Client library, error handling, retry, pinning
Offline mode and caching 2–3 days Local storage, offline-first pattern
Integration and testing 2–3 days Unit tests (URLProtocol/OkHttp MockWebServer), UI tests
Deployment and documentation 1 day CI/CD, store access, team README

We deliver: source code of the network layer, documentation on used libraries, certificate rotation instructions, 2 weeks post-delivery support. Our experience guarantees that the solution will be stable and maintainable.

Timeline and Cost

Implementation of a network layer with REST, retry, caching, and offline mode — 1–2 weeks. Adding GraphQL or WebSocket — another 1–2 weeks. gRPC — 2–3 weeks, including code generation. The cost is calculated individually after analyzing the API and offline behavior requirements. We will evaluate the project in 1 day — contact us for a consultation. Get a reliable API integration with guaranteed quality.