当前位置: 首页 > news >正文

非2的幂次的ASTC纹理格式尺寸对带宽的影响

1)非2的幂次的ASTC纹理格式尺寸对带宽的影响
2)​C#端如何处理xLua在执行DoString时候死循环
3)如何制定美术规范或者各个模块的指标
4)如何处理Lua的io.open出现中文路径


这是第348篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了UWA问答、社区帖子等技术知识点,助力大家更全面地掌握和学习。

Texture

Q:有一张UI纹理尺寸1200x554,纹理格式ASTC 4x4,显示占用内存0.6MB,将MaxSize改为1024,占用内存476KB。

除了内存的降低外,想请问下对带宽或其他性能的影响大么?

纹理类型是Default,Advanced -> Non-Power of 2 -> ToNearest/... 选项,但是UI没有,UI是否也有必要自己实现ToNearest?

A:题主可以参考一下知乎的这个回答:
OpenGL支持非二次幂纹理的底层原理是什么? - 知乎

也可以参考:
Why are textures always square powers of two? What if they aren't? - Game Development Stack Exchange

简单来说有如下几个信息:

  1. GPU的寻址是按块进行的,ASTC纹理的压缩也是按照块进行压缩的,因此贴图尺寸最好符合这个设定;
  2. 不满足的贴图通过补充额外空间来满足对应的需求,这里会有部分的空间浪费。

具体到题主的问题:

  1. 将MaxSize设置为1024,其实是减少了贴图尺寸,内存/显存占用变少是肯定的;
  2. 贴图尺寸降低,肯定是会减少带宽消耗,也有可能提升显存的采样命中率,包括加载方面因为文件大小变小都会有提升,但这些“好处”未必那么好量化,比较明显的应该是带宽降低。
  3. UI的贴图通常会做合图的操作,因此很多UI自身是不需要做尺寸上的要求的,但是如果不合图的话,整体上还是建议按照power of 2的尺寸在做设计,这种规范比较简洁清晰,容易执行。

感谢贾伟昊@UWA问答社区提供了回答


Script

Q:我使用xLua作为游戏的内嵌脚本语言,允许玩家自定义脚本。

现在有个玩家在脚本里面写了一个死循环,当我用DoString去加载这个脚本时候会直接卡死,于是我在外面加入了一个Task:

var isSucceed = false;
var task = Task.Run(() => { 
isSucceed = sandbox.DoString(xxxx)//这里简化一下.核心就是加载这个脚本执行DoString
});bool isCompletedSuccessfully = task.Wait(TimeSpan.FromMilliseconds(1500)); //1.5s timeoutif (!isCompletedSuccessfully)
{CELog.LogError("加载脚本超时");isSucceed = false;luaEnv.Dispose(); //Kill掉当前的Evnreturn; //不再加载后续脚本
}

现在是只要调用‘luaEnv.Dispose()’编辑器就直接闪退,无论是这里Timeout了调用,还是等几秒以后。

我感觉是因为Task的Timeout只是在超时后回调,但是此时Lua还在死锁中,所以我无法Dispose。

官方的FAQ提了一句:

调用LuaEnv.Dispose崩溃。
很可能是这个Dispose操作是由Lua那驱动执行,相当于在Lua执行的过程中把Lua虚拟机给释放了,改为只由C#执行即可。

感觉和我这个情况是一样的,这种情况我应该怎么处理?

A:在外部结束Lua虚拟机肯定是有很大崩溃风险的,我觉得有两个思路供参考:

  1. 建立一个完整的沙盒环境,类似Dock,这个环境内运行逻辑,外部可以把这个环境销毁掉,不会对外部造成任何影响,这个在Unity下可能难度比较大,要做逻辑和表现的分离,然后构建一个纯逻辑层的运行环境。
  2. 在Lua虚拟机内部监测死循环的情况,然后自主中断,抛出Error。这个是我们现在在用的方式,改造Lua虚拟机,监测一定时间内一直在执行某些字节码超过一定阈值就认为自己是在死循环把自己结束掉。当然还有一些别的条件,比如栈深度检测等等。这种自主中断并且抛错的方式其实更加完美。具体实现可以参考这个文章的思路:
    检测 Lua 脚本中的死循环 - 链滴

