Cpp

Порядок вывода легаси: почему VOG переносит игры по одной

Порядок вывода легаси: почему VOG переносит игры по одной

Почему перезапуск VOG не стал «переписать всё с нуля»: откуда в проекте привычка к осторожности, что пришлось сделать в 2021 году, чтобы старый C++-сервер вообще можно было собрать и запустить, и как в 2026-м выбрали порядок — сначала общее хранилище для всех игр, потом по одной игре, на каждом шаге меняется что-то одно

Реальный IP клиента за HAProxy: PROXY protocol в C++-сервере из 2000-х

Реальный IP клиента за HAProxy: PROXY protocol в C++-сервере из 2000-х

Игровые серверы VOG переехали на закрытую площадку за HAProxy в режиме TCP — и перестали видеть адрес игрока. Как PROXY protocol v1/v2 вернул адрес клиента без изменений в клиентах, как выглядит доработка старого C++-сервера и что в ней стоит исправить

Профилирование в разных языках: как измерять без самообмана

Профилирование в разных языках: как измерять без самообмана

Один и тот же вопрос — где на самом деле уходит время и память — в Go, Java, C++, C#, Python и Node: sampling против instrumentation, CPU/alloc/heap-профили, флеймграфы, микробенчмарки без самообмана и как из профиля сделать вывод

Куча, стек и сборщик мусора: как языки управляют памятью

Куча, стек и сборщик мусора: как языки управляют памятью

Как C++, Rust, Go и Java решают один и тот же вопрос — кто и когда освобождает память: вручную, детерминированно по владению (корректность проверяет компилятор) или в рантайме через сборщик мусора. Стек против кучи, стоимость аллокации, паузы сборщика, утечки и фрагментация — и на что смотреть под свою нагрузку

Горутины, корутины, потоки: модели конкурентности в разных языках

Горутины, корутины, потоки: модели конкурентности в разных языках

Как C++, Go, Rust, Java, Python и Node решают один вопрос — как исполнять независимую работу параллельно с чужими стеками и планировщиками: потоки ОС, green/virtual threads, stackless-корутины и event loop. Вытеснение против кооперации, stackful против stackless, 1:1 против M:N — и чем каждая модель платит

Дженерики, шаблоны, erasure: параметрический полиморфизм в разных языках

Дженерики, шаблоны, erasure: параметрический полиморфизм в разных языках

Один вопрос — как написать код, работающий для многих типов, без дублирования — языки решают принципиально по-разному: мономорфизация (C++, Rust), стирание типов (Java), гибрид GC-shape stenciling (Go), реификация (C#). За синтаксисом стоит выбор компилятора, и он даёт измеримые последствия по скорости, размеру бинаря и выразительности