2019年9月30日 星期一

觀看 Vulkan 的 Extension 的軟體

觀看 Vulkan 的 Extension 的軟體

前言

  要觀看 Vulkan 的 Extension 可以利用官方 SDK 裡的 Vulkan Configuration Tool 來觀看,但我覺得介面做的不是很好看,所以找了另一個軟體來替代。

內容

   Vulkan Configuration Tool 在"(Vulkan SDK root)/(SDK version)/Tools/vkconfig.exe",執行後畫面如下
Vulkan Configuration Tool 

執行後點選 Installation Analzer 頁面,裡面的資料相當完整,但點選的介面個人不是很喜歡,Extension 的部分使用表格的方式顯示,但很佔畫面,感覺不是很密集。

  GPU Caps Viewer 這個軟體的排版就是我喜歡的密集排法,執行畫面如下
GPU Caps Viewer

用法也很簡單,執行後點選 Vulkan 頁面就可以看到所有的 Extension ,顯示方式密集比較不佔空間。

參考資料

GPU Caps Viewer

2019年9月23日 星期一

在 Direct3D12 替換掉 IID_PPV_ARGS()

在 Direct3D12 替換掉 IID_PPV_ARGS()

前言

  在 [ Github ]微軟的 Direct3D12 範例 裡,常常會在製造資源的相關 Function 中看到這個 Macro( IID_PPV_ARGS()  ),如果追蹤這個 Macro 會發現裡面會用到擴充語法 __uuidof ,由於個人不喜歡用擴充語法,所以就想找替代 IID_PPV_ARGS() 的方法,在此把學習的過程做個紀錄。

內容

  在追蹤這個 Macro 後會發現內容如下
#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)

先來看看使用 Macro 的範例,以 D3D12CreateDevice() 為例,如下
ComPtr<IDXGIAdapter1> hardwareAdapter;
ComPtr<ID3D12Device> m_device;
D3D12CreateDevice(hardwareAdapter.Get(),D3D_FEATURE_LEVEL_11_0,IID_PPV_ARGS(&m_device);

再搭配 [ MSDN ] D3D12CreateDevice() 來看,會發現這個 Macro 其實就是說入兩個變數,一個是 RFEIID 與一個 void** 的指標, void**指標的部分很簡單,其實就是強制轉型而已,但 REFIID 的部分就比較麻煩,因為使用到擴充語法  __uuidof ,可以在 [ MSDN ] __uuidof 取得更多的資料。

  REFIID 在追蹤後發現 Direcct3D12 會為一些 COM 定義專屬的ID,ID3D12Device 對應的ID就是 IID_ID3D12Device,這個ID會定義在 d3d12.h 裡,所以範例的程式碼可以換成以下
IDXGIAdapter1* pHardwareAdapter;
ID3D12Device* m_pDevice;
D3D12CreateDevice(pHardwareAdapter,D3D_FEATURE_LEVEL_11_0,IID_ID3D12Device,(void**)&m_pDevice);

使用這個交換要注意要多 Link 一個 dxguid.lib,這樣就可以迴避使用擴充語法。

參考資料

[ Github ]微軟的 Direct3D12 範例
[ MSDN ] __uuidof
[ MSDN ] D3D12CreateDevice()

2019年9月16日 星期一

用 electron-builder 建置 Windows 平台應用程式

用 electron-builder 建置 Windows 平台應用程式

前言

  在先前的 初探Electron 裡建置了 Electron 的基本環境,雖然可以透過 npm 來執行,但如果要發佈程式給一般使用者時這個方法就不專業了, Electron 目前有 electron-packager 和 electron-builder 兩個套件可以提供打包,這次我選擇 electron-builder 來進行打包,並把學習的過程做個紀錄。

內容

  首先建立一個基本的 Electron 的基本執行環境,可以參考之前的 初探Electron 與  Electron4的使用範例 ,這裡就不再詳細解說。建立好基本執行環境後就可以安裝 electron-builder 套件,
到專案的 root 資料夾下,輸入以下命令
npm install electron-builder

安裝完套件後,將原本的 package.json 修改如下
{
  "name": "electronbuildertest",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "pack": "electron-builder --dir",
    "dist": "electron-builder",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    
  },
  "build": {
    "appId": "com.xxx.app.electronbuildertest",
    "productName": "electron-builder_test",
    "directories": {
      "output": "build"
    },
    "win": {
    }
  },
  "devDependencies": {
    "electron": "^6.0.0",
    "electron-builder": "^21.2.0"
  }
}

紅字的地方為需要修改的部分,在 scripts 新增 "pack"與"dist"兩道命令, dependencies 的部分如果有 electron 與 electron-builder 的話,請將內容移到 devDependencies 裡,這是因為 electron-builder 在打包時不允許上述套件有相依。 build 的部分 appId 與 productName,可以自己命名,directories 是設定打包後的資料放置位置, win 的部分指的是打包 windows 平台時的參數,不寫會用預設的。

  接下來就是打包,在專案的 root 資料夾下,輸入以下
npm run dist

執行完後,可以在專案 root 資料夾下的 build 資料夾看到以下
electron-builder 建置 Windows 平台的安裝檔

在圖中可以看到 win-unpacked 資料夾,裡面有執行檔可以直接看結果,當然要透過安裝檔看結果也可以。

  一般的程式通常會需要有自己的資料,這些資料 electron-builder 並不會自己打包,要在  package.json 裡面註記才行,這裡建議把程式所需的資料都放在同一個資料夾,這樣就不用每次新增或刪除資料都要動到 package.json 。這裡提供一個範例是打包資料夾的範例,首先修改index.html
