-
Notifications
You must be signed in to change notification settings - Fork 143
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
上架微软商城 uwp 支持xbox的话 你是我的神 #69
Comments
确实,我xbox上哔哩哔哩用起来真的要死 |
目前移植到其他平台不在我的计划之内,但是应用本身作为一个OpenGL应用移植到其他平台在技术上确实是易于实现的,从代码实现的设计上也考虑到了多平台处理(有一点考虑但是不多) 应用外部依赖不多,用于视频播放的有ffmpeg和mpv,用于画面显示的可以是SDL2或GLFW。所有能运行上述库的平台都能“轻松”移植wiliwili。 欢迎任何有这个想法的程序员参与,我没有相关的设备和时间来实现,如果有问题或者有想法欢迎在一开始就联系我,我可以随时提供支援。 ps 云之幻大佬的哔哩是不是可以在xbox上运行? |
云之幻大佬的已经寄了(悲 |
云之幻大佬的哔哩可以在xbox上运行,但是他的API已经没法用了,现在看不了视频。 |
如果是不支持OpenGL的话,移植就会费力一些,画面渲染部分需要移植nanovg,这一步可能有其他人已经做过了。 视频播放部分就比较麻烦,因为libmpv貌似只提供了OpenGL接口,所以可能需要直接用ffmpeg重写一下播放器,或者给mpv增加DirectX的接口。 补充一下 libmpv 除了OpenGL 接口,也支持软件渲染,包括楼下说的貌似也有其他图形api的支持,所以mpv和ffmpeg这边应该问题不大 |
@xfangfang |
@zeromake 感谢收集这些信息,wiliwili 目前也支持使用 sdl2 来负责输入与创建窗口。(实现的是比较基础的部分,有一些细节和使用 glfw 实现的部分有出入) 貌似从可行性上看是没什么大问题了,现在就差一个愿意研究这一方面的程序员啦! |
大佬他又开始更新啦 |
@xfangfang
其它依赖倒是没啥问题,一些 xmake 官方没有维护的库我自己放到 https://github.com/zeromake/xrepo 里了。 |
@xfangfang tweeny 是打包的 .h 里漏掉了 |
borealis里面的库究竟是什么版本我也不是很清楚,原作者好像是直接把代码复制进来的样子。 或者是原作者是使用他在readme提及的subrepo来维护的外部项目:https://github.com/ingydotnet/git-subrepo 我在后续的开发中,外部依赖应该只调整了nanovg,glad和glfw。 nanovg是跟着官方最新版更了一下,并且又手动更新了stb_image 和 stb_truetype glad是手动增加了几个opengl 2.1的定义 glfw的修改目的是让pc端支持输入法,官方的版本目前还不支持 相比于原版borealis增加了sdl2的支持,不过sdl2我没有实现对应的输入法支持 相当期待实现的那一天! |
@xfangfang |
@xfangfang
现在有个问题,我在 |
鼠标点击的问题 有一个需要注意的点(我不确定metal有没有类似的问题,看代码里的注释说是不需要判断dpi,但还是提一嘴),OpenGL mac 下 鼠标点击要注意不同屏幕下的区别,开启了 hidpi 之后的屏幕和未开启 hidpi 是不一样的。
可能是因为 VideoContext 构造函数里调用了 glfwWindowFramebufferSizeCallback,导致的这个问题,之前我好像也是直接弄的全局变量。 一个简单的修复是,可以试一试在 VideoContext 构造函数里使用下面的方法来初始化窗口大小(使用sync包裹一层): #include <borealis/core/thread.hpp> // 修改前
// Setup scaling
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glfwWindowFramebufferSizeCallback(window, width, height);
int xPos, yPos;
glfwGetWindowPos(window, &xPos, &yPos);
glfwWindowPositionCallback(window, xPos, yPos);
// 修改后
brls::sync([this](){
int width, height;
glfwGetFramebufferSize(window, &width, &height);
glfwWindowFramebufferSizeCallback(window, width, height);
int xPos, yPos;
glfwGetWindowPos(window, &xPos, &yPos);
glfwWindowPositionCallback(window, xPos, yPos);
}); brls::sync 会在主循环里执行,在这种情况下,就是 VideoContext 创建好之后的第一次循环立刻执行。 (感觉好像有些丑陋,或者是把上面这段搞个函数,然后放在 GLFWPlatform::createWindow 中初始化 VideoContext 后调用一下) |
@xfangfang 搞定了 sdl 的 uwp 了,打包和编译还是有些问题(现在是手动拼命令去执行的),我和 xmake 作者讨论一下怎么自定义支持 winrt 编译吧。 |
@zeromake 好消息! 我如果通过增加编译选项把mpv的画面绘制从现在的opengl改到支持软件渲染,然后直接调用nanovg的api来绘制会不会对你后面的开发方便一些? |
@xfangfang |
@xfangfang |
@xfangfang |
@zeromake 这个问题有可能是mpv的某些设置导致的,在 software-render 分支可以先删除这条(我不确定这一条和软件渲染有没有关系,但是删除了mpv也会自动识别,所以影响不大,这一条最开始是尝试在switch上降低功耗增加的,本来就可以删掉):
然后在这里修改 PIXCEL_SIZE 和 sw_format: wiliwili/wiliwili/include/view/mpv_core.hpp Lines 139 to 152 in 278977e
可能出现的设置可以是:rgba8, bgra8, rgb10_a2, rgba16...... 具体内容可以直接在mpv的仓库里搜搜代码,这个我也没找到文档。 这里该怎么设置,应该和 nanovg 使用的像素格式相关。 我在写的时候就想着可能这里会有问题,但是也不确定就没写成宏定义。 我另外又发现了一种可能的mpv嵌入窗口的方式,不过还需要实际验证一下。 使用到了这个选项的相关的代码有: 我有点想在mac上使用这个方式改到 vulkan 或者 metal,因为我发现升级了macOS13之后 OpenGL 开发的应用 vsync 失效了,或者还有什么其他问题,结果就是GPU占用极高。 感觉马上就都搞好了,加油!!! |
@xfangfang |
顺便一提,win32 下也是一样的问题,之前没问题应该是忘记重新编译了。 |
感觉也有可能是 PIXCEL_SIZE 的问题,看画面颜色好像没问题,或许改到8或者16试一试? |
@xfangfang 改过了,改的越大内容越少,改小直接内存访问异常 |
切到 opengl 是可以的,dx11 就不行了。 |
翻了 sdl 的 dx11 texture 渲染,搞定了 |
完美啊,这效率也太高了 |
@xfangfang 试了一下 winrt 发现不行,应该是又手抖把 opengl 看成 dx11 了……,不过找到 sdl 的示例了应该不远了 |
@xfangfang 你有空可以改成裁剪图片的方式来支持缩小的逻辑,我就先这样处理吧,实际上拖拽放大的过程中确实看到了多次触发。 |
@zeromake 因为我对 vc 那一套不是很了解,一直想用 msys2 来编译,部分代码整合了之后才发现用 msys2 的话 windows SDK 链接不进来。 防抖动的问题,从 borealis 那里解决了一下:xfangfang/borealis@7d25b24 uwp的支持有点想单独开个分支来维护了,感觉代码变更的有点多,把这么多内容合并进来还是比较耗时间的(再次给大佬点赞👍) 未来几天的时间,我准备先去解决一下 部分视频点赞投币失效 和 windows 上 glfw 触摸的问题。 |
我有空帮你做一下 cmake 支持吧,我把那个窗口 dpi 缩放窗口的逻辑去掉(效果也不是很好),剩下的改动就全部是兼容代码了(各种库的更新兼容,fmtlib 的 c++20兼容,msvc兼容)和 sdl + dx 适配,我还是比较希望合并到主分支的(否则写那么多代码有点浪费)。
第一步还是先做为一个分支到 wiliwili 仓库里吧,你先把我拉进去吧。 |
万分感谢,已经邀请了 |
哇!期待 Xbox 版! |
@xfangfang |
@zeromake 万分感谢 我对uwp和微软这些不是特别了解,我理解的意思是,咱们现在已经有可以安装的安装包了,如果上架到应用商店就可以让大家直接在 xbox和windows上下载使用了。 感觉他这一套要做的事还不少,看来我们需要一个有类似经验的朋友,或者已经有开发者账号愿意帮忙提交的朋友了。 |
@xfangfang |
@xfangfang |
@xfangfang https://github.com/xfangfang/borealis/compare/wiliwili...xfangfang:borealis:uwp?expand=1 |
@zeromake 非常感谢 我最近在做几个修改,包括:重写一下搜索页(正在做)、完善评论区图片显示、优化一下图片缓存的方式和直播弹幕(有可能不做,主要看switch那边好不好做) 上面说的这几个修改做好之后我再来合并您的代码如何?这期间如果方便的话可以研究研究 winrt 的 ci,这样合并之后如果出了什么问题也能快速发现。如果winrt客户端编译比较慢的话不需要和现有的放在一起,单独放一个文件也可以。 刚刚跑了一下,似乎出了点问题:https://github.com/xfangfang/wiliwili/actions/runs/4783311777/jobs/8503466226 应该是 fmt::runtime 的问题,这里为什么要加他呢? |
@xfangfang 这个问题 borealis 需要先合并进去,fmt::runtime 是 c++20 的 libfmt 的静态推导(msvc c++17 没有 struct 命名初始化,在 c++20 才有。),我可以改成: |
@zeromake 如果只是在输出log里_i18n存在问题的话,可以直接删除那些内容,当然有时间的话改一下来兼容更好啦,我之后再看看哪些可以删除。 borealis 的部分我在本地跑了一下是没啥大问题的(cmake加条 -DBOREALIS_USE_OPENGL 就行),有一个小疑问是,我看到最后一次提交删除了 GLFW_SOFT_FULLSCREEN,我没有具体测试过这个参数的效果,但是据原作者说,如果加上了这个可以在全屏时让输入法显示在窗口之上:clear-code/glfw@36ff2b3 |
我以为是不知道哪里来的代码看yoga 分支 diff 里没有就给删了 |
@zeromake 好的呀,那我先把上一条提交合并进 wiliwili 分支啦? |
好的,我明天把它 reset 掉 |
@xfangfang |
@zeromake 太棒啦 一个是之前说过的: -if (pixels != nullptr && frameSize > sw_size[0] * sw_size[1])
+if (pixels != nullptr && frameSize != sw_size[0] * sw_size[1]) 这里之前这么改是因为我把 nvgCreateImageRGBA 和 pixels 的创建放在一起了,会导致 frameSize 减小时 nanovg生成的纹理尺寸不会更新,后来我把 nvgCreateImageRGBA 单独放置,就应该不存在这个问题了,写成 另外一个问题是: +const static int mpvImageFlags = NVG_IMAGE_STREAMING|NVG_IMAGE_COPY_SWAP; 这两个flag应该是自定义的,nanovg默认下是没有的。虽然以后也不一定会用到这个功能,但是万一之后迁移到其他平台还是可以用来作为备选方案的,所以这里最好加个判断。 还发现多了一个 demo/sw.c 这个是不是误传的呀? 感觉这几个小问题解决之后,我就可以直接合并到 |
@zeromake 貌似还有一个问题,dev分支还有点东西没有合并进uwp分支,如果方便的话也可以先合并进去 |
@zeromake 我刚刚把最近的更新推送到dev分支了,如果没在做前面说的这些事的话,我可以现在花点时间来合并一下uwp分支,如何? |
@xfangfang 在搞了,处理 dev 冲突…… |
@xfangfang |
@zeromake 好的,我又确认了一下,都很完美,已经合并啦 |
@zeromake borealis glfw_video.cpp 出现一个小问题,这个是我之前写出来的问题,我想做个修改,但是不知道会不会影响到 D3D11 或者 METAL 。 /// glfw_video.cpp line 336
// Setup window state
int width, height;
glfwGetFramebufferSize(window, &width, &height);
Application::setWindowSize(width, height);
#if defined(BOREALIS_USE_D3D11) || defined(BOREALIS_USE_METAL)
#else
int wWidth, wHeight;
glfwGetWindowSize(window, &wWidth, &wHeight);
scaleFactor = width * 1.0 / wWidth;
#endif
int xPos, yPos;
glfwGetWindowPos(window, &xPos, &yPos);
Application::setWindowPosition(xPos, yPos);
if (!VideoContext::FULLSCREEN)
{
VideoContext::sizeW = width;
VideoContext::sizeH = height;
VideoContext::posX = (float)xPos;
VideoContext::posY = (float)yPos;
} VideoContext 的四个值用来储存非全屏下的窗口状态,这里宽度和高度错误的使用了 Framebuffer 的宽和高,我在mac下会出现原本窗口 1280x720 但是却保存了 2560x1440,这个会导致下次启动时窗口大小错误。(但是刚好我这里显示器不够大,所以下次启动时都因为放不下窗口而重置了窗口大小和位置,所以一直没有发现) 我想要做的修改是这样的: // Setup window state
int width, height;
glfwGetFramebufferSize(window, &width, &height);
Application::setWindowSize(width, height);
int wWidth, wHeight;
glfwGetWindowSize(window, &wWidth, &wHeight);
int xPos, yPos;
glfwGetWindowPos(window, &xPos, &yPos);
Application::setWindowPosition(xPos, yPos);
#if defined(BOREALIS_USE_D3D11) || defined(BOREALIS_USE_METAL)
#else
scaleFactor = width * 1.0 / wWidth;
#endif
if (!VideoContext::FULLSCREEN)
{
VideoContext::sizeW = wWidth;
VideoContext::sizeH = wHeight;
VideoContext::posX = (float)xPos;
VideoContext::posY = (float)yPos;
} |
@xfangfang d3d11 和 metal 都是Framebuffer和WindowSize相同的,应该是没影响,靠的是 scaleFactor。 |
@zeromake 好的~ |
@xfangfang |
@zeromake 我都没意见,怎么方便怎么来。(我估计之后修改他的频率不会特别高) nanovg那个修改不是很关键,原版的 nanovg 分行的时候会自动去掉首行的空格,在评论区偶尔会显示的不太一样。我就微调了一下,想着等之后什么时候顺便再说来着。 |
插个眼 希望还有人记得 |
现在xbox上没有一个好用的bili应用了,如果这个能上去 只能说是无敌状态了
The text was updated successfully, but these errors were encountered: