降低Fill Rate(不参与绘制的组件解决方法)

本文深入探讨了Unity游戏中填充率的概念及其对性能的影响,特别是在移动设备上的表现。文章指出,半透明物体和不必要的AlphaBlend操作是填充率升高的主要原因,并提供了一种解决方案——创建仅响应Raycast而不参与绘制的组件,以减少资源消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fill Rate(填充率)
指显卡每帧每秒能够渲染的像素数。在每帧绘制中,如果一个像素被反复绘制的次数越多,那么它占用的资源也必然更多。目前在移动设备上,FillRate 的压力主要来自半透明物体。因为多数情况下,半透明物体需要开启 Alpha Blend 且关闭 ZTest和 ZWrite,同时如果我们绘制像 alpha=0 这种实际上不会产生效果的颜色上去,也同样有 Blend 操作,这是一种极大的浪费。
在Unity中,与能直接看到的Verts/Tris/Batches数据不同,填充率并不能被直接统计到,但是我们可以通过查看OverDraw来大致查看:
在之前的项目中有很多用了“不可见”的Image作为交互响应的控件;但这些东西虽然画上去没有效果,依然占用了显卡资源,特别是有很多大块的区域…
我们只需要实现一个只在逻辑上响应Raycast但是不参与绘制的组件即可

using UnityEngine;
using System.Collections;

namespace UnityEngine.UI
{
   public class Empty4Raycast : MaskableGraphic
   {
       protected Empty4Raycast()
       {
           useLegacyMeshGeneration = false;
       }

       protected override void OnPopulateMesh(VertexHelper toFill)
       {
           toFill.Clear();
       }
   }
}
ESP32-IDF驱动OLED函数库是指用于在Espressif IoT Development Framework (IDF)环境下,控制和配置OLED显示屏的一系列API及支持文件。借助这些函数库,开发者能够轻松地将文字、图形等内容显示到基于I²C 或 SPI通信协议连接的OLED屏幕上。 通常来说,在ESP32项目中集成OLED屏幕会涉及到以下几个步骤: 1. **选择合适的库**:首先需要确定使用的硬件接口(I2C还是SPI),然后找到适用于该类型的Arduino IDE库或纯IDF组件。例如Adafruit_SSD1306是常见的针对SSD1306控制器芯片的开源库之一;对于IDF环境而言,则可以考虑esp-idf-lib等第三方提供的适配版本。 2. **安装依赖项并初始化设备**:按照所选库的要求添加必要的头文件,并完成相关的初始化工作。这包括设置正确的引脚分配以及启动对应的总线服务(如i2c_driver_install())以便后续操作。 3. **编写绘图代码**:利用所提供的高级别API绘制想要呈现的内容至缓存区(buffer), 最终通过flush或者show命令更新物理显示器内容。比如清除画面(fillScreen())、画点(drawPixel())、写入文本(print()/println()), 绘制几何形状(rectangle/circle等等). 4. **优化性能与资源管理**: 根据实际应用场景调整帧率(frame rate) 和功耗(power consumption); 合理规划内存占用(memory usage),特别是当同时处理大量图像数据时更要注意效率问题。 这里给出一段简单的示例代码片段展示如何使用`ssd1306`这个流行的OLED驱动程序: ```cpp #include "driver/i2c.h" #include <string> // 引入oled 库 #include "ssd1306.h" #define I2C_MASTER_SCL_IO 22 /*!< gpio number for I2C master clock */ #define I2C_MASTER_SDA_IO 21 /*!< gpio number for I2C master data */ void setup_oled(){ i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_MASTER_SDA_IO, .scl_io_num = I2C_MASTER_SCL_IO, // other configurations... }; i2c_param_config(I2C_NUM_0,&conf); i2c_driver_install(I2C_NUM_0,conf.mode,...); ssd1306_init(); } void draw_to_oled(const char *text){ ssd1306_clear_screen(); /* 清除整个屏幕 */ ssd1306_set_cursor(0,0); /* 设置光标位置 */ ssd1306_write_string(text,FONT_FACE7X10,/* 显示字符串 */ false); /* 是否反显 */ } ``` 需要注意的是上述代码仅为参考,具体的实现细节可能会因选用的同库而有所差异,请参照官方文档获取最准确的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值