【OpenGL 篇】为什么游戏总要编译着色器?

Поділитися
Вставка
  • Опубліковано 6 січ 2025

КОМЕНТАРІ • 151

  • @0w0wtiger0
    @0w0wtiger0 Місяць тому +112

    10:36 這段有問題
    OpenGLES 3.0 的確有提供 glShaderBinary 功能, 但是廠商支援少並且很難使用
    相對廠商用的是 glShaderSource 後直接 hash 取得編譯過的 binary
    但這並不是 OpenGLES 3.0 功能, 而是各家廠商當初寫 Driver 就想到這個問題了
    也就是說你在 Direct3D / Metal / Vulkan 也會看到這個功能
    另外現在都已經是 LLVM 天下了
    SPIR-V 是 LLVM IR 變形
    MIR 就是 LLVM IR
    DXIL 還是 LLVM IR
    造成目前編譯慢單純就是 LLVM 本身就很肥, 要快真的快不起來
    早期 Direct3D 用的 SIO / SB 的 IR 都是直接 Mapping 成 Machine Code

    • @lukewengongzuoshi
      @lukewengongzuoshi Місяць тому +14

      你能不能也做一个视频说明一下?

    • @liangyu9030
      @liangyu9030 Місяць тому +25

      先點讚 以免被發現我看不懂XD
      這種影片下面總是一堆大佬發言

    • @user-eu7on1un8w
      @user-eu7on1un8w 27 днів тому +10

      "glShaderSource 後直接 hash 取得編譯過的 binary"
      你這句真的看的我一頭霧水, hashing 跟 compiler 有什麽關係? 你要怎麽從 hash 取得 binary? 你用的什麽hash function? 爲什麽要hash你的源代碼而不是普通的compile?
      而且到底關 `glShaderSource` 什麽事?
      literally from gles3 docs: glShaderSource - Replaces the source code in a shader object
      it just replaces the source code of a previously created shader object with literally the param you provide into this function i dont see how that relates to compiling

    • @lekoOwO
      @lekoOwO 23 дні тому

      @@user-eu7on1un8w 兩種路徑...
      (1) Pure OpenGL: glCompileShader -> glAttachShader -> glLinkProgram -> glGetProgramBinary 取得 Shader Binary> -> glProgramBinary Load 回去
      或是
      (2) 有別的 Compile ToolChain: -> glShaderBinary Load 回去 (e.g. SPIR-V)
      兩種方法各有優缺點,要看 GPU 的實作,也沒有什麼 glShaderBinary 比較難用的問題...

    • @conanwsz
      @conanwsz 20 днів тому

      @@user-eu7on1un8w 我也看了半天,然后发现有人跟我有一样的疑问😅

  • @linuxice0609
    @linuxice0609 Місяць тому +71

    很喜歡這種說明軟體成長過程的影片,大家都是一點一點進步而來的…🥰

  • @陳輝龍-l2e
    @陳輝龍-l2e Місяць тому +20

    OPEN GL 在專業設計或繪圖比較多,因D3D是對整個畫面更新,聽說比較適合遊戲,OPEN GL是對視窗(VIEW)更新,專業軟體喜歡用

    • @mossss321
      @mossss321 Місяць тому

      @@陳輝龍-l2e 使用OpenGL可能也和跨平台有關,尤其設計繪圖軟體也常跑在Mac或少部分Linux

    • @titanfall27970
      @titanfall27970 Місяць тому +1

      open gl也跟手遊模擬也有關,畢竟現在手機還是用他,去開發者就能看到了

    • @陳輝龍-l2e
      @陳輝龍-l2e 9 днів тому

      ​@@mossss321 以前的CAD軟體(非只有AUTOCAD)都是在工作站(UNIX 系統),後來才有WINDOWS

  • @linlian1220
    @linlian1220 26 днів тому +2

    太讚的影片了, 看完後直接丟給學長問他要不要從OpenGL改成Vulkan開發哈哈

  • @ZeratulLuo
    @ZeratulLuo 29 днів тому +7

    15:26 这里演示的 SPIR-V 代码是(反汇编后的)文本格式,容易让人误解以为 SPIR-V 的设计有问题,没有采用更有空间效率的二进制格式。问了 Claude 才得知 SPIR-V 实际上就是二进制格式,只是因为会附带其独有的元数据,体积仍然会比编译前的文本格式 Shader GLSL 源代码更大。
    最近看到不少游戏初次安装都有这个编译着色器的提示,这个提示对不懂技术的玩家来说肯定超级莫名其妙,至少应该把提示信息写成“加载数据/优化系统”之类的吧。

    • @redknot-miaomiao
      @redknot-miaomiao  29 днів тому +1

      专业啊!

    • @ZeratulLuo
      @ZeratulLuo 28 днів тому

      @@redknot-miaomiao 没有没有,只是因为误解想错了去问 Claude 获得纠正,所以随手分享一下。

    • @whty
      @whty 17 днів тому

      确实。我们的ogl代码会先被编成spirv fatbin,然后再用llvm-dis反汇编到可阅读的spirv中间代码

  • @elgs1980
    @elgs1980 18 годин тому +1

    谢谢我学到了很多!哈哈,但是看了这个video,我下次见到Metal,只会读Mental了。

  • @removeb4flight119
    @removeb4flight119 Місяць тому +8

    6:17 Red Alert用的是DirectDraw,并不是D3D

  • @nickchan3437
    @nickchan3437 17 днів тому +1

    近年有玩過第一次打開要花時間編譯的就一奇異絆愛,這試玩版有夠早

  • @Wroger0123
    @Wroger0123 29 днів тому

    好棒的影片,感謝製作!

  • @Damwut
    @Damwut Місяць тому +3

    讲的太好了,感动❤

  • @eva08maicy02
    @eva08maicy02 12 днів тому

    貓貓讓我這個完全的外人有耐心地把這個影片看完😺

  • @Dogggg2456
    @Dogggg2456 22 дні тому +1

    建議以後做圖示講解的時候可以試試看用黑底 不然背面是白的有時候看了會有點難受

  • @wizardy6267
    @wizardy6267 Місяць тому +61

    其实吧,你少问了一个问题,为啥非要在进游戏之后才编译?硬件驱动和编译器都在本地又不会轻易改变,在下载游戏的时候把需要编译的shader代码资源和其他文件分开,先下载然后在下载其他资源的时候在后台开个进程/线程编译不可以么?

    • @zhengguo3178
      @zhengguo3178 Місяць тому +21

      除非所有游戏商店都愿意这么,这不是开发商自己能决定的事情。

    • @hk021083
      @hk021083 Місяць тому +74

      你不會容許遊戲在你不玩的時候後台攪事的,遊戲主機除外

    • @wizardy6267
      @wizardy6267 Місяць тому

      @@hk021083 这视频用的是米游为例子,米游下载的时候是专用app,看不出任何理由可以阻止那个app启动一个线程

    • @wizardy6267
      @wizardy6267 Місяць тому +1

      @@zhengguo3178 什么游戏店?开个线程还要协议么?

    • @m13253
      @m13253 Місяць тому +29

      Steam 已经支持使用后台进程来编译 shader,但使用这个功能的游戏并不多。
      而且这个功能目前似乎只对 Vulkan 开放。

  • @縈夢
    @縈夢 26 днів тому

    这期让我更了解以前听到的东西了 以前大家都只会说这是什么dx11 dx12 原来背后隐藏的是这么多知识 今天也学到了不少东西呢哈哈

    • @Wind_of_Night
      @Wind_of_Night 21 день тому

      以玩家來說,就是類似於遊戲驅動引擎版本。
      越後面的版本,優化越好。【給機器運行能更有效率】。
      沒了這個驅動引擎3D遊戲跑不起來~
      如同遊戲設計會用Unreal Engine 5【虛幻引擎5】。來設計遊戲依樣~

  • @lingstein3500
    @lingstein3500 Місяць тому +3

    索尼的PS应该在安装文件里直接继承编译完的机器码,毕竟硬件完全一致

  • @wlcc7223
    @wlcc7223 15 днів тому

    6:08 時間剛好也是08表示:你這個喬紅,我本來想偷偷先收拾橙貓貓,你把我身份抖出來害我被圍攻,我只好先把你帶走啦😂

  • @benjaminmaterla
    @benjaminmaterla 21 день тому

    我记得这个影片是当时绝区零更新一次编译一次出的吧,结果现在有个更重量级的无限暖暖启动一次编译一次

  • @lolisese
    @lolisese 16 днів тому

    说到vulkan,第一个接触到的应该是幽灵行动断点,桌面上两个图标,一个后缀带有vulkan~说起来无限暖暖每次开游戏都要编译着色器,有时候还蛮久的,真离谱

  • @nanman_chief
    @nanman_chief 5 днів тому

    15:28 SPIR-V 有 binary code 格式,不會大這麼多的,只能說廠商懶 XDD

  • @gray_liu
    @gray_liu Місяць тому +16

    8:05 日常罵nvidia

  • @junhui2320
    @junhui2320 18 днів тому

    不懂就问,我每次更新手机OS后,全部游戏(绝区零,原神,鸣潮)都会编译着色器,这样也是正常现象。。吗?

  • @yoyotvyoo
    @yoyotvyoo Місяць тому

    酷啊 感謝

  • @kjyhh
    @kjyhh 27 днів тому

    比尔那个得意的表情笑死我😂

  • @waffenss1234567
    @waffenss1234567 Місяць тому +11

    大家GPU都不一樣,甚至NV/AMD 不同世代的GPU架構也不同. 程式碼一定要編譯才能讓硬體執行,你本來就遲早要編譯著色器,什麼時候要做而已.
    不先編譯好下載是因為顯卡各式各樣,還要相容”未來的顯卡”
    你2020遊戲要怎麼下載已編譯的2025年新卡的shader? 不可行.
    所以一定都是只下載中間格式,遊戲中驅動需要再呼叫編譯器去編譯
    只編譯一次是因為做完就快取暫存起來,下次不用再編譯
    除非你換顯卡

    • @lianhuang5
      @lianhuang5 29 днів тому

      steam可以发挥一下自己的作用啊,用户开始玩游戏以后,可以读取用户的配置,然后把这个编译后之后的机器码后台静默上传到服务器,后面玩家玩同一个游戏,并且设备一样的情况下,直接拉取steam的缓存不行吗?这个应该非常简单吧

    • @ShuhanLin
      @ShuhanLin 29 днів тому +3

      @@lianhuang5 玩家先下載遊戲,然後還要再等下載編譯完後的機器碼。
      Steam還要額外提供硬體設備和軟體技術支援去處理遊戲商該做的事情,對Steam有甚麼好處?如果中間某個環節出問題,Steam要出來坦嗎?

    • @lianhuang5
      @lianhuang5 28 днів тому

      @@ShuhanLin steam获得了用户的一致好评,并且steam提高了在同类型的游戏平台中的竞争力,提高自己这个游戏平台的竞争力和更好的服务玩家,让玩家的使用体验更好,不正是steam的价值吗?不然玩家完全可以转到其他的游戏平台。

    • @lianhuang5
      @lianhuang5 28 днів тому

      @ShuhanLin 而且这个搞完以后,这个服务完全可以做成付费服务例如,整出一个steam会员来,开通了steam会员可以享受这个服务,然后会员还可以参与一些特定的活动领取到一些专属的折扣码,再加上一个会员的退货时间从默认的两个小时延长到3个小时等等,这样不就可以赚钱了吗?这么搞很多用户肯定是愿意花钱的,而且steam默认的令牌机制完全可以兼容市面上的密码管理器,到时候会员在ota给一个密码管理工具的服务,你说这个会员卖你5美金一个月他良不良心

    • @ShuhanLin
      @ShuhanLin 28 днів тому +2

      @@lianhuang5 那你有看到其他平台作這個嗎?
      與其做這個還不如致力於雲端串流,現在這些都只是過渡期而已,最終目標都是雲端串流
      另外,在未經用戶許可下自動從用戶設備上上傳用戶檔案文件,也只有你們會做這種事

  • @titanfall27970
    @titanfall27970 Місяць тому +2

    稍微說一下,著色器編輯速度處決與你的處理器,多核cpu就像gpu一樣人多處理速度快,此外如果你用高速ssd也有差別,畢竟緩存到你的電腦變快,不過ssd引響通常不多,主要看你cpu的核心數跟頻率,像我的i5-13600kf有14核5.2ghz(超頻)就會比低頻率8核cpu快

  • @吴性钱
    @吴性钱 16 днів тому

    哦,无意中看到这个视频,非常好,从未了解过此类知识(我本身就是长期游戏爱好者和过气码农)。感谢 UA-cam 演算法,否则,我可能永远不会去了解。反正,有游戏玩就是了。虽然下期视频没看,但我很好奇,其实现在基本的PC游戏都是微软windows系统的天下,为何游戏公司都不直接用DX12呢?当然除了特定的SONY PS 游戏。而现在显卡不也就两个公司一统天下了吗?统一规格应该更容易吧?OPEN GL 曾经在很古老的游戏有碰到过,我记得有个在当年很精彩的三结局FPS是用纯Java开发的,就是要装 OPEN GL 才能玩的。DOOM 好像也是用。但后期,基本都是微软的DX 统一天下了。手机的游戏,和PC游戏(或PS游戏机游戏)基本没法比,例如不可能有手机游戏能有150G的容量吧(《最终幻想》、已经最新的《潜行者2》都有这个级别的)。我的意思是,如果开发纯PC游戏,能不能不搞这个“编译着色器”呢?因为好像有些游戏是不需要这功能的,我说的是5、6年前的游戏,例如早期《刺客信条》3部曲,好像没有。““编译着色器”好像的确是近些年来才看到的,而且应该是些“多平台”游戏才有,例如同时有PC版、PS版、XBOX版 那种。“编译着色器” 为什么这么讨厌,我用了10年的电脑,在运行最新的《潜行者2》时,这个“编译着色器”竟然花了1个多小时!!!然而,我看了一个UA-camr的节目,他也说他的最高配置的电脑也得花30分钟。所以,这个东西很讨厌!!!

  • @mindcontrolhk
    @mindcontrolhk Місяць тому

    學習了

  • @yanchunmichaelho7259
    @yanchunmichaelho7259 Місяць тому +4

    影片很有趣,資訊豐富,但是你把metal讀成mental還想教別人怎樣讀英文真的有點。。。

  • @angel816967
    @angel816967 11 днів тому +1

    可是無限暖暖 每次開啟每次加載真的很煩躁 明明是現代推出的遊戲

  • @asa9894114
    @asa9894114 Місяць тому +1

    空降點9:50

  • @gamenotp
    @gamenotp Місяць тому

    貓貓有沒有拿出場費?

  • @Doludoluda
    @Doludoluda Місяць тому

    為何不弄個類似 JAVA VM 來解決跨平台(GPU)的問題?是考慮到效率問題嗎?

    • @wizardy6267
      @wizardy6267 Місяць тому +13

      一个人手里拿了个锤子就以为所有问题都是钉子说的就是这个方式的回答吧…

    • @renh48
      @renh48 Місяць тому +1

      實例還有type-C跟lightning 接口得迭代

    • @jzheng7324
      @jzheng7324 Місяць тому +5

      其实跟JAVA VM是一个道理。不同的是,用VM相当于额外加一个软件层用来解析源代码供gpu使用;而视频里解释的方法是把源代码打包成一种统一IR格式,让gpu自己编译成本地的适配指令。那么问题就是,"VM"这个第三方解析的效率高,还是gpu自己的解析效率高?

    • @KaLeungYip
      @KaLeungYip Місяць тому +8

      你要明白無論AMD或是NVIDIA每一代的GPU,其實都是和前一代不相容。
      即是如果你為帕斯卡架構(即是NVIDIA GeForce 10系列)編譯的機械碼,放到圖靈微架構(即是NVIDIA GeForce 20系列)是運行不了的。
      你根本沒有可能類似 用JAVA VM方式來解決。
      這都是為什麼至今為至所有VM軟件,無論是VMware又或是Hyper-V,都無法模擬AMD或是NVIDIA顯示卡原因。

    • @久栖-k8s
      @久栖-k8s Місяць тому +1

      核心思路其實是一樣的,Java一般採用的是JIT,bytecode會被一邊直譯一邊編譯+優化,不過這個過程對代碼本身並不可見
      早期的OpenGL其實也差不多,程序只要把GL source傳遞給OpenGL driver(你要說他是VM其實也沒毛病?),然後編譯並執行 - 這個過程實際上也是個黑盒子,正如視頻提到,早期的shader是不能被緩存的,我猜是因為以前的固定管線甚至做不到或是沒必要做這種事情,而到了unified shader出現,shader也變得更複雜之後這件事情才變得比較重要
      需要注意的是,GPU本身並沒有辦法編譯shader,所以這個過程必須要在CPU端執行,問題是何時,由誰,編譯成什麼形式?
      我(不負責任)猜測實際上這邊的precompile也只是IR,實際上會由driver執行時再優化,也就是說預編譯和實際執行各自負擔了一部分的編譯

  • @TheHarrybobo0328
    @TheHarrybobo0328 Місяць тому

    有貓貓就給讚
    超好笑

  • @bon_come
    @bon_come Місяць тому +2

    簡單易懂

  • @懶大蟲
    @懶大蟲 Місяць тому +10

    免費的東西才能改變世界,這是我對這個世代的體悟。

    • @赵焰心
      @赵焰心 Місяць тому +4

      不是“免费”,而应该是“开源”。

    • @懶大蟲
      @懶大蟲 Місяць тому +1

      @赵焰心 音樂界有個傢伙放棄他的版權,所以UA-cam才有這麼多元的音樂。不過我想,你我說的是同樣的東西吧?

    • @titanfall27970
      @titanfall27970 Місяць тому +1

      @@懶大蟲 thefatrat?

    • @垃圾桶-垃圾桶
      @垃圾桶-垃圾桶 25 днів тому

      @@懶大蟲 但他媽全部人都在重複用五首歌曲在每一部影片

    • @FuryFPS-n9h
      @FuryFPS-n9h 24 дні тому

      @@懶大蟲 你的概念就是開源,免費的定義不包括讓你修改或重新發布。

  • @阿綸的全勳學院
    @阿綸的全勳學院 Місяць тому +3

    我玩仙劍奇俠傳7都很討厭那個每次開機的光線追蹤編譯器編譯
    都要等超久 沒個三四分鐘不會完成的

    • @歸虛
      @歸虛 11 днів тому +1

      檔案總管->本機->內容->進階系統設定->進階->效能->設定->進階->處理器排程->選背景服務->確定
      之後,再試試看會不會快一點。

    • @阿綸的全勳學院
      @阿綸的全勳學院 11 днів тому

      @@歸虛 喔喔喔 太感謝您了 我試試看

  • @I_will_always_love_Emilia
    @I_will_always_love_Emilia 8 днів тому

    為啥我每次開漫威爭鋒都要一次編譯著色器

  • @opaquefog
    @opaquefog Місяць тому +2

    原来是也08粉丝……

  • @sherlickli9610
    @sherlickli9610 19 днів тому +1

    没想到在UA-cam也有号,是本人吗

  • @noname-pp4rb
    @noname-pp4rb 29 днів тому +2

    09:34 OPENGL ES3.0 shader cache机制,这是编译着色器的主要原因。

  • @dontknowi467
    @dontknowi467 16 днів тому

    阿我apex每次打開都要跑這個😂

  • @MeariBamu
    @MeariBamu Місяць тому

    着色了,但機器跑不動就是跑不動,要卡就卡

  • @pbs0083
    @pbs0083 Місяць тому

    對對DX的知識多過其他API

  • @kenricktan1410
    @kenricktan1410 11 днів тому +1

    那个英语念得很好, 下次别再念了

  • @RidanDeba
    @RidanDeba Місяць тому

    為了碎形才接觸GLSL

  • @膨麻麻の薅女婿
    @膨麻麻の薅女婿 Місяць тому +2

    为什么,我玩游戏每次进去就要编一遍

    • @kjyhh
      @kjyhh 27 днів тому +2

      1 省空间(编译之后的文件你不玩这个游戏的时候就是垃圾一堆)
      2 硬件会慢慢升级,你现在觉得慢换硬件可能根本没有感觉。间接也促进消费。

  • @addr7722
    @addr7722 27 днів тому

    steam的st要浊化成sd

  • @houzeshuai
    @houzeshuai 17 днів тому

    潜行者2更厉害每次进游戏都要编译着色器,搞不明白为什么

  • @layricxu7613
    @layricxu7613 2 дні тому

    掐住他们的头,他们就受不了了,直接投降。一天天的就知道拔线,输了游戏和输了老婆一样

  • @黃子勁
    @黃子勁 14 днів тому

    我的漫威爭鋒怎模每次都在編譯

  • @杨阳-i5r
    @杨阳-i5r 28 днів тому

    again 念a gan!

  • @Wunderwaffe9828
    @Wunderwaffe9828 Місяць тому

    SGI被HPE收購了!

  • @wwxyz7570
    @wwxyz7570 Місяць тому

    再講講Vulkan

  • @RRay-ym9lv
    @RRay-ym9lv Місяць тому

    是廣快回防

  • @owendswang
    @owendswang 14 днів тому

    AMD不需要

  • @bowenxu2100
    @bowenxu2100 23 дні тому

    能不能不要一惊一乍

  • @gamenotp
    @gamenotp Місяць тому

    metal != mengtou,哥

  • @alfredli4032
    @alfredli4032 28 днів тому

    错误百出

  • @Kuraio
    @Kuraio Місяць тому +15

    能把Metal读成Mental我觉得没必要再看下去了

    • @givensur4982
      @givensur4982 Місяць тому +17

      有一定道理但不必要也不充分。日本人对很多英文都念得离谱,不影响人家发展技术。语言只是一个工具,关键在于用法

    • @tedchiu1433
      @tedchiu1433 Місяць тому +2

      難道這裡是英文教學頻道嗎?

    • @mcha0_
      @mcha0_ 29 днів тому +2

      我們計算機圖形界也是有自己的姜萍了

    • @acer4322
      @acer4322 27 днів тому +2

      會在意讀音的也就那樣了

    • @kerry_ShanLiu
      @kerry_ShanLiu 13 днів тому

      紫蜡烛是这样的。话说不利索,不耽误乌鸦学舌骚话一堆

  • @littlemonkey993
    @littlemonkey993 29 днів тому +1

    你专业视频里放多么多猫,各种拖沓搞笑容易出戏,本来认真看技术的一下子出戏。不搞笑不好玩。专业视频能看下去的人只需要看内容,不需要搞笑的。而且也不搞笑。。

    • @redknot-miaomiao
      @redknot-miaomiao  29 днів тому +7

      猫猫多可爱啊

    • @縈夢
      @縈夢 26 днів тому

      这个视频更多是科普知识吧 也不是特别高难的专业视频 我这种几乎等于不懂得都能理解 像是在看历史一样 我觉得猫猫的形式非常有趣也不影响解说