2

古いプロジェクトに問題があります...短い場合-「Microsoft.DirectXを使用する」。それらは廃止され、最近では新しい PC でゲームを実行すると、とにかく以前には存在しなかったさまざまな不具合やトラブルが発生しました。それらは廃止され、サポートされなくなったため、すべてのアプリケーション コードを失うことなく gfx エンジンを置き換える良い方法の解決策を探しています。たとえば、古い XNA プロジェクトは、アーキテクチャに一般的な変更を加えることなく、MonoGame または FNA に移植できます。同じ方法で行う必要があります。ここで、API によって管理された directX に近いフレームワークで、それらを移植するための多くの苦労はありませんか? シャープDX? スリムDX? 他の?(SharpDX や SlimDX の経験はありません)

これが私のGFXコードに関するスニペットです。想像してみてください。これらは Managed DirectX に基づいています。

public bool InitD3D(ref Form frmForm)
{
    PresentParameters uParms = null;
    bool bRes = false;

    mfrmMain = frmForm;

    Constants.gSettings.LoadSettings();

    //Debug.WriteLine("InitD3D in thread: " & Threading.Thread.CurrentThread.ManagedThreadId.ToString)

    try {
        CreateFlags lCreateFlags = default(CreateFlags);
        bool bReduced = false;
        uParms = CreatePresentationParams(mfrmMain);
        if (uParms == null)
            return false;

        lCreateFlags = (CreateFlags)Constants.gSettings.VertexProcessing;

        if (lCreateFlags != CreateFlags.HardwareVertexProcessing && lCreateFlags != CreateFlags.MixedVertexProcessing && lCreateFlags != CreateFlags.SoftwareVertexProcessing) {
            lCreateFlags = CreateFlags.HardwareVertexProcessing;
        }

        Caps uDevCaps = Manager.GetDeviceCaps(Manager.Adapters.Default.Adapter, DeviceType.Hardware);
        if (uDevCaps.DeviceCaps.SupportsHardwareTransformAndLight == false) {
            if (lCreateFlags == CreateFlags.HardwareVertexProcessing) {
                lCreateFlags = CreateFlags.SoftwareVertexProcessing;
                bReduced = true;
            }
        }

        try {
            gfxDevice = new Device(0, DeviceType.Hardware, frmForm.Handle, lCreateFlags, uParms);
        } catch {
            bReduced = true;
            if ((lCreateFlags & CreateFlags.HardwareVertexProcessing) == CreateFlags.HardwareVertexProcessing) {
                lCreateFlags = (lCreateFlags ^ CreateFlags.HardwareVertexProcessing) | CreateFlags.MixedVertexProcessing;
                try {
                    gfxDevice = new Device(0, DeviceType.Hardware, frmForm.Handle, lCreateFlags, uParms);
                } catch {
                    lCreateFlags = (lCreateFlags ^ CreateFlags.MixedVertexProcessing) | CreateFlags.SoftwareVertexProcessing;
                    try {
                        gfxDevice = new Device(0, DeviceType.Hardware, frmForm.Handle, lCreateFlags, uParms);
                    } catch (Exception ex) {
                        Interaction.MsgBox("Game will not run on this computer because the video hardware is not sufficient.", MsgBoxStyle.OkOnly, "Error");
                        System.Environment.Exit(0);
                    }
                }
            } else if ((lCreateFlags & CreateFlags.MixedVertexProcessing) == CreateFlags.MixedVertexProcessing) {
                lCreateFlags = (lCreateFlags ^ CreateFlags.MixedVertexProcessing) | CreateFlags.SoftwareVertexProcessing;
                try {
                    gfxDevice = new Device(0, DeviceType.Hardware, frmForm.Handle, lCreateFlags, uParms);
                } catch (Exception ex) {
                    Interaction.MsgBox("Game will not run on this computer because the video hardware is not sufficient.", MsgBoxStyle.OkOnly, "Error");
                    System.Environment.Exit(0);
                }
            }
        }

        if (bReduced == true)
            Interaction.MsgBox("Game was required to alter settings that will affect performance in order to run the game.", MsgBoxStyle.OkOnly, "Error");
        Constants.gSettings.VertexProcessing = Convert.ToInt32(lCreateFlags);

        bRes = (gfxDevice != null);

        if (Constants.gSettings.MiniMapLocX > uParms.BackBufferWidth)
            Constants.gSettings.MiniMapLocX = uParms.BackBufferWidth - Constants.gSettings.MiniMapWidthHeight;
        if (Constants.gSettings.MiniMapLocY > uParms.BackBufferHeight)
            Constants.gSettings.MiniMapLocY = uParms.BackBufferHeight - Constants.gSettings.MiniMapWidthHeight;
    } catch {
        Interaction.MsgBox(Err().Description, MsgBoxStyle.Critical | MsgBoxStyle.OkOnly, "Error in initialize Direct3D");
        bRes = false;
    } finally {
        uParms = null;
    }

    if (bRes == false) {
        Interaction.MsgBox("Unable to initialize Direct3D 9.0c. Your video card may not fully support DirectX 9.0c. Download the latest drivers for your video card and try again.", MsgBoxStyle.OkOnly | MsgBoxStyle.Critical, "Unable to Initialize");
        return false;
    }

    var _with8 = gfxDevice.DeviceCaps.VertexShaderVersion;
    if (_with8.Major == 1) {
        Constants.gSettings.PostGlowAmt = 0f;
        Constants.gSettings.LightQuality = EngineSettings.LightQualitySetting.VSPS1;
    }

    mbSupportsNewModelMethod = gfxDevice.DeviceCaps.TextureOperationCaps.SupportsBlendTextureAlpha == true && gfxDevice.DeviceCaps.MaxTextureBlendStages > 2 && gfxDevice.DeviceCaps.MaxSimultaneousTextures > 1;

    if (Constants.gWMgr == null)
        Constants.gWMgr = new WpnFXManager();
    if (Constants.gShldMgr == null)
        Constants.gShldMgr = new ShieldFXManager();
    if (Constants.gExplMgr == null)
        Constants.gExplMgr = new ExplosionManager();
    //  New ExplosionFXManager(gfxDevice)
    if (Constants.gPFXEngine32 == null)
        Constants.gPFXEngine32 = new BurnFX.ParticleEngine(32);
    //32 for size of points
    if (Constants.gEntityDeath == null)
        Constants.gEntityDeath = new DeathSequenceMgr();
    //If goRewards Is Nothing Then goRewards = New WarpointRewards()
    if (Constants.gMissileMgr == null)
        Constants.gMissileMgr = new MissileMgr();
    if (Constants.gBurnMarkMgr == null)
        Constants.gBurnMarkMgr = new EntityBurnMarkManager();

    Constants.InitializeFXColors();

    var _with9 = matIronCurtain;
    _with9.Emissive = System.Drawing.Color.FromArgb(255, 255, 0, 0);
    _with9.Diffuse = System.Drawing.Color.FromArgb(255, 255, 0, 0);
    _with9.Ambient = System.Drawing.Color.FromArgb(255, 255, 0, 0);
    _with9.Specular = System.Drawing.Color.FromArgb(255, 255, 0, 0);
    _with9.SpecularSharpness = 10;


    gfxDevice.DeviceLost += gfxDevice_DeviceLost;
    gfxDevice.DeviceReset += gfxDevice_DeviceReset;
    gfxDevice.Disposing += gfxDevice_Disposing;

    mbInitialized = bRes;

    return bRes;
}
4

1 に答える 1

1

既存のレガシ Managed DirectX 1.1 C# コードを直接移植するには、SlimDXがおそらく最善の策です。これは、直接の置き換えを目的としているためです。SharpDX、MonoGame、Unity3D、またはその他のフレームワークを使用して移植することもできます。

DirectX と .NETを参照

于 2016-02-14T20:57:36.420 に答える