Mengemas game DirectX Platform Windows Universal (UWP) Anda

Game Platform Windows Universal (UWP) yang lebih besar, terutama yang mendukung beberapa bahasa dengan aset khusus wilayah atau memiliki aset definisi tinggi opsional, dapat dengan mudah balon ke ukuran besar. Dalam topik ini, pelajari cara menggunakan paket aplikasi dan bundel aplikasi untuk menyesuaikan aplikasi Anda sehingga pelanggan Anda hanya menerima sumber daya yang benar-benar mereka butuhkan.

Selain model paket aplikasi, Windows 10 mendukung bundel aplikasi yang mengelompokkan dua jenis paket:

  • Paket aplikasi berisi executable dan pustaka khusus platform. Biasanya, game UWP dapat memiliki hingga tiga paket aplikasi: masing-masing untuk arsitektur CPU x86, x64, dan Arm. Semua kode dan data khusus untuk platform perangkat keras tersebut harus disertakan dalam paket aplikasinya. Paket aplikasi juga harus berisi semua aset inti agar game berjalan dengan tingkat keakuratan dan performa garis besar.
  • Paket sumber daya berisi data platform-agnostik opsional atau diperluas, seperti aset game (tekstur, jala, suara, teks). Game UWP dapat memiliki satu atau beberapa paket sumber daya, termasuk paket sumber daya untuk aset atau tekstur definisi tinggi, sumber daya tingkat fitur DirectX 11+, atau aset dan sumber daya khusus bahasa.

Untuk informasi selengkapnya tentang app bundle dan paket aplikasi, baca Menentukan sumber daya aplikasi.

Meskipun Anda dapat menempatkan semua konten dalam paket aplikasi Anda, ini tidak efisien dan redundan. Mengapa file tekstur besar yang sama direplikasi tiga kali untuk setiap platform, terutama untuk platform Arm yang mungkin tidak menggunakannya? Tujuan yang baik adalah mencoba meminimalkan apa yang harus diunduh pelanggan Anda, sehingga mereka dapat mulai memainkan game Anda lebih cepat, menghemat ruang di perangkat mereka, dan menghindari kemungkinan biaya bandwidth terukur.

Untuk menggunakan fitur penginstal aplikasi UWP ini, penting untuk mempertimbangkan tata letak direktori dan konvensi penamaan file untuk kemasan aplikasi dan sumber daya di awal pengembangan game, sehingga alat dan sumber Anda dapat menghasilkannya dengan benar dengan cara yang membuat pengemasan sederhana. Ikuti aturan yang diuraikan dalam dokumen ini saat mengembangkan atau mengonfigurasi pembuatan aset dan mengelola alat dan skrip, dan saat menulis kode yang memuat atau mereferensikan sumber daya.

Mengapa membuat paket sumber daya?

Ketika Anda membuat aplikasi, terutama aplikasi game yang dapat dijual di banyak lokal atau berbagai platform perangkat keras UWP, Anda sering kali perlu menyertakan beberapa versi banyak file untuk mendukung lokal atau platform tersebut. Misalnya, jika Anda merilis game di Amerika Serikat dan Jepang, Anda mungkin memerlukan satu set file suara dalam bahasa Inggris untuk lokal en-us, dan satu lagi dalam bahasa Jepang untuk lokal jp-jp. Atau, jika Anda ingin menggunakan gambar dalam game Anda untuk perangkat Arm serta platform x86 dan x64, Anda harus mengunggah aset gambar yang sama 3 kali, sekali untuk setiap arsitektur CPU.

Selain itu, jika game Anda memiliki banyak sumber daya definisi tinggi yang tidak berlaku untuk platform dengan tingkat fitur DirectX yang lebih rendah, mengapa menyertakannya dalam paket aplikasi dasar dan mengharuskan pengguna Anda mengunduh volume besar komponen yang tidak dapat digunakan perangkat? Memisahkan sumber daya dengan def tinggi ini menjadi paket sumber daya opsional berarti bahwa pelanggan dengan perangkat yang mendukung sumber daya dengan def tinggi tersebut dapat memperolehnya dengan biaya bandwidth (mungkin terukur), sementara mereka yang tidak memiliki perangkat kelas atas bisa membuat game mereka lebih cepat dan dengan biaya penggunaan jaringan yang lebih rendah.

Kandidat konten untuk paket sumber daya game meliputi:

  • Aset khusus lokal internasional (teks, audio, atau gambar yang dilokalkan)
  • Aset resolusi tinggi untuk faktor penskalaan perangkat yang berbeda (1.0x, 1.4x, dan 1.8x)
  • Aset definisi tinggi untuk tingkat fitur DirectX yang lebih tinggi (9, 10, dan 11)

Semua ini didefinisikan dalam package.appxmanifest yang merupakan bagian dari proyek UWP Anda, dan dalam struktur direktori paket akhir Anda. Karena UI Visual Studio baru, jika Anda mengikuti proses dalam dokumen ini, Anda tidak perlu mengeditnya secara manual.

Penting Pemuatan dan manajemen sumber daya ini ditangani melalui API Windows.ApplicationModel.Resources*. Jika Anda menggunakan API sumber daya model aplikasi ini untuk memuat file yang benar untuk tingkat fitur lokal, faktor penskalaan, atau DirectX, Anda tidak perlu memuat aset Anda menggunakan jalur file eksplisit; sebaliknya, Anda menyediakan API sumber daya hanya dengan nama file umum dari aset yang Anda inginkan, dan membiarkan sistem manajemen sumber daya mendapatkan varian sumber daya yang benar untuk platform pengguna saat ini dan konfigurasi lokal (yang dapat Anda tentukan secara langsung juga dengan API yang sama ini).

Sumber daya untuk kemasan sumber daya ditentukan dengan salah satu dari dua cara dasar:

  • File aset memiliki nama file yang sama, dan versi spesifik paket sumber daya ditempatkan dalam direktori bernama tertentu. Nama direktori ini dicadangkan oleh sistem. Misalnya, \en-us, \scale-140, \dxfl-dx11.
  • File aset disimpan dalam folder dengan nama arbitrer, tetapi file diberi nama dengan label umum yang ditambahkan dengan string yang dicadangkan oleh sistem untuk menunjukkan bahasa atau kualifikasi lainnya. Secara khusus, string kualifikasi ditempat ke nama file umum setelah garis bawah ("_"). Misalnya, \assets\menu_option1_lang-en-us.png, \assets\menu_option1_scale-140.png, \assets\coolsign_dxfl-dx11.dds. Anda juga dapat menggabungkan string ini. Misalnya, \assets\menu_option1_scale-140_lang-en-us.png.

    Catatan Ketika digunakan dalam nama file daripada sendirian dalam nama direktori, kualifikasi bahasa harus mengambil formulir "lang-tag<>", misalnya, "lang-en-us" seperti yang dijelaskan dalam Menyesuaikan sumber daya Anda untuk bahasa, skala, dan kualifikasi lainnya.

Nama direktori dapat digabungkan untuk kekhususan tambahan dalam kemasan sumber daya. Namun, mereka tidak bisa berlebihan. Misalnya, \en-us\menu_option1_lang-en-us.png berlebihan.

Anda dapat menentukan nama subdirektori yang tidak dipesan yang Anda butuhkan di bawah direktori sumber daya, selama struktur direktori identik di setiap direktori sumber daya. Misalnya, \dxfl-dx10\assets\textures\coolsign.dds. Saat Anda memuat atau mereferensikan aset, nama jalur harus digeneralisasi, menghapus kualifikasi apa pun untuk tingkat fitur bahasa, skala, atau DirectX, apakah mereka berada dalam node folder atau dalam nama file. Misalnya, untuk merujuk dalam kode ke aset yang salah satu variannya adalah \dxfl-dx10\assets\textures\coolsign.dds, gunakan \assets\textures\coolsign.dds. Demikian juga, untuk merujuk ke aset dengan varian \images\background_scale-140.png, gunakan \images\background.png.

Berikut adalah nama direktori yang dipesan berikut dan awalan garis bawah nama file:

Jenis aset Nama direktori paket sumber daya Akhiran nama file paket sumber daya
Aset yang dilokalkan Semua kemungkinan bahasa, atau kombinasi bahasa dan lokal, untuk Windows 10. (Awalan kualifikasi "lang-" tidak diperlukan dalam nama folder.) "_" diikuti oleh penentu bahasa, lokal, atau bahasa lokal. Misalnya, "_en", "_us", atau "_en-us", masing-masing.
Menskalakan aset faktor scale-100, scale-140, scale-180. Ini masing-masing untuk faktor penskalaan UI 1.0x, 1.4x, dan 1.8x. "_" diikuti oleh "scale-100", "scale-140", atau "scale-180".
Aset tingkat fitur DirectX dxfl-dx9, dxfl-dx10, dan dxfl-dx11. Ini masing-masing untuk tingkat fitur DirectX 9, 10, dan 11. "_" diikuti oleh "dxfl-dx9", "dxfl-dx10", atau "dxfl-dx11".

 

