ETH官方钱包

創作內容

3 GP

【程式】新開發機的相容性問題(上)

作者:Shark│2017-07-15 03:23:21│巴幣:6│人氣:1504
艾莉兒:好吔,可以在Windows 10和新顯卡上玩玩看了!
鈷寶:(東看西看,沒說話但難掩期待之情)

弄到一臺Windows 10電腦當作開發機,並把之前用的Windows 7電腦改裝成Linux開發機(裝WL雙系統),Linux換成效能較好的機器也比較方便開發,之前只能用一臺小筆電。
……事情要是這麼順利就好了,用新版OS、顯卡之後遇到幾個相容性問題,和兩位電子妖精奮戰幾天才搞定。
不過能早點發現或許是好事,如果沒在開發期發現就是正式推出後在玩家的電腦上出問題了。



1. Cyber Sprite 2設定最低支援的Windows是7以上,原本想把播聲音的底層從DirectSound換成XAudio2,不過在Windows 10跑一下……

艾莉兒:報告,找不到XAudio2_7.dll,無法起動XAudio2。

回頭查一下資料:MSDN的XAudio2 Versions說明
XAudio2_7.dll:作業系統剛裝好的時候不會有,無論Windows 7,8,10都需要安裝DirectX runtime才會有。
XAudio2_8.dll:Windows 8以上系統內建,7以下不能使用。
想了一下還是決定換回DirectSound,等以後的作品把最低支援設在Windows 8以上,或是寫Windows Phone軟體再換成XAudio2。



2. 程式可以執行,但22050Hz的音檔聽起來怪怪的,44100Hz的沒問題。
查一下音檔解碼的部分,Windows版用Media Foundation解碼,有一步要從解碼器取得sample rate和channel數量,之後DirectSound和OpenAL需要這個資訊。
本來用sourceReader->GetCurrentMediaType()取得格式,在Windows 7上取得到正確格式但Windows 10上sample rate會錯,22050的音檔也是傳回44100,以前可以為何現在不行?
要改用sourceReader->GetNativeMediaType()。



Windows版搞定,以下是Linux版

3. 開發用的Linux發行版從Mint 17.2換成18.2(基於Ubuntu 16.04 LTS)。
Linux如果在新發行版上build程式,拿到舊發行版上常會無法執行,所以要裝個較舊的發行版用來build程式,我的原則是看Ubuntu的LTS。等我做完Cyber Sprite 2可能也是2018年了,用2016的發行版應該可以。
OpenGL需求我設定3.3以上,有事先查過Intel Sandy Bridge的內顯在Linux上有支援到3.3(前一代只能到2.1,不能滿足需求故不打算支援)。

鈷寶,執行這個指令:glxinfo -B。
OpenGL core profile version string: 3.3 (Core Profile) Mesa 12.0.6
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile

OpenGL version string: 3.0 Mesa 12.0.6
OpenGL shading language version string: 1.30
OpenGL context flags: (none)

OpenGL ES profile version string: OpenGL ES 3.0 Mesa 12.0.6
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.00

有不止一個profile。

如果叫艾莉兒用早期的如下方法建context,建出來是3.0的那個。
const int visualAttr[]={GLX_RGBA, GLX_DOUBLEBUFFER,
 GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8,
 None};
XVisualInfo* vinfo=glXChooseVisual(gp->dsp, screen, (int*)visualAttr);
gppl->ctx=glXCreateContext(gp->dsp, vinfo, NULL, 1);
XFree(vinfo);


要在建立時指定OpenGL版本號,於是參考這篇改寫建context的部分(下面省略錯誤檢查的code):
Tutorial: OpenGL 3.0 Context Creation (GLX)
PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB=(PFNGLXCREATECONTEXTATTRIBSARBPROC)glXGetProcAddressARB((const uint8_t*)"glXCreateContextAttribsARB");

