xfangfang / wiliwili

第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上
https://xfangfang.github.io/wiliwili
GNU General Public License v3.0
3.33k stars 158 forks source link

希望能有原生支持windows on arm的版本 #138

Closed samzrx123 closed 10 months ago

samzrx123 commented 1 year ago

如题

xfangfang commented 1 year ago

@samzrx123 欢迎提供一份用于在github action编译arm windows构建结果的脚本。 我会很开心接受这样的pr,因为目前主要维护者并没有这样的设备来测试,所以只能靠有需求的大家了(应该只需要编译就行了,没有复杂的其他问题)

同时 github action中的测试版目前提供了uwp的安装包,或许arm可以安装那个?我不是很了解这些,可以试一试。

xfangfang commented 1 year ago

https://github.com/xfangfang/wiliwili/actions/runs/5035883102

我猜应该不算是原生

sunyiming commented 1 year ago

自己尝试编译了一下,发现SSL库安装报错: https://github.com/sunyiming/wiliwili/actions/runs/5316852248/jobs/9626779617

zeromake commented 1 year ago

@sunyiming 你编译的是 uwp 不是 windows,uwp那边用的 xmake 的依赖是我自己写的 repo 里的 curl,但是没有适配 arm64。

KazuhaKun commented 1 year ago

比较困难的点可能是所需要的mpv现在没有对Windows Arm64设备的支持。mpv不支持的主要原因貌似是luajit没法在上述设备上构建。我尝试在我的SPX上进行构建时遇到的问题就是这些,自己也没有足够的能力来解决。

xfangfang commented 1 year ago

比较困难的点可能是所需要的mpv现在没有对Windows Arm64设备的支持。mpv不支持的主要原因貌似是luajit没法在上述设备上构建。我尝试在我的SPX上进行构建时遇到的问题就是这些,自己也没有足够的能力来解决。

@KazuhaKun mpv 的lua支持不一定要用luajit,我记着还有其他的lua实现也可以,而且对于wiliwili来说,mpv只需要有ffmpeg和libass这两个依赖就够了。

相关:https://github.com/mpv-player/mpv/issues/10752

katelynn620 commented 1 year ago

因為UWP的版本在ARM64上無法正常執行,出自於好奇所以測試了一下怎麼編譯

在x86_64的機器想建立MSYS2 CLANGARM64環境好像怪怪的,於是直接在ARM64的機器上進行編譯,另外由於背景並不是C/C++專門,自己胡搞了一通,以下純粹記錄一下幾個重點

mpv

mpv在clangarm64上沒有,需要自行編譯,原始碼版本使用最新的v0.36.0luajit可換成lua51,但編譯會發生錯誤。照 https://github.com/mpv-player/mpv/issues/10752 裡面敘述的,在video/out/opengl/ra_gl.c的include的下方加上#undef MemoryBarrier 就可以正常編譯

wiliwili

原始碼版本使用最新的v1.1.1,編譯時會發現找不到pthread,但mingw-w64-clang-aarch64-winpthreads-git是已經裝過了,不知道怎麼修正。不過看起來可以把pthread換掉。首先打開library/borealis/library/lib/core/thread.cpp,在include下方將BOREALIS_USE_STD_THREAD隨便定義個值

#define BOREALIS_USE_STD_THREAD 1

接著是link的時候發生錯誤,看起來是新版不用link stdc++fs,編輯library/cpr/include/CMakeLists.txt

--- a/include/CMakeLists.txt
+++ b/include/CMakeLists.txt
@@ -61,7 +61,11 @@ if(CPR_USE_BOOST_FILESYSTEM)
 endif()

 if (((CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.1) OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang") AND NOT CPR_USE_BOOST_FILESYSTEM)
-    target_link_libraries(cpr PUBLIC stdc++fs)
+    if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0)
+      target_link_libraries(cpr PUBLIC stdc++fs)
+    else()
+      target_link_libraries(cpr PUBLIC)
+    endif()
 endif()

這樣就可以正常編譯成功了

實際使用

看起來就是記憶體使用會少一點,原本x84_64版本在播放中大概是500MB出頭,而ARM64的話大概是300MB出頭,其餘資源使用都差不多,執行速度也沒啥特別的感覺。

wiliwili_arm64

GPU是Adreno 685,硬解H264/HEVC都沒有問題,但不支援AV1硬解。

wiliwili_hwdecode

而且MSYS2編譯出來的檔案也需要配合一堆MSYS2環境的.dll才能執行,好像沒辦法編譯成靜態的,不知道怎麼處理。故實驗後就算了,還是用x86_64版本就好。

dragonflylee commented 1 year ago

@katelynn620 最近搞了一个在 msys2 下编译静态链接版本的 MPV 的脚本,已修复 clangarm64 下的编译

https://github.com/dragonflylee/mingw-packages

mingw64 下编译通过,~手上没有 windows arm64 的设备~

目前我这边测试的设备是 Snapdragon 845 (Adreno 630),无法支持 OpenGL3 的版本

katelynn620 commented 1 year ago

@katelynn620 最近搞了一个在 msys2 下编译静态链接版本的 MPV 的脚本

https://github.com/dragonflylee/mingw64-packages

mingw64 下编译通过,手上没有 windows arm64 的设备 你可以试试

試了一下大概還是有clang跟mingw差異的毛,沒辦法很順的直接編譯,可能得再找時間來詳細看看問題在哪

目前比較想找有沒有直接在x86_64環境上可以直接編譯出來的方法,看起來CMake-based MinGW-w64 Cross Toolchain)最近有加入clang支援,但這個感覺太複雜了,直接編譯目前有問題,又不是很好了解怎麼修改

dragonflylee commented 1 year ago

@katelynn620 修复了一下 ffmpeg 在 clang64 下的编译,本地编译时可能需要环境变量 CC=clang CXX=clang++

dragonflylee commented 11 months ago

@katelynn620 @sunyiming

实验性的编译了一版 arm64 版本,wiliwili-1.2.2-dev-arm64.zip

可以通过命令行参数 -d -v 开启调试日志

屏幕截图 2023-12-17 124009
katelynn620 commented 11 months ago

@katelynn620 @sunyiming

实验性的编译了一版 arm64 版本,其中 wiliwili_d3d11.exe 使用了 D3D11 渲染,wiliwili_gles3.exe 使用了 Angle 渲染

wiliwili-dev-clangarm64.7z 下载后把扩展名改为 .7z

可以通过命令行参数 -d -v 开启调试日志

屏幕截图 2023-12-17 124009

有時間來試試看,謝謝~

xfangfang commented 10 months ago

在 dragonflylee 的帮助下,最新版添加了 arm windows支持,可以直接下载体验,先将这个issue关闭了。 https://github.com/xfangfang/wiliwili/releases