2021年3月18日 星期四

把 GLAD 編譯成 dll

因 LearnOpenGL 採用 GLAD 來抓取 OpenGL API,所以也研究了一下,GLAD 的好處是可以明確指定你開發程式所要支援的 OpenGL 版本,在初始化時可以檢查顯示卡是否能支援。

GLAD 可到 https://glad.dav1d.de 下載,但拿到的會是原始檔,因 GLAD 只是把 OpenGL API 的函數位址抓出來存放到程式可觸及的記憶體空間中,若採用把 glad.c 和你的專案一起編譯,則主程式(exe) 和各用到 OpenGL API 的 dll 都得把 glad.c 一起編譯,並各別呼叫 gladLoadGL() 做初始化,既浪費空問(因得各別保存 OpenGL API 的函數位址)又沒人性(因得各別 gladLoadGL() 初始化)。

我想最完美的做法是把 GLAD 編譯成 dll,這樣 GLAD 的 OpenGL API 函數位址就放在這個 dll 獨立空間中,而 gladLoadGL() 只要由主程式呼叫一次就可以了。

2021年3月1日 星期一

[轉貼]辦別執行檔為 64 位元或 32 位元

見 有程式能辦別執行檔為 64 位元或 32 位元的呢? - Mobile01

其實用 7-ZIP 就可以了,但 danfong 所提供配合批次檔的做法也有參考價值,以下覆製下來以免往後失連

@for /f "tokens=2 delims== " %%i in ('7z l "%~f1"^|find/i "cpu"') do @echo PE類型為:%%i 檔案:"%~f1"




2021年2月16日 星期二

NeHe OpenGL 教學

這是很古早以前的教學了,但還是有它的參考和歷史價值,網路上還是可找到它的教學,唯原始碼的檔案不容易找到,這論壇的有心人有完整的保留,包括 C++ 原始檔,也做了中文翻譯,介紹給大家。

尤其是原始檔為了安全的理由,大家應保留一份。

 计算机科学论坛--NeHe OpenGL教程(中英文版附带VC++源码)中英文系列 (ieee.org.cn)

2021年1月28日 星期四

OIS 輸入設備程式庫

跨平台輸入設備程式庫,包含鍵盤 滑鼠 搖桿 觸控 ,支援 cmake 編譯

到 Releases · wgois/OIS · GitHub 抓取,我取得時是 1.5 版

看一下 demos\OISConsoleDemo 子目錄中的範例大概就知道的怎麼用,以下摘錄範例的 Win 平台做簡要說明

2021年1月18日 星期一

Global 物件在 cxxlObjectPlugin 插件須注意的問題

Global 物件指的是如下的用法:

class Global_t
{
  UTF8_String Hello{"Hello..."};

public:

  // Destructor
  ~Global_t()
  {
    cout << "Global_t::~Global_t()" << endl;
  }


  UTF8_String cxxlFASTCALL GetHello() const
  {
    return Hello;
  }
}g_Global;
 

特性有三:

  1. 程式或插件載入就會自動建好
  2. 任何可用到的使用端都能直接使用
  3. 程式或插件結束前會自動執行解構程序

2020年9月4日 星期五

設計 Singleton 模式的插件

這裡的插件是指 CxxlMan2 程式庫的 cxxlObjectPlugin 插件,cxxlObjectPlugin 插件有一個特性,當某個 DLL 檔所提供的所有 cxxlObjectPlugin 物件已無使用者時,這個  DLL 檔就會被卸載。

但 DLL 檔提供的物件若是一般的 Singleton 模式物件,那麼永遠都會有一個不能放棄的持有記錄,即使已無持有者了,這個 DLL 檔也永遠卸不掉。這時可藉由 LifeCustody 這個工具的幫忙,就可以解決這問題。

因要設計成 DLL 和 使用端 兩部份,所以直接提供範例原始檔:
SingletonExample.zip

要編譯這範例須先如下的東東:

  1. CxxlMan2 程式庫 - 抓最版,順便說明檔也一起抓吧
  2. CMRegSelf 插件註冊輔助 - 內附說明
  3. LifeCustody 物件終結插件 - 內附說明

範例有提供 CMake 的支援,編譯不會很難

大致說一下這個範例,test.cpp 定義了兩個 class Input 及 class Output,建立後會各別由 DLL 插件取得 ISingleton 物件,因取得的 ISingleton 是同一個物件,所以 Input::PutStr() 輸入的文字可以由 Output::GetStr() 取出。當兩個 Input 及 Output 物件銷毀時也會通知 DLL 插件銷毀 ISingleton 物件。







2020年6月24日 星期三

函數中的靜態變數

函數中的靜態變數只在第一次呼叫這個函數才會建立,之後不管呼叫幾次都用的都是同一個,包括成員函數也一樣。如以下的範例:
 
#include <iostream>

using namespace std;

class A
{
  int m_v;
public:
  // Constructor
  A(int v)
  {
    m_v = v;
  }

  void Show()
  {
    cout << "數值:" << m_v << endl;
  }
};

class B
{
public:
  // Constructor
  B()
  {}

  void Show(int v)
  {
    static A a(v); // 函數中的靜態變數
    a.Show();
  }
};


int main()
{
  B b1;
  B b2;

  b1.Show(1); // 第一次執行會設定靜態變數,往後用的都是同一個
  b1.Show(11);

  b2.Show(2);
  b2.Show(22);

  return 0;
}