Menentukan paket sumber daya bahasa yang dilokalkan

File khusus lokal ditempatkan dalam direktori proyek yang dinamai untuk bahasa (misalnya, "en").

Saat mengonfigurasi aplikasi untuk mendukung aset yang dilokalkan untuk beberapa bahasa, Anda harus:

  • Buat subdirektori aplikasi (atau versi file) untuk setiap bahasa dan lokal yang akan Anda dukung (misalnya, en-us, jp-jp, zh-cn, fr-fr, dan sebagainya).

  • Selama pengembangan, tempatkan salinan SEMUA aset (seperti file audio, tekstur, dan grafik menu yang dilokalkan) di subdirektori lokal bahasa yang sesuai, bahkan jika tidak berbeda di seluruh bahasa atau lokal. Untuk pengalaman pengguna terbaik, pastikan bahwa pengguna diberi tahu jika mereka belum mendapatkan paket sumber daya bahasa yang tersedia untuk lokal mereka jika tersedia (atau jika mereka tidak sengaja menghapusnya setelah pengunduhan dan penginstalan).

  • Pastikan setiap file sumber daya aset atau string (.resw) memiliki nama yang sama di setiap direktori. Misalnya, menu_option1.png harus memiliki nama yang sama di direktori \en-us dan \jp-jp meskipun konten file adalah untuk bahasa yang berbeda. Dalam hal ini, Anda akan melihatnya sebagai \en-us\menu_option1.png dan \jp-jp\menu_option1.png.

    Catatan Anda dapat secara opsional menambahkan lokal ke nama file dan menyimpannya di direktori yang sama; misalnya, \assets\menu_option1_lang-en-us.png, \assets\menu_option1_lang-jp-jp.png.

     

  • Gunakan API di Windows.ApplicationModel.Resources dan Windows.ApplicationModel.Resources.Core untuk menentukan dan memuat sumber daya khusus lokal untuk aplikasi Anda. Selain itu, gunakan referensi aset yang tidak menyertakan lokal tertentu, karena API ini menentukan lokal yang benar berdasarkan pengaturan pengguna dan kemudian mengambil sumber daya yang benar untuk pengguna.

  • Di Microsoft Visual Studio 2015, pilih PROJECT-Store-Create>> App Package... dan buat paket.

Menentukan paket sumber daya faktor penskalaan

Windows 10 menyediakan tiga faktor penskalakan antarmuka pengguna: 1.0x, 1.4x, dan 1.8x. Nilai penskalaan untuk setiap tampilan diatur selama penginstalan berdasarkan sejumlah faktor gabungan: ukuran layar, resolusi layar, dan jarak rata-rata pengguna yang diasumsikan dari layar. Pengguna juga dapat menyesuaikan faktor skala untuk meningkatkan keterbacaan. Permainan Anda harus sadar DPI dan faktor penskalaan-sadar untuk pengalaman terbaik. Bagian dari kesadaran ini berarti membuat versi aset visual penting untuk masing-masing dari tiga faktor penskalaan. Ini juga termasuk interaksi pointer dan pengujian hit!

Saat mengonfigurasi aplikasi untuk mendukung paket sumber daya untuk faktor penskalaan aplikasi UWP yang berbeda, Anda harus:

  • Buat subdirektori aplikasi (atau versi file) untuk setiap faktor penskalaan yang akan Anda dukung (scale-100, scale-140, dan scale-180).

  • Selama pengembangan, tempatkan salinan semua aset yang sesuai faktor skala di setiap direktori sumber daya faktor skala, bahkan jika tidak berbeda di seluruh faktor penskalaan.

  • Pastikan setiap aset memiliki nama yang sama di setiap direktori. Misalnya, menu_option1.png harus memiliki nama yang sama di direktori \scale-100 dan \scale-180 meskipun konten file berbeda. Dalam hal ini, Anda akan melihatnya sebagai \scale-100\menu_option1.png dan \scale-140\menu_option1.png.

    Catatan Sekali lagi, Anda dapat secara opsional menambahkan akhiran faktor penskalaan ke nama file dan menyimpannya di direktori yang sama; misalnya, \assets\menu_option1_scale-100.png, \assets\menu_option1_scale-140.png.

     

  • Gunakan API di Windows.ApplicationModel.Resources.Core untuk memuat aset. Referensi aset harus digeneralisasi (tanpa akhiran), meninggalkan variasi skala tertentu. Sistem akan mengambil aset skala yang sesuai untuk tampilan dan pengaturan pengguna.

  • Di Visual Studio 2015, pilih PROJECT-Store-Create>> App Package... dan buat paket.

