跟N2比起来, N3的资源子系统更加开放, 给予了程序员对资源的创建和管理更多的控制.

Nebula3的资源有下面向个属性:

  • 包装了一些其它Nebula子系统需要的数据
  • 可以用ResourceId共享
  • 可以在任何时候加载(初始化)和卸载
  • 可以同步或异步加载

例如典型的图形资源有网格和纹理, 但资源子系统并不局限于图形资源.

资源子系统有两个操作层次( 可能以后会把他们放入两个不同的命名空间, 现在他们都是在Resources命名空间下 ):

低层提供了真正的资源对象, 处理资源的共享, 加载和(次要的)保存. 低层的资源类有:

  • ResourceId
  • Resource
  • ResourceLoader
  • ResourceSaver
  • SharedResourceServer.

高层资源子系统提供了资源管理, 这意味着根据用户的反馈动态的加载和卸载资源. 高层资源子系统的类有:

  • ResourceProxy (又名: ManagedResource)
  • ResourceProxyServer (又名: ResourceManager)
  • ResourceMapper

下面说明资源子系统的各个类是怎么协同工作的:

一个ResourceId是一个唯一的资源标识符. ResourceId用来共享和定位磁盘上的数据(或者资源保存在哪). ResouceId是一些原子字符串(string atoms). Atom是一个常量字符串的唯一32-bit标识符, 这可以大大加快拷贝和比较, 并且可以减少内存占用, 因为标识符字符串只保存一份. 为了定位磁盘上的数据, ResourceId常常分解成一个合法的URL(例如一个ResourceId “texture:materials/granite.dds”, 会在运行时被分解成”file:///C:/Programme/[AppName]/export/textures/materials/granite.dds”.

一个Resource对象实际上是资源数据的容器. 像纹理和网格这样特定的资源类型都是Resource类的子类, 并且实现了特定的接口. Resource子类通常都是平台相关的(如D3D9Texture), 但是通过有条件的类型定义使其变成平台无关的. 并不像Nebula2那样, 资源对象并不知道怎样去组织, 加载或保存自己. 取而代之的是, 一个合适的ResourceLoader或ResourceSaver必须附属于Resource对象. 因为Nebula程序很少输出数据, ResourceSaver只 是为了完整性而存在的. 换句话说, ResourceLoader是必须的, 因为他们是启用Resource对象的唯一途径. ResourceLoader具有整个资源装载过程的完全控制. 它们可以是平台相关的, 而且也许会依赖于相关联的特定平台的Resource类. 这使得程序员可以对资源的装载过程相比Nebula2有更多的控制. 典型的资源加载类有StreadTextureLoader, MemoryVertexBufferLoader和MemoryIndexBufferLoader(从内存中加载顶点缓存和索引缓存).

Resource类也提供了一个共同的接口用来同步和异步的资源加载. 同步加载可以这样做:

  1. res-> SetResourceId("tex:system/white.dds");
  2. res-> SetLoader(StreamTextureLoader::Create());
  3. res-> SetAsyncEnabled(false)
  4. res-> Load()
  5. if (res-> IsValid()) ... 这时资源加载已经成功了, 否则LoadFailed会返回true.

异步资源加载也很相似:

  1. res->SetResourceId("tex:system/white.dds");
  2. res->SetLoader(StreamTextureLoader::Create());
  3. res->SetAsyncEnabled(true);
  4. res->Load();
  5. 资源这时进入等待状态...
  6. 只要 IsPending() return true, 就要重复地调用Load()... 当然真正的程序会在这时做一些其他的事情
  7. 接下来的某个调用Load()后时刻, 资源的状态要么是Valid(资源已经准备好了), Failed(资源加载失败)或者Cancelled(等待中的资源被取消加载了)

一个应用程序甚至是Nebula3的渲染代码通常都不需要关心这些, 因为资源管理层会处理他们, 并把异步加载的这些细节隐藏到资源代理后面.

SharedResourceServer单件通过ResourceId来共享资源. 通过SharedResourceServer创建资源确保了每个资源只在内存中加载了一份, 而不管客户端的数目. 如果客户端的数目降低到了0, 资源会被自动卸载(这并不是合适的资源管理, 而应该是ResourceProxyServer应该关心的). 资源共享完全可以直接通过标准的Nebula3的创建机制来绕过.

ResourceProxy(或ManagedResource)是对于实际资源对象的资源管理包装. 它的思想是包含的资源对象会受资源用途反馈的控制. 例如, 一个纹理代理会在被请求的纹理在后台加载时提供一个占位纹理, 屏幕上所有使用这个资源的物体都很小的话会被提供一张低分辨率的纹理, 一个X帧没有被绘制的纹理会被卸载, 等等.

ResourceProxyServer(或ResourceManager)单件是资源管理系统的前端. 除了管理附属于它的ResourceMapper的工作外, 它还是ResourceProxy的工厂, 并且把ResourceMapper跟Resource类型联系到了一起.

ResourceMapper是一个有趣的东西. 一个ResourceMapper跟一种资源类型(如纹理或网格)相关联, 并被应用程序依附到ResourceProxyServer. 它负责从渲染代码的使用反馈来加载/卸载资源. ResourceMapper的子类可以实现不同的资源管理策略, 也可以通过派生特定的ResourceMapper和ResourceLoader来创建一个完全定制的平台和应用相关的资源管理方案. 目标是显而易见的, Nebula3提供了一些好用的ResourceMapper来加载需要的任何东西.

资源使用反馈是由渲染代码写入ResourceProxy对象的, 而且应该包含这个资源的一些信息:是否会在不久后用到, 是否可见, 并估计物体占用的屏幕空间大小. 特定的反馈依赖于ResourceProxy的子类, ResourceProxy中没有公有的反馈方法.

基于资源的使用反馈, 一个ResourceMapper应该实现下面的一些操作(这取决于具体的mapper):

  • Load: 根据level-of-detail异步加载资源(如跳过不需要的高分辨率mipmap层次)
  • Unload: 完全卸载资源, 释放珍贵的内存
  • Upgrade: 提高已加载资源的level-of-detail(如加载高分辨率的mipmap层次纹理)
  • Degrade: 降低已加载资源的level-of-detail(如跟上面相反的情况)

Nebula3资源子系统相关推荐

  1. Nebula3 资源管理系统

    对于游戏开发来说,选好引擎非常关键,而引擎的基础架构以及扩展设计则是决定引擎好坏的关键之关键.在商业项目的开发中,通常我们会投入更多的考虑点到引擎配套工具的完备性和易用性上,其实对于开发人员来说,一套 ...

  2. docker 容器基础技术

    点击上方"朱小厮的博客",选择"设为星标" 回复"1024"获取独家整理的学习资料 作者:吴伟 原文链接:https://cizixs.co ...

  3. 【软件工程】实体类的持久性

    实体类 实体类表示应用程序中的持久数据库对象.它不是数据库中的持久类. 称它们持久的原因是在应用程序终止之前,实体对象的最新映射会持久保存在数据库中. 如此,同一个应用程序或者其他应用程序的后续活动就 ...

  4. Thingworx - 导航

    导航功能 参考网址 http://support.ptc.com/help/thingworx_hc/thingworx_8_hc/zh_CN/ ###1. 新建实体菜单 建模 项目 事物 事物模板 ...

  5. 突发公共卫生事件应急指挥及决策系统解决方案

    总体介绍 突发公共卫生事件应急指挥及决策系统解决方案由基础数据采集整合.专业服务决策分析.指挥和会商决策.地理信息系统展示四部分组成,从安全基础设施.应急系统安全和安全管理等三个层面综合考虑确保系统安 ...

  6. Docker容器回顾之运维篇

    一.背景 接上一篇<Docker复习之部署篇>,本文继续对Docker之日常维护常用操作做回顾总结. 官方文档: https://docs.docker.com/engine/refere ...

  7. 从王者荣耀看设计模式(十.外观模式)

    ##从王者荣耀看设计模式(外观模式) 一.简介 王者荣耀是由多人协同开发而成,每个人负责游戏的一个或多个子功能,一个完整的功能是由很多已开发的子功能组合成的.我们要玩游戏时,只需要打开王者荣耀APP, ...

  8. 系统架构设计笔记(15)—— 网络架构与协议

    网络架构是指计算机网络的各层及其协议的集合.计算机之间要交换数据,就必须遵守一些事先约定好的规则,用于规定信息的格式及如何发送和接收信息的一套规则就称为网络协议.为了减少网络协议设计的复杂性,网络设计 ...

  9. Docker介绍与使用

    容器 介绍 虚拟化 虚拟化技术就是对资源的抽象,如虚拟机,虚拟内存等 分类 从资源提供角度分 硬件平台虚拟化 操作系统虚拟化 从虚拟化实现方式分 Type I:半虚拟化,虚拟机直接运行在系统硬件上,被 ...

  10. 第26节 计算机网络知识

    第26节 计算机网络知识 计算机网络知识 1[单项选择题]Internet上的域名解析服务(DNS)完成域名与IP地址之间的翻译.执行域名服务的服务器被称为DNS 服务器.小张在Internet的某主 ...

最新文章

  1. Microbiome:城环所杨军组揭示随机过程主导亚热带河流微型真核浮游生物群落构建
  2. 如何避免操作系统中多线程资源竞争的互斥与同步?
  3. P3398仓鼠(LCA)
  4. DirectX9 SDK 下载、安装、VC++开发环境配置、跑通第一个例子
  5. python corr画图_用一张很丑的图学习Python数据可视化基础--热力图
  6. 如果CEO只给你1个月时间,如何完成从0到1
  7. ​AAAI 2022 | 基于强化学习的视频弹幕攻击
  8. java生成apk工具,生成并运行apk流程
  9. js性能优化--学习笔记
  10. 十进制 转换 2-10 进制,int的扩展方法
  11. SSL 自签证书工具源码
  12. 被问到一个简单的脚本后
  13. 使用Ecliplse时,对导入package的顺序进行设定
  14. 安卓盒子root--包好
  15. Java中把word转换成图片
  16. 微软面试题之数字谜题方案
  17. AVG7.5升级过期后新的许可代码
  18. 毛永胜计算机教师,中等职业学校网络计算机技术与应用
  19. 【九】【vlc-android】vlc-aout音频流输出端源码分析
  20. 密码库LibTomCrypt学习记录——(2.18)分组密码算法的工作模式——XTS代码

热门文章

  1. 获取Nist的美国官方标准时间的解决办法
  2. $.ajax方法success方法窗口弹不出
  3. 12.C# 接口和抽象类的区别
  4. iOS 中 .a 和 .framework 静态库的创建与 .bundle 资源包的使用
  5. vue-music 关于搜索历史本地存储
  6. Java应用基础微专业-设计篇
  7. 认识JQuery的三天--看视频得到的一些小知识点
  8. 1.1 让CPU占用率曲线听你指挥[cpu manager]
  9. 2019JS必看面试题
  10. SQL server 2008配置与用户名登录