SRP

 

一、SRP 单一职责原则(Single Responsibility Principle)
     就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。
     所谓职责,我们可以理解它为功能,就是设计的这个类的功能应该只有一个,而不是两个或更多。
     也可以理解为引用变化的原因,当你发现有两个变化会要求我们修改这个类,那么你就要考虑撤分这个类了。
     因为职责是变化的一个轴线,当需求变化时,该变化会反映类的职责的变化。
    “就像一个人身兼数职,而这些事情相互关联不大,,甚至有冲突,那他就无法很好的解决这些职责,应该分到不同的人身上去做才对。”
二、举例说明:

违反SRP原则代码:
modem接口明显具有两个职责:连接管理和数据通讯;


interface Modem
{
    
public void dial(string pno);
    
public void hangup();
    
public void send(char c);
    
public void recv();
}

 

如果应用程序变化影响连接函数,那么就需要重构:

interface DataChannel
{
    
public void send(char c);
    
public void recv();
}
interface Connection
{
    
public void dial(string pno);
    
public void hangup();
}


三、SRP优点:
消除耦合,减小因需求变化引起代码僵化性臭味

四、使用SRP注意点:
1、一个合理的类,应该仅有一个引起它变化的原因,即单一职责;
2、在没有变化征兆的情况下应用SRP或其他原则是不明智的;
3、在需求实际发生变化时就应该应用SRP等原则来重构代码;
4、使用测试驱动开发会迫使我们在设计出现臭味之前分离不合理代码;
5、如果测试不能迫使职责分离,僵化性和脆弱性的臭味会变得很强烈,那就应该用Facade或Proxy模式对代码重构;

### 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、付费专栏及课程。

余额充值