<!DOCTYPE html>
  <html>
    <head>
      <meta charset="UTF-8">
      <title>Hello World!</title>
    </head>
    <body>
      <h1>Hello World!</h1>
      我們用了 node <script>document.write(process.versions.node)</script>,
      Chrome <script>document.write(process.versions.chrome)</script>,
      以及 Electron <script>document.write(process.versions.electron)</script>.
      <img src="./ProjectData/img/test.png"></img>
    </body>
  </html>

修改的部分很簡單就是新增一個 Image ,它會去讀取 ./ProjectData/img/test.png ,請產生對應的資料夾與檔案,接著修改 package.json 如下
{
  "name": "electronbuildertest",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "scripts": {
    "start": "electron .",
    "pack": "electron-builder --dir",
    "dist": "electron-builder",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    
  },
  "build": {
    "appId": "com.xxx.app.electronbuildertest",
    "productName": "electron-builder_test",
    "directories": {
      "output": "build"
    },
    "extraFiles": [
      {
        "from": "ProjectData",
        "to": ""
      }

    ],
    "win": {
    }
  },
  "devDependencies": {
    "electron": "^6.0.0",
    "electron-builder": "^21.2.0"
  }
}

紅字的部分為新增 ProjectData 為打包資料夾,這個部分的命名可以自由更改,更改完再打包一次就可以看到結果。

參考資料

electron-builder 官網
Michael_Jheng的部落格

相關文章

初探Electron
Electron4的使用範例

2019年9月7日 星期六

關於"Vulkan開發實戰詳解"這本書

關於"Vulkan開發實戰詳解"這本書

前言

  由於最近在研究 Vulkan 就買書研究,最近出版的"Vulkan開發實戰詳解"這本書今天寄來了,看了一下後發現這本書有一些問題,在此做個紀錄。

內容

  "Vulkan開發實戰詳解"這本書是一本簡體書,該書的封面如下
Vulkan開發實戰詳解

這本書由於剛拿到並沒有看完,但看了一下發現有問題,書中解釋範例時雖然很貼心的會註明該程式碼片段在哪個檔案,但這本書並沒有隨書附贈光碟!本以為範例可能放在 Github 或者作者的網站之類的地方,但最後發現是放在出版社的异步社区 的官網。在官網搜尋該書後可以找到下載範例的位址,如下圖
範例下載位址

下載時需要登錄網站,所以需要註冊帳號,如下圖
官網的帳號註冊

官網的註冊帳號強迫使用手機號碼,由於個人很介意提供手機號碼,所以沒註冊,也就是說我沒辦法拿到範例的原始碼,看來只能等等看有沒有下載完的放在別的空間了。

  這本書在買之前請考慮是否提供手機號碼給出版社,不給手機號碼就不給範例原始碼,這"套路"我第一次碰到。這本書並不便宜,連壓光碟的錢也要省,省了壓光碟的錢又可以得到客戶的電話號碼,這套路以後可要小心小心。




2019年9月2日 星期一

關於顯示卡對 Direct3D12 的支援情況

關於顯示卡對 Direct3D12 的支援情況

前言

  在我的桌機用GPU-Z打開後會看到下圖
GPU-Z 顯示 DirectX Support 為12(11_0)

注意圖中的 DirectX Support 這個欄位,顯示的內容是 12(11_0) ,以前只覺得怪怪的,為什麼後方有個 11_0 ?恰巧最近將繪圖引擎導入 Direct3D12,在導入的過程了解到後方的數字是什麼意思,在此把學習的過程做個紀錄。

內容

  一般在初始化 Direct3D12 時會使用 D3D12CreateDevice(),就像以下
HRESULT hr=D3D12CreateDevice(pAdapter,D3D_FEATURE_LEVEL_11_0,IID_PPV_ARGS(&pDevice) );

注意第二個參數,這個參數就是在 GPU-Z 裡的 11_0,這個參數的說明可以在 [ MSDN ] D3D12CreateDevice 。如果把參數改成"D3D_FEATURE_LEVEL_12_0"或"D3D_FEATURE_LEVEL_12_1"的話,在 GTX 650 Ti BOOST 的顯示卡就會失敗。目前 Direct3D12 的最低相容是"D3D_FEATURE_LEVEL_11_0",所以範例的寫法可以解釋成用最大的相容性來製造 Device,如果不要相容性的話就改成"D3D_FEATURE_LEVEL_12_0"或"D3D_FEATURE_LEVEL_12_1"。

  要查詢是否支援 Direct3D12 話可以用 GPU Specs Database 來做查詢,以下說明查詢 GTX 650 Ti BOOST 的流程,如下圖

查詢 GTX 650 Ti BOOST 的步驟-1

在 Generation 欄位選擇 GeForce 600,接著如下圖
查詢 GTX 650 Ti BOOST 的步驟-2

在下方的資料選擇  GTX 650 Ti BOOST ,接著就可以看到結果如下
查詢 GTX 650 Ti BOOST 的結果

這個網站相當的方便,不只是桌機的顯示卡,連筆電的 GPU 也可以查詢,美中不足的是不能查手機的GPU。

參考資料

GPU Specs Database
[ MSDN ] D3D12CreateDevice