Non sto parlando specificamente di Dota2 ma della maggior parte dei giochi multipiattaforma in generale.
Di solito gli sviluppatori creano / usano un mezzo erano chiamati GameEngine. Solitamente si tratta di una libreria di grandi dimensioni contenente strumenti per ogni genere di attività, come la gestione fisica dei giochi, il caricamento e il rendering di oggetti grafici, il caricamento e l'esecuzione di script, la gestione di materiale correlato alla rete e così via ...
Quella cosa di GameEngine può anche fornire supporto per questo tipo di cose su più piattaforme. Fornisce agli sviluppatori un'interfaccia unificata, pur avendo implementazioni diverse su piattaforme diverse. La stessa cosa accade quasi ogni volta che vedi un'applicazione cross platform. Anche C # stesso che hai menzionato sta facendo la stessa cosa sotto il cofano; sta fornendo un'esperienza di sviluppo unificata su tutte le piattaforme, mentre gestiamo le differenze specifiche della piattaforma sotto il cofano.
In caso di valvola (Dota2 e altri giochi), GameEngine si chiama "Source Engine". mentre qualsiasi cosa costruita su Source Engine è indipendente dalla piattaforma, il motore stesso ha implementazioni differenti per diversi sistemi operativi. Ecco un esempio: il motore potrebbe avere una funzione per disegnare una sfera. In Windows questa routine è scritta usando DirectX mentre in Linux e Mac sta usando OpenGL.
Significa che gli sviluppatori di livello più alto, inclusi quelli che stanno implementando la logica di gioco e praticamente tutto in un gioco, non noteranno nemmeno i cambiamenti della piattaforma, ma nel suo codice di livello base Dota2 (e praticamente qualsiasi altro gioco) viene scritto una volta per piattaforma.