DX 共享内存技术
技术概述通过创建一个“共享显存服务进程”(下文简称共享进程),把所有客户端的纹理创建/加载请求统一转发到共享进程执行,从而实现一个跨进程的纹理资源管理器(同一份纹理只创建一次,多客户端复用同一块显存)。 问题背景 某大型端游/客户端应用存在“多开”使用场景,且大量视觉效果由 2D 序列帧纹理驱动。多开时每个客户端重复加载同一批资源,会导致显存总占用快速升高;显存压力过大时,可能出现资源分配失败甚至进程崩溃。 多开往往具有较高内容相关性(例如多个客户端在同一场景/同一队伍内),意味着加载集合高度重叠。如果能把“相同资源只加载一次并跨进程共享”,则总显存占用可进一步下降。 技术思路 Direct3D 11 支持共享资源(shared resource / shared handle)。一个进程创建的纹理可以通过共享句柄让另一个进程打开并使用。 客户端启动时创建或连接共享进程;客户端侧所有纹理创建请求都转发给共享进程执行。 客户端与共享进程之间的控制面通信使用共享内存(元信息、状态、句柄等),数据面仍由...
C++ 多线程
1. 使用原因1.任务分解:耗时任务,任务分解,实时响应 2.数据分解:充分利用多核心CPU 3.数据流分流 2.核心概念1.std::thread 基础 join():主线程等待阻塞子线程完成后,回收子线程资源,线程生命周期受控; detach(): 子线程与主线程分离,子线程后台游离运行。主线程销毁后,子线程会强行销毁。如果访问y 12345#include<thread>thread t1(worker);......t1.join() / t1.detach(); 2.Mutex & RAII 锁 mutex (互斥量)类型:允许多个线程安全访问变量 1lock() try_lock() unlock() mutex recursive_mutex :用来解决递归调用lock_guard(mtx) 12345678910111213141516class DoSomething{public: int fun1(){ std::lock_guard lock(mtx); ...
UE 项目创建
1. 多人游戏开发1. 启动 Steam 插件 2. config 配置修改后重新生成projectDefaultEngine.ini DefaultGame.ini saved/Binares/Intermediate 文件删除 #3. 开场关卡(GameStartup)蓝图启动的时候添加插件UI WBP project Setting 设置GameStartup Lobby 大厅路径 4. 5, visual studio 转为rider1.默认打开方式改为rider 2.refresh 和open rider 旧资源迁移导入 Seamless Travle为了保证多人玩家进入场景的一致性,避免出现因为地图重新加载导致,连接断开。 开启方式:在游戏模式中 bUseSeamlessTravel = true 需要一个transition map 通过gamemode 方式 se’h Network...
CPU 与 GPU 性能瓶颈分析与定位完全指南(RenderDoc + Nsight 实战)
1. 宏观定位:找到流水线阻塞点现代游戏引擎渲染建立在**流水线并行(Pipelined Parallelism)**之上,主要由三大核心线程协作完成。排查的第一原则是:区分”真正在干活”与”在死等同步锁(Stall / Bubble)”的时间。 1.1 三大核心线程职责 线程 职责 Game Thread(逻辑线程) 跑物理、AI、动画,生成场景可见性数据 Render Thread(渲染线程) 接收逻辑数据,进行视锥体 / 遮挡剔除,生成渲染指令(Draw Calls) RHI / GPU Thread 将指令翻译为底层 API(Vulkan / DX12)Command Buffer,提交 GPU 硬件执行 1.2 宏观瓶颈判定核心思路是对比各阶段耗时(工具:Unreal Insights / stat unit / Nsight Systems)。 12345678瓶颈所在 ...
C++ 多线程理解
Why:为啥有多线程?提高 CPU 的利用率。 What:多线程是什么?How:多线程怎么实现?有什么问题?线程安全问题死锁问题 线程饥饿问题
Shader 优化实战清单:从指令、带宽到 Shader Cache(170ms → 1.04ms 案例)
这篇文章把 Shader 优化拆成两类问题: 算得太多(ALU):指令数高、昂贵函数太多、重复计算、分支导致浪费。 读得太多(带宽/采样):纹理采样次数多、采样依赖(dependent read)、格式不亲和、缓存命中差。 最后再补上经常被忽略但收益巨大的工程项:Shader Cache / 预编译(你给的例子里,编译耗时从 170ms 降到 1.04ms)。 目标不是“把指令数降到极限”,而是在视觉可接受的前提下,把瓶颈从 GPU/编译/加载链路里移走,并让优化可验证、可回归。 0. 先说清楚:你要优化的是哪一种“慢”Shader 相关的“慢”常见有三类,解决手段完全不同: 运行时 GPU 慢:帧时间里 Pixel/Vertex/Compute 占比高(看 GPU Profiler / RenderDoc / Xcode GPU Frame Debugger)。 运行时 CPU 慢(驱动/状态切换):材质变体过多、关键字爆炸、drawcall...
游戏动画优化:从卡顿定位到可交付的性能改进清单
游戏里的“动画卡顿”往往不是一个点:它可能是 Animator 逻辑、骨骼蒙皮、IK/物理、过多的事件回调、曲线采样、LOD/裁剪没生效、甚至是 资源与内存 共同叠加的结果。 本文目标是给一条清晰的工程路径:先把问题量出来 → 再把责任归因到具体子系统 → 然后用一组可复用的手段把开销降下来。 0. 先统一术语:你到底在优化什么把“动画性能”拆成三类指标,后续每一步都围绕它们做: CPU 时间:动画图评估(状态机/混合树)、骨架姿态计算、IK、事件与脚本回调、剔除与调度。 GPU 时间:蒙皮(Skinning)在 GPU 还是 CPU、蒙皮顶点数量、绘制批次、材质与变体。 内存与带宽:动画剪辑数据体积、曲线数量、关键帧密度、压缩方式、运行时临时分配(GC/alloc)。 经验法则:不要一上来“改很多”。先拿到一段稳定可复现的 profile,再做 1~2 个改动,验证收益,循环推进。 1. 定位阶段:把瓶颈量化到“可行动”的层级1.1...
计算机基础:bit/byte/KB/MB/GB 与 int/float/指针的空间占用(速查模板)
0. 这篇文章解决什么问题当你在看性能、网络协议、文件格式、C/C++ 数据结构、对齐与缓存时,最常见的“基础卡点”就是两件事: 单位:bit/byte 怎么换?KB/MB/GB 到底是 1000 还是 1024? 类型占用:int/float/double/指针到底占多少字节?为什么同一份代码在不同机器/编译器下会不一样? 本文目标:把这些变成一张“随手查”的速查表 + 一套“在代码里验证”的方法。 1. bit 与 byte:最基础的两条规则 1 byte = 8 bit **bit(b)**常用于带宽/速率:例如 100 Mb/s(兆比特每秒) **byte(B)**常用于容量/大小:例如 100 MB(兆字节) 1.1 常见误读 Mb 不是 MB:前者是 megabit,后者是 megabyte 带宽宣传常用 十进制(1000 体系),而操作系统文件大小显示有时更接近 二进制(1024 体系)或直接标为 GiB/MiB 2....
学习 UE Lumen:动态全局光照的实现原理(概览)
0. Lumen 在解决什么问题Lumen 是虚幻引擎 5 中的动态全局光照(GI)与反射方案,目标是在可交互帧率下,让间接光、天空光、自发光与反射随场景与光源变化而更新,而不依赖预烘焙 Lightmap。 和离线烘焙相比,它的代价是:近似、有噪声、有分辨率与距离上的折中;和纯路径追踪相比,它的特点是:高度工程化——用多种加速结构与缓存把“多反弹光照”压进毫秒级预算。 1. 整体心智模型:不是一条管线名字,而是一套系统可以把 Lumen 理解成三层协作: 场景表示(Scene Representation) 用距离场、高度场、表面缓存等近似几何与材质,供光线/锥体查询“往哪走、打到什么颜色”。 光照求解(Lighting Solve / Gather) 在屏幕空间与 world space 里做最终汇聚(Final Gather)、**辐射缓存(Radiance Cache)**等,把多 bounce 的间接光折合成可采样的结果。 与主渲染整合 ...
学习图形学:光线追踪入门(从 0 到可用的最小实现)
0. 为什么要学光线追踪光线追踪(Ray Tracing)的价值不只是“更真实”,而是它把渲染问题拆成一套非常统一的数学与工程模块:发射射线 → 求交 → 计算散射/发光 → 继续追踪/结束。理解这套闭环后,再回头看光栅化管线、PBR、GI、采样与降噪,会更容易形成体系。 本文目标:做出一个能渲染球体/三角形、支持阴影、反射,并能逐步扩展到路径追踪的最小实现。 1. 你需要的最小数学与约定 向量:点乘(投影/夹角)、叉乘(法线/面积)、归一化 射线: r(t) = o + t d ,其中 t > 0 坐标系:右手/左手都行,但要一致(相机、法线方向、叉乘方向) EPS:为避免自相交,常用一个很小的偏移量 \epsilon (如 1e{-4}) 2. 关键模块总览(建议按这个顺序实现) 2.1 相机(Camera):把像素坐标映射到世界空间射线 2.2 几何(Hittable):射线-物体求交(球体最容易起步) 2.3 材质(Material /...