Menentukan paket sumber daya tingkat fitur DirectX

Tingkat fitur DirectX sesuai dengan set fitur GPU untuk versi DirectX sebelumnya dan saat ini (khususnya, Direct3D). Ini termasuk spesifikasi dan fungsionalitas model shader, dukungan bahasa shader, dukungan kompresi tekstur, dan fitur alur grafis keseluruhan.

Paket aplikasi garis besar Anda harus menggunakan format kompresi tekstur garis besar: BC1, BC2, atau BC3. Format ini dapat digunakan oleh perangkat UWP apa pun, dari platform Arm low-end hingga stasiun kerja multi-GPU khusus dan komputer media.

Dukungan format tekstur di tingkat fitur DirectX 10 atau yang lebih baru harus ditambahkan dalam paket sumber daya untuk menghemat ruang disk lokal dan mengunduh bandwidth. Ini memungkinkan penggunaan skema kompresi yang lebih canggih untuk 11, seperti BC6H dan BC7. (Untuk detail selengkapnya, lihat Kompresi blok tekstur di Direct3D 11.) Format ini lebih efisien untuk aset tekstur resolusi tinggi yang didukung oleh GPU modern, dan menggunakannya meningkatkan persyaratan tampilan, performa, dan ruang permainan Anda pada platform kelas atas.

Tingkat fitur DirectX Kompresi tekstur yang didukung
9 BC1, BC2, BC3
10 BC4, BC5
11 BC6H, BC7

 

Selain itu, setiap tingkat fitur DirectX mendukung versi model shader yang berbeda. Sumber daya shader yang dikompilasi dapat dibuat berdasarkan tingkat per fitur, dan dapat disertakan dalam paket sumber daya tingkat fitur DirectX. Selain itu, beberapa model shader versi yang lebih baru dapat menggunakan aset, seperti peta normal, yang tidak dapat dilakukan oleh versi model shader sebelumnya. Aset spesifik model shader ini harus disertakan dalam paket sumber daya tingkat fitur DirectX juga.

Mekanisme sumber daya terutama difokuskan pada format tekstur yang didukung untuk aset, sehingga hanya mendukung 3 tingkat fitur keseluruhan. Jika Anda harus memiliki shader terpisah untuk sub-tingkat (versi titik) seperti DX9_1 vs DX9_3, manajemen aset dan kode penyajian Anda harus menanganinya secara eksplisit.

