跳过正文
  1. 项目/
  2. MonoGame 鸿蒙移植项目/

MonoGame 移植:未移植盘点与鸿蒙后端路线图

·163 字·1 分钟·
FunBocchi
作者
FunBocchi
游戏引擎、图形编程爱好者。正在把 MonoGame 3.8.x 逐行移植为 C++20 并跑在鸿蒙上;也在做 Bocchi House 游戏移植平台与各种经典游戏的 HarmonyOS 移植。
目录
MonoGame 鸿蒙移植 - 这篇文章属于一个选集。
§ : 本文

盘点:还差什么
#

移植工程讲究"心里有数"——除了已完成的,还需要一份清晰的未移植清单。最近做了一次系统盘点:

未移植枚举(16 个)
#

其中 10 个是状态依赖枚举,补上它们就能解除状态类的 void* 占位并补全缺失属性:

Blend / BlendFunction / CompareFunction / StencilOperation
CullMode / FillMode / TextureAddressMode / TextureFilter / TextureFilterMode / BufferUsage

其余:GraphicsDeviceStatus + Effect 家族 3 个(EffectDirtyFlags/EffectParameterClass/EffectParameterType)。

未移植平台无关文件(约 50 个)
#

  • 根目录:Texture 抽象基类、GraphicsResource 基类、GraphicsMetricsGraphicsExtensionsDxtUtilSpriteFontGraphicsDeviceManager
  • Model 家族(8 个文件)
  • 异常类(4 个)+ 事件参数类(3 个)
  • States/TargetBlendState.csVertices/ 动态缓冲与顶点类型(6 个)
  • Effect/ 全部(24 个文件)

这些大多属于阶段 A8/B2/C 的计划项,在未完成清单里有记录——不静默省略,全部标注 TODO 或按计划推进

下一步路线图
#

第一步:10 个状态依赖枚举(当前焦点)
#

独立小文件,按 C# 的 States/Vertices/ 源结构移植。收益最大:

// 例:States/Blend.cs → blend.hpp(独立枚举文件)
enum class Blend {
    kZero = 0,
    kOne,
    // ...
};

补完后 BlendState/DepthStencilState/RasterizerState/SamplerState/VertexBuffer/IndexBuffer 里的一堆 void* 占位就能换成真实枚举,缺失的属性访问器也能补全。

第二步:TargetBlendState + GraphicsResource/Texture 基类
#

B2(Vulkan 后端)的前置依赖。

第三步:阶段 B —— 平台层
#

  1. B1 窗口/生命周期:XComponent → NativeWindow
  2. B2 Vulkan 后端(最大头):
    • GraphicsDevice 的 28 个 Platform* 钩子逐一实现
    • 资源类(Texture2D/VertexBuffer/Shader 等)的钩子
    • 前置风险:MGFX → SPIR-V 工具链(MonoGame 官方有 ShaderProfile.Vulkan.cs 编译实现可参考)
  3. B3 输入 / B4 OHAudio / B5 rawfile 内容流

参考:鸿蒙端已有 FrameGenerationVulkan 示例(vulkan_utils/Device/Buffer/Image 等基础设施可直接借鉴),渲染状态对象参考 DirectX 实现(D3D11 显式状态对象与 Vulkan 更接近)。

里程碑
#

里程碑内容
M1状态依赖枚举 + 资源基类完成(全量编译零警告)
M2B1 窗口显示
M3B2 首帧:Clear + 三角形
M4-M6输入/音频/完整 Game 循环
MonoGame 鸿蒙移植 - 这篇文章属于一个选集。
§ : 本文

相关文章