【Rust+Vulkan】110M内存占用,1380行代码,换来的仅是一个三角形......

作者: Searchstars分类: 计算机技术 发布时间: 2024-01-14 13:46:36 浏览:25477 次

【Rust+Vulkan】110M内存占用,1380行代码,换来的仅是一个三角形......

等会上课就刷B站:
现在的ui框架都这副德行,来不来helloworld就几百兆,老框架当没说[doge]

【回复】虽然但是,Vulkan也不是UI框架啊,要窗口直接Windows API创建就行了
【回复】虽然但是,这玩意儿可不仅仅能做UI啊
【回复】ui我更推荐fltk-rs,占用很小,就是样式太古早,需要写很多样式代码
一米海狸:
想到之前知乎上看到不同语言的Hello World带运行时比较输出文件大小的,很多人说纠结这个其实没有意义,因为很多大型项目根本就不差这几兆甚至几百兆的大小。 Vulkan画个三角形且不说内存占用,光是整个流程就足够逆天了,换OpenGL最多也就十几行就搞定了,但是你用Vulkan只是用来画三角形的么?大型游戏里通过采用Vulkan带来的性能提升也是肉眼可见的,而这一千多行的代码和100M内存的代价是可以忽略的。 不要纠结在这些地方。

【回复】回复 @nxxg1024 : 游戏模拟的bug和OpenGL还是Vulkan可能关系不是特别的大…但是帧数问题的话,越偏向底层的模拟Vulkan效果越好,而且毕竟NS的原生API NVN也和Vulkan更接近一些,当然NS本身也支持Vulkan和OpenGL,如果原游戏就是纯OpenGL的游戏的话模拟器不同API之间效果对比就不会太明显了。
【回复】opengl十几行画三角形?你说的是非常古老的立即模式吧,现代opengl画个三角形可能没vulkan那么夸张,但是大几十行估计还是要的
【回复】代价代价不大,抽象API即可 体积代价也不大,这里是因为是Debug,所以就是比较费程序员
菜还不让说-:
100m 一个三角形,10000 个三角形还是 100n 你怎么不说

【回复】回复 @Searchstars寻星 :作为一个现代图形标准,显示简单的小图形有点不够看[Cat2_Boom!]
【回复】为什么要说,内行点不都知道顶点数据的占用量不大吗?作者只是吐槽一下Vulkan的起始占用而已?而且你这里犯了个逻辑错误,100m不是一个三角形,一个三角形有三个顶点,每个顶点各为一个vec4,那么一个三角形是48b(特定系统上)
【回复】所以说用 Vulkan 写简单的小东西属于杀鸡用牛刀吗
yuanronghhh:
哈哈哈,终于有人吐槽vulkan内存占用了,之前我准备封装写vulkan写图形的,然后就发现createinstance就卡一下,啥都没干,100mb就没了,最后就先换软渲染了。

【回复】不做复杂场景渲染的话,vulkan是真的杀鸡用牛刀……vulkan的起始内存占用很高,但是随着场景的复杂度增加反而优势渐显
【回复】我写的时候是c语言vulkan+glfw,所以不是语言的问题。个人感觉是vulkan需要做懒加载优化。
【回复】回复 @yuanronghhh :我写的才37,不知道你是什么情况
liamtuan:
windows给vulkan、opengl创建render context的时候,好像要通过GDI来处理,会占用一个画面大小的内存[doge],挺坑的。用DirectX就不会有这个问题,同样的事情占用只需要几M