个人是比较推荐第二种方案的,也是很多项目验证过的,对于UGC类型的游戏,检测并能提醒用户编辑出来了死循环非常重要。

感谢贾伟昊@UWA问答社区提供了回答


Performance

Q:在UWA问答上看到了《项目初期如何确定美术规范》这个问题的回答,感觉还是不太理解,好像这个问题是不是只能凭经验,或者通过工具不断地去趋近那个指标,并没有一个指定规范,像是从面数什么之类的来计算?比如,我同屏10人,角色面数5000,渲染模块耗时不超过12ms之类的,有没有一定的公式去量化到美术的一个指标?感觉大部分好像不是根据经验来去做这个样的一个规范,或者是参考竞品之类,UWA给的项目测量好像也没有具体的计算方式,我感觉应该是定一个基准机型,然后再去做项目的各个模块的参考,然后才得出美术或者其他的指标。问下有没有更好的办法,最近看到有根据能耗来计算然后得到各个模块的指标,有大佬有了解过这方面的知识吗?

A:具体的信息在题主引用的问答里面已经有很多的讨论了,从我个人的经验来看,还没有什么更好的办法,主要原因在于性能结果受到的各个方面的影响因素特别多。

比如,同样机型上跑40w面的画面,Shader的复杂度差异就可能让一个GPU满负载而另外一个还有很大的空余量;再举一个例子,同样的一个画面,如果你的CPU很闲,也许你就可以用一些OC算法大大降低最终画面渲染的消耗,当然,GPU有富裕也可以用GPU-Driven这样的思路来做更加高效的剔除。

因此,不同的游戏类型,不同的人来做,都可能达到完全不同的性能结果。我们定义一个机型,给定一个经验值或者参考竞品的美术资产规范,往往是保证在使用相同引擎相似技术的情况下能够保证性能的底线。这个基于经验或者参考设定的规范和指标最大的意义在于告诉你可行性,如果最终游戏的性能没有达成到预期帧率,你可以参考其他游戏或者常规的优化方式来尽量接近可行结果,当然,你也可以通过修改引擎或者渲染管线,抑或其他Trick的方式来超越这个规范,这就取决于团队能力了。除此之外,规范也是要不断根据项目的实际情况进行调整的,而非完全的一成不变。

因此想根据一个公式,可以直接量化出一个规范,这个想法可能有些过于理想,这个公式里要考虑的因素太多,每个因素之间又有互相的影响,最终我们做性能优化的时候,也常常是在这些因素之前进行平衡——比如GPU Bound了就看看是否可以拿CPU换一些计算量出来,CPU Bound了是否可以用内存来换?

至于基于能耗来计算指标,我们往往是反向的,就是当一个优化做好之后,或者上了一个新Feature之后,我们会通过控制其他变量,单独开关这个Feature来查看它带来的能耗变化(我们的统计方式是基于电流表的,理论上比接口采集的数据更加符合实际情况)。而且在这个过程中能耗是波动的,不是稳定的,所以基本无法测量出增加一个面有多少能耗的增加,增加一个DrawCall有多少能耗的增加,更何况影响能耗最多的往往是带宽。

所以,整体上基于已有的经验来看,非常准确地量化消耗或者能耗,是一件很难的事情,不同设备可能会有不同,不同项目也可能会有不同,我个人是持悲观的观点。在实际工作中,主要基于经验和参考来制定一个大致的规范,然后在正式的资源与功能不断完成之后去迭代和完善这个规范。

如果题主探索出了可量化的路径,也欢迎分享~~

感谢贾伟昊@UWA问答社区提供了回答


Script

Q:关于Lua的io.open出现中文路径,有办法处理吗?

如以下的代码,不同版本Lua有不一样的结果,我的Lua 5.1会出现Invalid Argument,用5.4创建了一个乱码文件,因为有时候避免不了中文目录,像Windows平台下有人用了中文用户名,就会出现“C:/User/中文用户/AppData”之类的路径。