const int fbConfigAttr[]={GLX_X_RENDERABLE,True,
 GLX_DOUBLEBUFFER,True,
 GLX_RENDER_TYPE,GLX_RGBA_BIT,
 GLX_DRAWABLE_TYPE,GLX_WINDOW_BIT,
 GLX_X_VISUAL_TYPE, GLX_TRUE_COLOR,
 GLX_RED_SIZE, 8, GLX_GREEN_SIZE, 8, GLX_BLUE_SIZE, 8, None};
int fbCount;
GLXFBConfig* fbc=glXChooseFBConfig(gp->dsp, screen,fbConfigAttr,&fbCount);

const int contextAttribs[] = {
 GLX_CONTEXT_MAJOR_VERSION_ARB,3,
 GLX_CONTEXT_MINOR_VERSION_ARB,3, None
};
GLXContext ctx = glXCreateContextAttribsARB(gp->dsp, fbc[0], 0,True, contextAttribs );
XFree(fbc);




4. 再來處理shader,shader第一行要指定GLSL版本號#version 330,否則會視為最舊的1.0版編譯。

艾莉兒:nVidia和Intel驅動程式說shader語法有錯,之前在AMD晶片明明可以的啊。
之前的開發機是AMD晶片,這臺是nVidia和Intel就編譯不過了。
0:4(25): error: C-style initialization requires the GL_ARB_shading_language_420pack extension


只好把這部分改了。
void main(){
 const vec2 TexCoord[]={{-1,-1}, {-1,1}, {1,-1}, {1,1}};
 gl_Position=vec4(TexCoord[gl_VertexID],0,1);
 outTexCoord=gl_Position.xy*vec2(0.5, -0.5)+vec2(0.5,0.5);
}

  ↓

void main(){
 vec2 TexCoord[4];
 TexCoord[0]=vec2(-1,-1); TexCoord[1]=vec2(-1,1);
 TexCoord[2]=vec2(1,-1); TexCoord[3]=vec2(1,1);
 gl_Position=vec4(TexCoord[gl_VertexID],0,1);
 outTexCoord=gl_Position.xy*vec2(0.5, -0.5)+vec2(0.5,0.5);
}

想起以前看過一篇資料說AMD的語法檢查比較通融,只要顯卡支援這個功能就讓你用,nVidia和Intel比較嚴格,如果版本號設定3.3,即使顯卡可以支援到4.5也不讓你用超過3.3版的功能,所以會發生在AMD的機器開發後,拿到nVidia和Intel不能執行的情況。



5. 艾莉兒:總算過初始化OpenGL這一關了,可是我一執行立刻就有segmentation fault。
首先想到最近有修改聲音部分就用一個測試聲音的程式試,有查到一個地方。
跟2.一樣跟音檔解碼有關,Linux版用gstreamer解碼並用gst_pad_query_caps()取得格式,取不到sample rate和channel數量,之後給OpenAL用就出錯了。
以前在Mint 17.2可以但不知為何換了版本就不行,要改用gst_pad_get_current_caps()。



還沒完,下一個問題比較棘手,繼續弄……
引用網址:http://www.jamesdambrosio.com/TrackBack.php?sn=3644731
All rights reserved. 版權所有,保留一切權利

相關創作

同標籤作品搜尋:程式|OpenGL|Windows程式設計|Linux|Linux程式設計

留言共 1 篇留言

平板電腦
真是厲害,自己的引擎自己修,我要是遇到引擎的bug只能趕快mail開發者,然後祈禱他快點弄好,沒辦法,我對底層一點概念都沒有XD

07-26 20:31

Shark
自製引擎需要較高深的知識但有容易debug的好處,對引擎內部瞭如指掌,出問題時憑直覺就可以判斷。

只是下篇就遇到了別人函式庫的bug我也無能為力的情況,也只能對玩家說:「某某發行版本身有bug,請改用其他發行版。」07-26 21:16
我要留言提醒:您尚未登入,請先登入再留言

3喜歡★shark0r 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:[繪]巫女vs鬼怪... 後一篇:【程式】新開發機的相容性...


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情? 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】