韓版傳奇 2 源碼分析與 Unity 重制(三)客戶端渲染管線

專題介紹

該專題將會分析 LOMCN 基於韓版傳奇 2,使用 .NET 重寫的傳奇源碼(服務端 + 客戶端),分析數據交互、狀態管理和客戶端渲染等技術,此外筆者還會分享將客戶端部分移植到 Unity 和服務端用現代編程語言重寫的全過程。

系列文章

韓版傳奇 2 源碼分析與 Unity 重制(一)服務端 TCP 狀態管理

韓版傳奇 2 源碼分析與 Unity 重制(二)客戶端啟動與交互流程

概覽

在這一篇文章中,我們將開始分析傳奇客戶端的 2D 渲染管線,瞭解傳奇早期的美術資產設計與渲染流程。

底層圖形接口

可能傳奇在設計之初沒有考慮到跨平臺用途,或是為瞭做到極致性能,開發者直接使用瞭 Direct 3D 的圖形接口進行 2D 渲染管線的開發,在客戶端的 Main Form 被加載的時候會進行 D3D 的初始化,開發者封裝瞭 DXManager 來管理 RenderState:

// CMain.cs
private void CMain_Load(object sender, EventArgs e)
{
this.Text = GameLanguage.GameName;
try
{
ClientSize = new Size(Settings.ScreenWidth, Settings.ScreenHeight);

DXManager.Create();
SoundManager.Create();
CenterToScreen();
}
catch (Exception ex)
{
SaveError(ex.ToString());
}
}

// DXManager.cs
using SlimDX;
using SlimDX.Direct3D9;
using Blend = SlimDX.Direct3D9.Blend;

public static void Create()
{
Parameters = new PresentParameters
{
BackBufferFormat = Format.X8R8G8B8,
PresentFlags = PresentFlags.LockableBackBuffer,
BackBufferWidth = Settings.ScreenWidth,
BackBufferHeight = Settings.ScreenHeight,
SwapEffect = SwapEffect.Discard,
PresentationInterval = Settings.FPSCap ? PresentInterval.One : PresentInterval.Immediate,
Windowed = !Settings.FullScreen,
};

Direct3D d3d = new Direct3D();

Capabilities devCaps = d3d.GetDeviceCaps(0, DeviceType.Hardware);
DeviceType devType = DeviceType.Reference;
CreateFlags devFlags = CreateFlags.HardwareVertexProcessing;

if (devCaps.VertexShaderVersion.Major >= 2 && devCaps.PixelShaderVersion.Major >= 2)
devType = DeviceType.Hardware;

if ((devCaps.DeviceCaps & DeviceCaps.HWTransformAndLight) != 0)
devFlags = CreateFlags.HardwareVertexProcessing;

if ((devCaps.DeviceCaps & DeviceCaps.PureDevice) != 0)
devFlags |= CreateFlags.PureDevice;

Device = new Device(d3d, d3d.Adapters.DefaultAdapter.Adapter, devType, Program.Form.Handle, devFlags, Parameters);

Device.SetDialogBoxMode(true);

LoadTextures();
LoadPixelsShaders();
}

赞(0)