local path = "C:\\新建文件夹\\test.txt"local file, error_msg = io.open(path, "w")
if file thenfile:write("这是一个示例文本文件。\n")file:close()print("文件创建成功。")
elseprint("无法创建文件。", error_msg)
end

A:网上搜到一篇文章,仅供参考:
lua io.open 中文路径-掘金

另外就是如果文件内容并不是一定要在Lua中处理的,也可以让C#去做对应的文件操作。

感谢贾伟昊@UWA问答社区提供了回答

封面图来源于网络


今天的分享就到这里。生有涯而知无涯,在漫漫的开发周期中,我们遇到的问题只是冰山一角,UWA社区愿伴你同行,一起探索分享。欢迎更多的开发者加入UWA社区。

UWA官网:www.uwa4d.com
UWA社区:community.uwa4d.com

 

相关文章:

非2的幂次的ASTC纹理格式尺寸对带宽的影响

1)非2的幂次的ASTC纹理格式尺寸对带宽的影响 2)​C#端如何处理xLua在执行DoString时候死循环 3)如何制定美术规范或者各个模块的指标 4)如何处理Lua的io.open出现中文路径 这是第348篇UWA技术知识分享的推送,精选了UWA…...

Java设计模式之策略模式

1. 策略模式介绍 1、根据它来避免 if-else 或 switch 分支判断,避免使用多重条件转移语句; 2、支持“开闭原则”,可以在原有基础上选择行为方法,同时允许增加行为方法。 2. 策略模式结构类 ① 接口或抽象类:自定义接口…...

IPv4分组

4.3.1 IPv4分组 IP协议定义数据传送的基本单元——IP分组及其确切的数据格式 1. IPv4分组的格式 IPv4分组由首部和数据部分(TCP、UDP段)组成,其中首部分为固定部分(20字节)和可选字段(长度可变&#xff0…...

Jmeter常用功能-参数化介绍

JMeter也有像LR中的参数化,本篇就来介绍下JMeter的参数化如何去实现。 参数化:录制脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统。 这个时…...

“深入探索JVM内部机制:解密Java虚拟机的工作原理“

标题:深入探索JVM内部机制:解密Java虚拟机的工作原理 摘要:本文将深入探索Java虚拟机(JVM)的内部机制,解密其工作原理。我们将介绍JVM的基本组成部分、类加载过程、内存管理和垃圾回收、即时编译器等关键概…...

C++超基础语法

💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 C👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大…...

位运算相关题目:下一个数、整数转换、配对交换

题目1:下一个数 给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。 示例: 输入:num 2(或者0b10) 输出:[4,…...

【数据结构】链表常见题目

文章目录 链表合并两个有序链表反转链表复制带随机指针的链表环形链表环形链表II相交链表移除链表元素链表中倒数第k个节点链表分割链表的回文结构链表的中间节点旋转链表链表排序链表求和 (逆序求)链表求和II (正序求)重排链表奇偶链表反转链表II <==> 链表内指定区间反…...

多家企业加入即将在2024年发射的量子卫星SpeQtral-1任务

近日&#xff0c;总部位于新加坡的量子通信技术公司SpeQtral宣布将与纳米航空电子公司NanoAvionics和卫星光子学公司Mbryonics合作执行即将到来的SpeQtral-1量子密钥分发&#xff08;Quantum Key Distribution, QKD&#xff09;卫星任务。NanoAvionics被选为卫星平台提供商&…...

shell脚本基础

目录 前言 一、概述 &#xff08;一&#xff09;、shell脚本基础概念 &#xff08;二&#xff09;、shell的类型 二、Shell变量 &#xff08;一&#xff09;、组成 1.变量名 2.变量值 &#xff08;二&#xff09;、类型 1.系统内置变量&#xff08;环境变量&#xff09; 2.自定…...

创建maven的Springboot项目出现错误:Cannot access alimaven

创建maven的Springboot项目出现错误&#xff1a;Cannot access alimaven 1&#xff09;问题2) 分析问题3&#xff09;解决问题 1&#xff09;问题 创建maven的Springboot项目出现错误&#xff1a; Cannot access alimaven (http://maven.aliyun.com/nexus/content/groups/p…...

神经网络基础-神经网络补充概念-32-神经网络与大脑

概念 神经网络&#xff08;Neural Networks&#xff09;是受到生物神经系统启发而设计的机器学习模型&#xff0c;用于处理和学习复杂的数据模式。尽管神经网络的设计和工作原理与大脑有一些相似之处&#xff0c;但它们并不完全相同&#xff0c;以下是神经网络和大脑之间的一些…...

linux自动填充密码及提示信息

背景&#xff1a;需要自动创建nvc的登录密码 sudo apt-get install expect expect 是由Don Libes基于Tcl&#xff08;Tool Command Language &#xff09;语言开发的&#xff0c;主要应用于自动化交互式操作的场景&#xff0c;借助Expect处理交互的命令&#xff0c;可以将交互…...

IC设计中主要的EDA工具有哪些? (内附EDA虚拟机安装资源)

EDA工具的使用涵盖了芯片的功能设计、综合、验证、物理设计等环节&#xff0c;更是被称作“芯片设计的工作母机”。下面就来为大家具体介绍一下常见的EDA工具。&#xff08;需要EDA虚拟机安装资源文末可领取~&#xff09; 什么是EDA&#xff1f; EDA是电子设计自动化&#xf…...

Zabbix配置通用的TCP/IP:port监控项

我们经常的用接口&#xff0c;比如说FTP、HTTP、DNS、数据库接口&#xff0c;都可以用IP:PORT方式探测其是否存活&#xff0c;那么我们去繁就简&#xff0c;就简单监控一下IP&#xff1a;PORT吧&#xff01; 1、新建主机&#xff1a; 填入主机名称、群组、Agent可以不填&…...

【RocketMQ】SpringBoot集成RocketMQ

SpringBoot集成RocketMQ 首先依旧是引入依赖 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.2</version> </dependency>然后就可以编写发送不同类…...

思腾云计算

思腾合力受邀参加第七届世界智能大会&#xff0c;届时在会上展出思腾合力 AI 服务器。诚挚邀请与会者来思腾展位&#xff08;S10-B04&#xff09;参观与交流&#xff0c;领取七彩虹电竞机械键盘与鼠标、正版NVIDIA信仰尺、公牛魔方智能USB插座、超大桌面鼠标垫等精美礼品。 由天…...

前端面试:【HTML】语义化标签、表单、媒体元素

HTML&#xff08;超文本标记语言&#xff09;是构建网页内容的基础&#xff0c;它通过一系列标签来描述页面的结构和内容。在这篇文章中&#xff0c;我们将探讨HTML的基础知识&#xff0c;包括语义化标签、表单和媒体元素。 语义化标签&#xff1a;赋予内容更多意义 语义化标签…...

2024浙大MBA/MEM/MPA四个月冲刺备考策略

近期收到很多考生的咨询&#xff1a;距离联考就仅剩四个多月的时间&#xff0c;这个管理类联考的难度如何&#xff1f;主要考些什么内容&#xff1f;现在才开始备考还有希望上岸浙大吗&#xff1f;是不是要等到明年在开始备考比较合适&#xff1f;那么今天在这里小立老师就跟大…...

Element通过v-for循环渲染的form表单校验

需求&#xff1a;有个表单信息是v-for渲染的&#xff0c;例如下图&#xff0c;通过循环遍历实现新增和删除模块&#xff0c;按照平时的写法实现校验&#xff0c;是不能实现我们想要的效果&#xff0c;根据这个需求&#xff0c;我找到了一个解决方法 1.HTML <el-form ref&qu…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面&#xff0c;开源代码 作为一个电子罗盘模块&#xff0c;我们可以通过I2C从中获取偏航角yaw&#xff0c;相对于六轴陀螺仪的yaw&#xff0c;qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

日常一水C

多态 言简意赅&#xff1a;就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过&#xff0c;当子类和父类的函数名相同时&#xff0c;会隐藏父类的同名函数转而调用子类的同名函数&#xff0c;如果要调用父类的同名函数&#xff0c;那么就需要对父类进行引用&#…...