【回复】回复 @Coder2 :真的,dx很友好的,但是只能在Windows上用。。
【回复】但是fk directx,只能windows上用,并且在minecraft上使用vulkan内存占用可比opengl低了,帧率也能轻轻松松400fps(
【回复】回复 @奈克大空我 :mc整个屏幕的面数都没别的游戏一个模型多吧
创新世纪剑魂:
这个占用还挺正常的。估计是NVIDIA吧。比较新的驱动创建device之后就是这么大。

梓沫噢:
正常占用,不用担心啦,这些API都是建立在硬件高度发展的框架下的

acehinnnqru:
…算行数可以用 tokei,哪有你这么来写来算的[笑哭]

【回复】不懂这些随便乱写的😂不过感谢你的推荐 我会试试的
DerivedCat:
实时渲染从来都是空间换时间,能换就知足吧,我没遇到过有人要反向来的。

bytesbyte:
不试试slint?用webview或是其他绑定没参考价值。

【回复】slint 用过,确实还不错,但感觉它的 sling language 还是不太成熟,能用,但还是不太好用,功能缺失也挺多,甚至不能设置窗口是否可以 resize
【回复】slint主攻嵌入式吧,桌面端感觉不够成熟。不过类似QML的语法真的很棒
AICDG:
https://github.com/CU-Production/vk-bootstrap-triangle 属于正常占用,我用glfw做窗口,vk-bootstrap做vk function loader的话一个三角也占用接近110m内存(图1)。具体代码可以看上面GitHub链接 我又额外试了一下不用function loader直接link vulkan-1.dll的方式,还是glfw做窗口,开启khr validation layer的话耗费62.6m(图2),关闭验证层耗费36.3m(图3),纯glfw窗口本身也占用22m内存(图4) rust的话估计情况就比较接近了,接近50m内存是vulkano之类loader+binding浪费的,接近30m是验证层,winit或者别的窗口系统我估计和glfw应该也大差不差20多m,也就10m内存是自己写的[doge]

【回复】你用哪些扩展,和ash要生成的binding应该没关系吧,我没看过ash的代码,但我估计也是动态loader静态binding,vulkan api的所有函数都get proc一遍存函数指针,再rust写一个binding unsafe调用,超多函数指针导致的内存占用 至于layer,vulkan config可以强行加,环境变量可以加,甚至一些第三方软件也会导致加,比如bandicam。可以用看加载dll的软件简单分析一下
【回复】感谢大佬补充,不过我的情况就比较奇怪,关闭验证层和开启验证层的内存占用区别并不大,都是 105M 左右,扩展方面我其实只开了 SwapChain ,除此以外都没开,也不知道 OpenGL怎么样,更不知道会不会在别的平台上有不同的表现,上苹果平台的话还得套一层 MoltenVK,那个占用可能得更离谱[笑哭]最后可能还真不如 Electron 套 WebGPU 了
【回复】vulkan的扩展还是挺多的,加个有各种plugin的loader就划出去不少
程安絮:
1. 把validation layer和Debug Messenger禁用了 2. 把你创建VkDevice时传入的VkPhysicalDeviceFeatures里所有字段都设为false 3. 创建VkDevice时只创建一个queue。 4. 教程里为了演示所有功能,Vertex Input, Descriptor Sets, Push Constants,Staging Buffer,Secondary Command Buffer也用了,这些也占很多内存的。 其中Staging Buffer是为了缓解内存和显存间传输带宽限制,先把数据从CPU控制的内存复制到GPU控制的内存,再把数据从GPU控制的内存复制到GPU控制的显存里,一份数据占三份内存; 实际上画个三角形,把Vertex写到Shader中,以上东西可以全都不用的。 5. 另外,VkInstance,VkDevice和VkPhysicalDevice里也保存了很多API, GPU, 操作系统平台相关的固定参数,这样就不用每次请求相关数据都麻烦一次。 总之所有牺牲的空间都用来换时间了,没有浪费,只不过对于特别简单的场景换来的时间也没什么用就是了。

【回复】回复 @程安絮 :但现在 OGL 4 各家的驱动都太烂了,甚至出现了原生比起转译既不高效也不稳定的情况。所以……最后多半还是会跑在 DX/VK 上的
【回复】回复 @davidxuang :不知道vk在linux上是不是也占用这么大? 据我个人经验推测Windows的屎山架构再加上对Vulkan的敌对态度,Vulkan在Windows上的性能应该会被打折扣。
【回复】我试过了,都禁用了也占45052KB,如果真的对内存占用很在意又不弄AI和Ray Tracing的话还是用GL吧。 GL才是专门针对光栅化的,能充分发挥光栅化节省资源的优点。

渲染 学习 编程 内存 绘制 Rust Vulkan 编程开发

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!