2015年4月12日 星期日

解決「Scilab 因 OpenGL 而不能繪出圖形,只有空白視窗」的問題

Scilab 是一個免費、開放原碼軟體,可提供工程及科學應用領域所需的強大數值運算環境。忘了從哪個版本(F17 或 F18)開始,Fedora 就已經將之收錄在套件資料庫中,方便使用者安裝、使用。
  將工作用電腦升級到 Fedora 21 後,由於顯示卡(FX 5200)較舊,不能再使用原廠提供的驅動程式,只能用開源碼社群所開發的驅動程式。平常的用途除了慢一點外也沒什麼大礙,就不以為意。
  最近需要用到 Scilab,就安裝 Scilab 並試用一下,原本要出現一個函數圖形,結果只跳出一個空白視窗。
這一來,Scilab 的使用就不方便了,該上網找一下解決辦法。找到不少結果,而且說法相當不一致,有的說無解,有的說有解,就都試試看並將結果整理下來。

官方網站的說法

官網上的回答應該是比較正確的,但也不是百分之百完全正確,要看它的前提是什麼。
官方說法是:Scilab 5.x 使用 JOGL (the Java Binding for the OpenGL) 於繪圖功能,且為了效能考量也使用了 Java2D OpenGL 管線。而這些功能,在顯示卡原廠提供的驅動程式都有支援,但是在開放原始碼的驅動程式有時並不能正常使用這些顯示卡的功能。
  所以,不能用開始原始碼驅動程式的原因是指在『支援 JOGL』的情形下,因此若放棄使用顯示卡支援的硬體加速功能應該就可以了。

方法一:使用簡單的通用型驅動程式

使用 VESA 驅動程式,這是完全不提供支援加速功能的驅動程式。使用它就要損失不少效能,代價不小。

方法二:關閉顯示卡所有的硬體加速功能

若是使用 nouveau (NVIDIA 顯示卡的開放原始碼驅動程式)還有另一個做法,可以少損失一些效能,在開機時載入 Linux 核心的命令列中加入『nouveau.accel=1』,詳細說明請參考前文〝解決「NVIDIA GeForce2 MX 400 顯卡用 nouveau 驅動會當機」〞。
  依之前的使用經驗,效能落在原本的 nouveau 和 VESA 之間,應該是比前面的辦法好一些。

注意:方法一、二中降低整個系統圖形的執行效率,包含所有「圖形化介面」的操作效能,而非只有 Scilab。除非必要,能不用就不要用。

方法三:只關閉 OpenGL 用顯示卡的硬體加速功能﹢命令啟動

官網的說明文件另外提供兩個變通做法,經過試驗只有這個命令可行,
[SiB@Celeron-D ~]$ LIBGL_ALWAYS_SOFTWARE=1 scilab -f
其中,『LIBGL_ALWAYS_SOFTWARE=1』是設定環境變數,將 OpenGL 的功能用「軟體」方式執行。而『scilab -f』是參考 Fedora 中的 Scilab 圖示之命令形式。
  原本是由「程式選單」中的圖示啟動 Scilab,變成要由「終端機」中用命令啟動它,是有些『復古』的。應該再思考一下,是否有更方便的方法。

方法四:只關閉 OpenGL 用顯示卡的硬體加速功能﹢圖示啟動

這個方法是保留由『圖示』啟動 Scilab 的操作模式,所以對使用習慣的影響最小。既然是要設定系統的環境變數,就有幾種影響程度不同的設定方法:

1.設定為整個系統的預設環境變數

這個方法雖然簡單,但是卻會影響整個系統所有的軟體,不論其在使用 OpenGL 時是否會造成錯誤,一律關閉 OpenGL 的硬體加速。

:除了 Scilab 以外的軟體,所有使用 OpenGL 的套件都會受影響。

2.設定個別使用者在啟動 Scilab 時加入該環境變數

在 Scilab 啟動時在 Scilab 的控制台中,下『SCIHOME』這個命令,
-->SCIHOME
 SCIHOME  =

 /home/SiB/.Scilab/scilab-5.5.1
可以查得 Scilab 在個別使用者存放個人設定的目錄。在這個目錄下找一個名為「scilab.ini」的檔案,如果沒有就建立新檔,在檔案中加入這列命令『setenv("LIBGL_ALWAYS_SOFTWARE","1");』。或是用這個方便一點的命令,
[SiB@Celeron-D ~]$ echo "setenv(\"LIBGL_ALWAYS_SOFTWARE\",\"1\");" >> /home/SiB/.Scilab/scilab-5.5.1/scilab.ini
上例中的『5.5.1』是 Scilab 的版本,使用不同版本時,要記得修改。下次再啟動 Scilab 時,會自動執行「scilab.ini」中設定環境變數的命令。

:其他將來可能使用 Scilab 的使用者,都要自行設定一次,有些不方便。

3.設定所有使用者在啟動 Scilab 時加入該環境變數

通常 Scilab 使用 OpenGL 的會出問題,應該是所有的使用者在使用 Scilab 時都要關閉 OpenGL 的加速功能,而不是只有少數使用者。所以,要設定一個啟動 Scilab 系統都會設定該環境變數的命令。
  在 Scilab 啟動時,會先執行一個 Scilab 系統層級的設定命令檔,它就存在「/usr/share/scilab/etc」目錄下一個名為「scilab.start」的檔案。在「終端機」中先切換為 root 身分,再用習慣的文字編輯器開啟這個檔案,以「MATE 桌面」為例:
[root@Celeron-D ~]# pluma /usr/share/scilab/etc/scilab.start
在這個檔案的接近後段的地方,有一段執行個別使用者設定的命令,在這段命令之前加上『setenv("LIBGL_ALWAYS_SOFTWARE","1");』這個命令,
. . . . .
clear loadContrib;

setenv("LIBGL_ALWAYS_SOFTWARE","1");

// calling user initialization =========================================
if sciargs()<>"-nouserstartup" then
. . . . .
上例中,紅色這列命令就是新加入的命令。下次再啟動 Scilab 時,該環境變數就是自動加入,執行繪圖命令時顯示就正常了。

經驗分享:

  • 筆者比較推薦方法四第3種設定方式。

已測試版本:

  • Fedora 21 Workstation + MATE 1.8.2
  • Scilab 5.5.1

參考資料:

沒有留言:

張貼留言

感謝你耐心看完本文,歡迎留下任何指正、建議,筆者會儘快回應。(English is also welcome.)