shared_ptr 的輔助類別 enable_shared_from_this

之前在《避免 memory leak:C++11 Smart Pointer》()這兩篇文章,已經大概介紹了 C++11 的智慧指標(smart pointer)了。而 C+11 提供的三種智慧指標裡面,可能被使用的機會最大的,應該還是 shared_ptr<>參考)吧?

而最近在看 Boost 的 Beast 這個新的函式庫(官網)的時候,才注意到原來 C++11 還有提供一個 enable_shared_from_this<> 類別(參考),讓一個物件可以更安全地產生對應的智慧指標。

由於感覺還算滿有用的,所以這邊就稍微紀錄一下吧。

閱讀更多»

廣告

在 QTableView 內使用 QItemDelegate 來畫按鈕

QTableView 是 Qt 的一個 model / view 的表格元件(官方文件),如果搭配 QAbstractItemModel 來使用的話,其實還算簡單好用,甚至可以很簡單地做到多個表格間的資料同步。

而如果需要表格內不只想要顯示文字、而希望可以使用一般的 QWidget 的話呢,他其實也有提供 setIndexWidget() 這個函式(文件),可以針對每一個欄位,來設定要使用的 widget。

或者另一個選擇,就是放棄使用 QAbstractItemModel,改用 QTableWidget參考),也是一個方法。

閱讀更多»

C++ 資料成員初始化 @ C++11/17(inline variable)

在 Heresy 來看,C++ 類別(或結構)的資料成員(data member)的初始化,其實一直很麻煩…因為要初始化他的值,不能像一般變數一樣,在宣告的同時就同時定義,變成要初始化的話,會變成一定要去定義類別的建構子才行…

以前的寫法,基本上就是:

class CTest
{
public:
	int m_iValue1;
 
public:
	CTest() : m_iValue1(128)  {}
};

這樣寫法一個比較麻煩的地方,就是如果有好幾個建構子的話,那每個建構子都給各自去給初始化的值。

閱讀更多»

C++ 的一些 attribute

C++ 的 attribute(參考)是在 C++11 新加入的東西。他基本上算是在程式碼裡面,加上特別的輔助說明,給編譯器看,讓編譯器可以在編譯時針對這些屬性來做處理。

這樣的功能其實以前編譯器大多是有自己定義。像 gcc 是用 __attribute__參考)、MSVC 則是有 __declspec參考,現在則算是終於有個統一的標準了。

目前 C++ attribute 的寫法滿特別的,他是直接用兩組中括號夾住、寫成 [[…]] 這樣的形式。而到 C++20 為止,也訂了超過十個 attribute 了(到還沒定案的 C++20)(除了標準定義的部分,編譯器也還有可以有自己定義的東西);在大部分的狀況下,他們主要的功能大概就是避免編譯器產生不必要的警告、增加程式碼的可讀性,以及讓編譯器更好最佳化吧~

其中有的個人覺得還算滿有用的,所以這邊就大概紀錄一下。

閱讀更多»

在 Visual Studio 2017 使用 CUDA 9.2

雖然 Heresy 個人算是滿早期開始接觸 NVIDIA CUDA 的,但是其實已經沒有在碰 NVIDIA CUDA 程式好一段時間了…不過,由於在開發的專案裡面,還是有一些地方有用到別人寫的 CUDA 程式,所以在維護的時候,還是需要去考慮他。

而根據從以前到現在的經驗,NVIDIA 針對 Visual Studio 的支援,一向不是做得很快、很好;往往 Visual Studio 已經出了新版本了,CUDA 才終於支援上一個版本…

某方面來說,這應該也是由於 NVIDIA CUDA 的重點是高速計算、大部分這個領域的用戶,其實都是把程式放在 Linux 叢集上跑的關係吧?但是,這對於一般 Windows 的開發者來說,其實還滿麻煩的…

最近,Heresy 在把手邊的專案移植到 Visual Studio 2017 上,CUDA 又出現問題了… orz

閱讀更多»

在 header 檔使用 constexpr 定義全域變數

這邊是看到《Quick Q: use of constexpr in header file》這篇文章,覺得還滿實用的,所以來記錄一下;他基本上是有人在 StackOverflow 上有人提出這個問題(頁面)後,相關的討論。

首先,「constexpr」這個關鍵字,是在 C++11 加入的東西(參考);它的用處,是將變數或函式宣告為可以在編譯階段(compile time)就可以計算出他的值。

透過這個關鍵字,除了可以讓編譯器在編譯時就針對這些東西最佳化外,更有可能讓寫出更多在編譯階段展開的語法。像是 C++17 的「if constexpr」(參考),也可以在撰寫某些程式時、更為方便。

而在某些地方,也可以看到有人建議用 constexpr 來取代 #define,來作為更好的變數定義(至少會是 type-safe 的)。

而這邊的問題是:

可以在 header 檔中,使用 constexpr 來定義變數嗎?當多個 .cpp 檔去 include 他的時候,會不會產生多個實體、或是造成變數重定義的問題?

閱讀更多»

Qt OpenGL Font 的使用限制

這篇是之前《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture》和《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture:續》這兩篇的延伸,主要是針對 Qt OpenGL 裡面,字型的問題做一些研究紀錄。

老實說,最初一直以為 Qt 應該都處理掉了,應該可以一下就弄完,結果沒想到牽扯的問題很多,一堆問題還是無解…

首先,這邊最基本的需求,就是使用 QOpenGLPaintDevice,透過 QGraphicsScene 把 Qt 的圖形介面(QWidget)以 offscreen 的形式、畫成一個 OpenGL Texture。

而現在碰到的主要問題,則是兩個部分:

  • 文字大小超過一定程度,會變成黑框
  • 部分地方的繪製效果不一致
  • High DPI 設定造成顯示結果與預期不同

閱讀更多»

邀請別人幫忙共同 debug:Visual Studio Live Share

「Visual Studio Live Share」這個東西,是微軟在去年十一月發表的一項給 Visual Studio 2017Visual Studio Code 用的外掛套件。

他主要的用處,就是當碰到自己不知道該怎麼解的程式問題的時候,可以邀請別人一起進來找問題!

他的形式就是有點像是 Google 文件的共筆模式,可以多人一起編輯、同時也看的到對方的滑鼠游標在哪裡、做了那些修改;而雖然要偵錯的程式還是在本地端執行,但是遠端近來協助的人,還是可以透過監看變數、設定中斷點等方法,來幫忙找問題~

當時在發表時(網頁),就讓人覺得是個相當有趣的功能~而對於團隊合作的程式開發來說,某方面來說應該也是有一定的實用性的。

不過,去年底發表時,這東西還只是內部測試,一般人沒辦法玩,所以當時也就看看就算了。但是,今年的 MS Build 2018,微軟則是把這東西當作開放預覽版,放出來讓所有使用者測試了!所以,有興趣的話,就可以玩看看了~

閱讀更多»

OpenVR 控制器的進階顯示方法

從買了 HTC Vive 後,Heresy 這邊一直有在研究怎麼用 OpenVR 這個 SDK 來開發 C++ 搭配 OpenGL 的虛擬實境程式,而實際上,到現在也算有些可以用的成品了。

而由於 Windows Mixed Reality 系統的頭戴顯示器(例如 Acer AH101)也可以透過「Windows Mixed Reality for SteamVR」來執行 OpenVR 的程式,所以當然也會想讓自己的程式可以支援 Windows MR 的硬體了~

基本上,在顯示的部分,只要透過 OpenVR 來開發,理論上就可以直接用(還是有些狀況就是了);但是在控制器的顯示部分,卻碰到了比較直接的問題…

那就是雖然在使用 HTC Vive 的時候是可以正確顯示的,但是在換成 Acer AH101,卻沒有辦法畫出控制器來。

閱讀更多»

使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture:續

這篇基本上是之前《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture》一文的後續。

在當時,Heresy 有提過,如果真的用 QOpenGLPaintDevice 來給 QGraphicsScene 繪製到 Frame Buffer Object 上的話,會造成文字的破碎、無法識別的狀況;而 Heresy 當時的解法,是暫時放棄 OpenGL 繪圖,而讓 QGraphicsScene 先畫到 QImage 上(raster)、然後再把它傳到顯示當作為 OpenGL 的 texture。

理論上,這個方法的確是可行的,但是實際上,在後來使用的時候,卻發現:

當介面稍微多一些東西的時候,用 QGraphicsScene 把圖形介面畫在 QImage 上要花超過 150ms… orz

如果是一般視窗環境,或許還算勉強可以接受,但是在 VR 環境下,這樣連 10FPS 都到不了的速度,是完全無法被當作「堪用」的…

閱讀更多»