SRP

(一)概念:

1.单一职责原则:就一个类而言,应该仅有一个引起它变化的原因。

2.职责:变化的原因。如果你能够想到多余一个的动机去修改一个类(修改一个类的代码去满足需求),那么这个类就具有多于一个的职责。

(二)解释

1.如果修改一个类,那么首先这个类需要重新编译,同时所有用到这个类的其他类需要重新链接。如果这个类的接口修改了,那么所有用到这个接口的其他类也需要修改,也就是说需要重新编译。

//

(三)proxy模式:

代理模式的共同优点如下:

(1) 能够协调调用者和被调用者,在一定程度上降低了系统的耦合度。

(2) 客户端可以针对抽象主题角色进行编程,增加和更换代理类无须修改源代码,符合开闭原则,系统具有较好的灵活性和可扩展性。

此外,不同类型的代理模式也具有独特的优点,例如:

(1) 远程代理为位于两个不同地址空间对象的访问提供了一种实现机制,可以将一些消耗资源较多的对象和操作移至性能更好的计算机上,提高系统的整体运行效率。

(2) 虚拟代理通过一个消耗资源较少的对象来代表一个消耗资源较多的对象,可以在一定程度上节省系统的运行开销。

(3) 缓冲代理为某一个操作的结果提供临时的缓存存储空间,以便在后续使用中能够共享这些结果,优化系统性能,缩短执行时间。

+

(4) 保护代理可以控制对一个对象的访问权限,为不同用户提供不同级别的使用权限。

代理模式的类型较多,不同类型的代理模式有不同的优缺点,它们应用于不同的场合:

(1) 当客户端对象需要访问远程主机中的对象时可以使用远程代理。

(2) 当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。

(3) 当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。

(4) 当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。

(5) 当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。


### SRP指令的定义 可编程渲染管线(Scriptable Render Pipeline, SRP)是一种由 Unity 提供的技术框架,允许开发者通过脚本自定义游戏引擎中的图形渲染流程。SRP 的设计目标是提供更高的灵活性和性能优化能力,使开发人员能够针对特定硬件或需求调整渲染逻辑。 具体来说,SRP 是一种抽象层,它封装了底层图形 API 的复杂性,并提供了统一接口来实现跨平台兼容性和高效的渲染操作[^1]。 --- ### SRP指令的用法 #### 1. **启用/禁用 SRP 批处理** 为了控制 SRP Batch Processor 的行为,在某些情况下可能需要手动关闭批处理器以避免不必要的开销。这可以通过设置 `GraphicsSettings` 中的相关属性完成: ```csharp // 关闭 SRP 批处理器 GraphicsSettings.useScriptableRenderPipelineBatching = false; ``` 上述代码片段展示了如何通过修改全局配置变量的方式禁用 SRP 批处理功能[^2]。 #### 2. **创建自定义渲染管线** 要构建自己的 SRP 实现,通常会继承自 `RenderPipelineAsset` 类并重写其受保护的方法 `CreatePipeline()`。该方法负责实例化实际用于执行渲染的核心对象。由于 `CreatePipeline` 方法受到访问修饰符 `protected` 的约束,只有派生类内部可以调用这一函数[^3]。 以下是简化版的示例结构: ```csharp using UnityEngine.Experimental.Rendering; public class CustomRenderPipelineAsset : RenderPipelineAsset { protected override IRenderPipeline InternalCreatePipeline() { return new CustomRenderPipeline(); } } public class CustomRenderPipeline : RenderPipeline { public override void Render(ScriptableRenderContext context, Camera[] cameras) { foreach (var camera in cameras) { // 自定义渲染逻辑... } } } ``` 这段代码演示了一个基本的 SRP 构建过程,其中包含了资产类 (`CustomRenderPipelineAsset`) 和具体的管道实现 (`CustomRenderPipeline`)。 #### 3. **内存管理注意事项** 当调试基于 SRP 的项目时,可能会注意到每帧都会发生一定程度上的动态内存分配现象。这些分配部分来源于不可控因素,但也有一部分源自于我们自己编写的渲染逻辑。如果发现 GC Alloc 数值异常增高,则应仔细审查相关代码路径是否存在潜在泄漏或者低效模式[^4]。 #### 4. **适配不同平台特性** 考虑到并非所有设备均具备相同的功能集——比如 OpenGL ES 2.0 不支持现代 GPU 技术如常量缓冲区(Constant Buffer)。在这种场景下,建议利用条件编译技术配合预定义宏解决差异问题。例如: ```hlsl #if CBUFFER_START && CBUFFER_END cbuffer MyBuffer { float4 color; }; #else float4 color; #endif ``` 这里借助了 `CBUFFER_START` 和 `CBUFFER_END` 来判断当前环境是否适合采用高级资源布局方案;如果不满足前提则退回到简单声明形式[^5]。 --- ### 示例总结 综上所述,围绕 SRP 展开的工作主要包括以下几个方面: - 配置渲染批次策略; - 开发定制化的渲染管线组件; - 调优运行期间产生的额外负载; - 处理多端间的不一致情况。 以上各环节共同构成了完整的 SRP 应用生态链路。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值