经过我测试,相同图片没经过处理的 jpg 和 png 的确内存占用一致,用的夜神模拟器 + 预览

获取图片占用大小用的 cc.gfx.deviceManager.gfxDevice.memoryStatus.textureSize
经过我测试,相同图片没经过处理的 jpg 和 png 的确内存占用一致,用的夜神模拟器 + 预览

获取图片占用大小用的 cc.gfx.deviceManager.gfxDevice.memoryStatus.textureSize
png有透明通道,jpg没有透明通道,信息量就不一样,一般来说都是3/4的占用。一致的话,要么png本身是不带透明的,要么是cocos处理上都弄成RGBA8888的纹理了,那就是cocos本身的问题了。
2dx 默认的加载方式是 RGBA8888 creator不太清楚
大部分卡牌类游戏还真可以完全http短链接开发,除了聊天等实时的系统可能会用单独服务器开websocket链接。
短链接开发逻辑关键点,是客户端除了传统C->S->C协议以外,还会定时发起请求,服务端返回玩家数据diff,用定时轮询来模拟服务端主动推送的情况。除了轮询协议,数据diff 也会附带在每个S->C协议中,方便及时处理。
好处就是没有什么断线重连,弱网情况下表现不明显。开发起来也相对方便很多。
加载到游戏里占用内存是一致的 , 一般都是宽乘高乘4
单单从协议本身看,websocket的协议更复杂,tcp自己封装的比较轻量,ws走的还是http的包头,建立连接过程也是比普通tcp复杂,加https的话,建立连接的过程更复杂,而且ws本身应该是做了粘包逻辑,要定制协议的话,会比较麻烦,要完整熟悉整个ws的包结构和处理流程,底层都是走的tcp,ws的通信包头更大,对于普通使用场景,ws和socket本身都是基于tcp,重传等机制都是依赖tcp,ws已经封装好,使用更简单,socket更灵活
不管是png还是jpg,加载到游戏中是同一种格式的texture,内存自然是一样的。
只有压缩纹理不一样
这个应该是cocos的问题,jpg应该用RGB888的纹理格式才对,不知道为什么还要用RGBA8888。
因为 WebGL 里, RGB888 也会被提交为 RGBA8888。
有没有官方文档的,不会吧? 那那些pixel format 都没用了?
确定吗? 我找半天没找到对应的文档啊? 有的也是支持的啊
https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/texImage2D
这里

再补一张:

我在夜神模拟器测试的结果也一样,用的3.6.3
AI的回答:
在 WebGL 中,无论原始图像是 JPG 格式(通常是 RGB888)还是其他格式,当它被上传到 GPU 时,都会被转换为 RGBA8888 格式。也就是说,每个像素都会被表示为 32 位(8 位红色,8 位绿色,8 位蓝色,8 位 alpha),即使原始图像可能没有 alpha 通道。所以,使用 JPG 图像并不会减少 WebGL 的内存使用。
然而,使用 JPG 图像可能会减少网络传输的数据量,因为 JPG 是一种有损压缩格式,通常可以生成比其他格式更小的文件。但一旦图像被下载并解码,它在 GPU 中的内存表示将会是 RGBA8888,无论原始文件的格式是什么。
有没有官方文档,我都贴出文档了。texImage2D
我也发一个ai 的回答
is WebGL support RGB888
word count: 4
Yes, WebGL supports the RGB888 format, which represents colors using 8 bits for each of the red, green, and blue components. This format is commonly used for representing colors in computer graphics and is supported by WebGL for rendering 3D graphics in web browsers. If you have further questions about WebGL or graphics formats, feel free to ask!
我这个ai是这么答的:
WebGL本身并不直接支持RGB888格式。在WebGL中,当你上传一个纹理到GPU时,纹理会被转换为GPU可以更有效地处理的格式。在大多数现代的GPU中,这通常意味着所有的纹理,包括RGB888,都会被转换为RGBA8888。
这是因为GPU在处理带有alpha通道的数据时,通常可以达到更好的性能。即使你的纹理原本没有alpha通道,GPU也会添加一个全为1(即完全不透明)的alpha通道。
然而,这并不意味着你的内存使用会增加。虽然RGBA8888格式的纹理比RGB888格式的纹理每像素多用了一个字节,但是由于GPU的内存管理和数据对齐方式,实际上RGB888格式的纹理在GPU中可能也会被存储为32位的数据,即使最后的8位并未被使用。
总的来说,即使你的纹理原本是RGB888,当你将它们上传到WebGL时,它们也会被处理为RGBA8888。
我就不明白了。现在原生GPU都支持没有带alpha通道的,为什么webgl不支持,而且有没有官方文档说这个事情的?我刚才是贴了有官方文档。目前我没找到对应的文档说这个事情,ai不一定对
那我再贴一个ai的
in webgl, is rgb888 store in 3 bytes per pixel in gpu memory
word count: 13
In WebGL, the RGB888 format typically stores each pixel in 3 bytes in GPU memory, with 8 bits for each of the red, green, and blue components. This format is commonly used for representing colors in WebGL due to its simplicity and compatibility with various rendering operations. It’s important to note that while this is the typical storage method, there can be variations based on specific WebGL implementations and the underlying hardware. If you have more questions or need further information, feel free to ask!
根据你的几个问题, 我继续咨询了下AI 
纹理压缩的主要目的是减少图像数据在 GPU 内存中的占用,从而提高图形渲染的性能。虽然在 WebGL 中,纹理通常会被解码为 RGBA8888 格式加载到内存中,但是使用纹理压缩技术,如 S3TC (DXT压缩)、ETC1、PVRTC 等,可以在 GPU 中直接使用压缩纹理,而无需先解压缩成 RGBA8888 格式。
这样做的好处是可以减少 GPU 内存的使用,提高渲染性能,降低功耗。但是,这需要硬件支持这种压缩格式,而且由于这是有损压缩,所以可能会有一些图像质量的损失。
同时,纹理压缩也可以减少纹理的磁盘存储空间和网络传输带宽,这对于网络游戏和应用来说尤其重要。
所以,虽然 GPU 在加载纹理时可能会将其转换为 RGB8888 或 RGBA8888,但这并不影响纹理压缩的重要性和有效性。
对于 WebGL,虽然你可以使用不同的格式和类型来上传纹理,但是在 GPU 中,纹理通常会被转换为一种 GPU 可以更有效地处理的格式。对于大多数现代 GPU 来说,这通常意味着所有的纹理都会被转换为 RGBA8888 格式。
然而,这并不意味着你的内存使用会增加。虽然 RGBA8888 格式的纹理比其他格式的纹理每像素多用了一些字节,但是由于 GPU 的内存管理和数据对齐方式,实际上其他格式的纹理在 GPU 中可能也会被存储为 32 位的数据,即使最后的一些位并未被使用。
总的来说,无论你使用什么格式上传纹理,当它们被加载到 WebGL 中时,它们都会被处理为 RGBA8888。
在 WebGL 的官方规范中,有一部分内容是关于如何上传纹理的。当你调用 gl.texImage2D() 函数上传纹理时,你需要指定一系列参数来描述你的纹理数据,包括它的格式和类型。例如,你可以使用 gl.RGBA 和 gl.UNSIGNED_BYTE 来表示你的纹理数据是 8 位的 RGBA 格式。
然而,规范并没有明确指出这些纹理数据在 GPU 中会被如何存储。实际的内部格式,即 GPU 如何在内存中存储这些纹理,取决于许多因素,包括 GPU 的型号和驱动程序。
如果你想要更深入地了解 WebGL 的纹理处理机制,我建议你查阅 WebGL 的官方规范,或者参考其他 WebGL 开发者的经验和建议。你也可以尝试在 WebGL 社区论坛或者开发者论坛上提问,那里的开发者可能会分享他们的经验和知识。
程序员为难程序员系列:
弱弱的问一句,问的问题这么刁钻,请问贵公司的游戏产品能否看下
真的好累。想到这些面试。跟造火箭一样。工资又不高。只能说太难了。现在的社会
我们还是不要AI打架了吧,我建议cocos引擎在jpg的时候,调用webgl的texImage2D的时候使用RGB888的参数,或者用gl.RGB 配合HTMLCanvasElement调用,这样不管内部到底怎么样,应该会节省部分显存的。
除非有官方文档说明gpu是这个存储方式,用ai来说那同一个问题会有不一样的答案,我都是用的GPT-4的。
另外那个显存占用,目前其实是cocos根据纹理自己统计的。
关于GPU的纹理储存,我说一句,既然像压缩纹理这样的复杂像素格式都可以原生支持,那为什么少几个Component的纹理格式不被原生支持,我指的原生支持是在显存上按提交的bytes格式储存,不是扩展成32位的。我觉得GPU的驱动应该都可以处理好,我们只要按最省的方式提交,显存就会节省下来。