Saat mengonfigurasi aplikasi untuk mendukung paket sumber daya untuk tingkat fitur DirectX yang berbeda, Anda harus:

  • Buat subdirektori aplikasi (atau versi file) untuk setiap tingkat fitur DirectX yang akan Anda dukung (dxfl-dx9, dxfl-dx10, dan dxfl-dx11).

  • Selama pengembangan, tempatkan aset spesifik tingkat fitur di setiap direktori sumber daya tingkat fitur. Tidak seperti lokal dan faktor penskalaan, Anda mungkin memiliki cabang kode penyajian yang berbeda untuk setiap tingkat fitur dalam permainan Anda, dan jika Anda memiliki tekstur, shader yang dikompilasi, atau aset lain yang hanya digunakan dalam satu atau subset dari semua tingkat fitur yang didukung, letakkan aset yang sesuai hanya di direktori untuk tingkat fitur yang menggunakannya. Untuk aset yang dimuat di semua tingkat fitur, pastikan setiap direktori sumber daya tingkat fitur memiliki versinya dengan nama yang sama. Misalnya, untuk tekstur independen tingkat fitur bernama "coolsign.dds", tempatkan versi terkompresi BC3 di direktori \dxfl-dx9 dan versi terkompresi BC7 di direktori \dxfl-dx11.

  • Pastikan setiap aset (jika tersedia untuk beberapa tingkat fitur) memiliki nama yang sama di setiap direktori. Misalnya, coolsign.dds harus memiliki nama yang sama di direktori \dxfl-dx9 dan \dxfl-dx11 meskipun konten file berbeda. Dalam hal ini, Anda akan melihatnya sebagai \dxfl-dx9\coolsign.dds dan \dxfl-dx11\coolsign.dds.

    Catatan Sekali lagi, Anda dapat secara opsional menambahkan akhiran tingkat fitur ke nama file dan menyimpannya di direktori yang sama; misalnya, \textures\coolsign_dxfl-dx9.dds, \textures\coolsign_dxfl-dx11.dds.

     

  • Deklarasikan tingkat fitur DirectX yang didukung saat mengonfigurasi sumber daya grafis Anda.

    D3D_FEATURE_LEVEL featureLevels[] = 
    {
      D3D_FEATURE_LEVEL_11_1,
      D3D_FEATURE_LEVEL_11_0,
      D3D_FEATURE_LEVEL_10_1,
      D3D_FEATURE_LEVEL_10_0,
      D3D_FEATURE_LEVEL_9_3,
      D3D_FEATURE_LEVEL_9_1
    };
    
    ComPtr<ID3D11Device> device;
    ComPtr<ID3D11DeviceContext> context;
    D3D11CreateDevice(
        nullptr,                    // Use the default adapter.
        D3D_DRIVER_TYPE_HARDWARE,
        0,                      // Use 0 unless it is a software device.
        creationFlags,          // defined above
        featureLevels,          // What the app will support.
        ARRAYSIZE(featureLevels),
        D3D11_SDK_VERSION,      // This should always be D3D11_SDK_VERSION.
        &device,                    // created device
        &m_featureLevel,            // The feature level of the device.
        &context                    // The corresponding immediate context.
    );
    
  • Gunakan API di Windows.ApplicationModel.Resources.Core untuk memuat sumber daya. Referensi aset harus digeneralisasi (tanpa akhiran), meninggalkan tingkat fitur. Namun, tidak seperti bahasa dan skala, sistem tidak secara otomatis menentukan tingkat fitur mana yang optimal untuk tampilan tertentu; yang diserahkan kepada Anda untuk menentukan berdasarkan logika kode. Setelah Anda membuat penentuan itu, gunakan API untuk menginformasikan OS tingkat fitur pilihan. Sistem kemudian akan dapat mengambil aset yang benar berdasarkan preferensi tersebut. Berikut adalah sampel kode yang menunjukkan cara menginformasikan aplikasi Anda tentang tingkat fitur DirectX saat ini untuk platform:

    // Set the current UI thread's MRT ResourceContext's DXFeatureLevel with the right DXFL. 
    
    Platform::String^ dxFeatureLevel;
        switch (m_featureLevel)
        {
        case D3D_FEATURE_LEVEL_9_1:
        case D3D_FEATURE_LEVEL_9_2:
        case D3D_FEATURE_LEVEL_9_3:
            dxFeatureLevel = L"DX9";
            break;
        case D3D_FEATURE_LEVEL_10_0:
        case D3D_FEATURE_LEVEL_10_1:
            dxFeatureLevel = L"DX10";
            break;
        default:
            dxFeatureLevel = L"DX11";
        }
    
        ResourceContext::SetGlobalQualifierValue(L"DXFeatureLevel", dxFeatureLevel);
    

Catatan

Dalam kode Anda, muat tekstur secara langsung berdasarkan nama (atau jalur di bawah direktori tingkat fitur). Jangan sertakan nama direktori tingkat fitur atau akhiran. Misalnya, muat "textures\coolsign.dds", bukan "dxfl-dx11\textures\coolsign.dds" atau "textures\coolsign_dxfl-dx11.dds".

  • Sekarang gunakan ResourceManager untuk menemukan file yang cocok dengan tingkat fitur DirectX saat ini. ResourceManager mengembalikan ResourceMap, yang Anda kueri dengan ResourceMap::GetValue (atau ResourceMap::TryGetValue) dan ResourceContext yang disediakan. Ini mengembalikan ResourceCandidate yang paling cocok dengan tingkat fitur DirectX yang ditentukan dengan memanggil SetGlobalQualifierValue.

    // An explicit ResourceContext is needed to match the DirectX feature level for the display on which the current view is presented.
    
    auto resourceContext = ResourceContext::GetForCurrentView();
    auto mainResourceMap = ResourceManager::Current->MainResourceMap;
    
    // For this code example, loader is a custom ref class used to load resources.
    // You can use the BasicLoader class from any of the 8.1 DirectX samples similarly.
    
    
    auto possibleResource = mainResourceMap->GetValue(
        L"Files/BumpPixelShader.cso",
        resourceContext
    );
    Platform::String^ resourceName = possibleResource->ValueAsString;
    
  • Di Visual Studio 2015, pilih PROJECT-Store-Create>> App Package... dan buat paket.

  • Pastikan Anda mengaktifkan bundel aplikasi di pengaturan manifes package.appxmanifest.