[3D游戏开发实践] Cocos Cyberpunk 源码解读-目录结构
在深入解读Cocos Cyberpunk源码之前,首先,源码源码让我们打开scene-game-start场景,烘焙烘焙启动游戏预览,网站网站进入游戏场景。源码源码asp维修源码点击START按钮,烘焙烘焙游戏正式开始。网站网站漫游摄像机将带你漫游整个场景,源码源码再次点击START,烘焙烘焙可以进入游戏。网站网站
在电脑端按ESC键或手机端点击设置按钮,源码源码查看操作说明。烘焙烘焙接下来,网站网站让我们浏览Cocos Cyberpunk项目的源码源码目录结构。在左下角的Assets窗口中,我们可以看到项目文件的分层。
首先,animations目录中仅包含用于场景漫游的摄像机动画文件。LightFX目录存储了光照贴图,这些是光照烘焙系统自动生成的,无需手动修改。res目录是整个游戏资源的集中地,包括动画、特效、模型、shader、UI、音效等资源。
resources目录则存放动态加载的资源,当前内容较少,随着游戏的完善,资源将会增多。scene目录包含了环境反射探针文件,与场景文件名对应的文件夹存放反射贴图。scene-development目录则包含一些用于单元测试的开发场景。
scripts目录存放所有游戏逻辑脚本,而src目录可能包含项目开发过程中的测试文件。test目录同样是用于测试的,存放的文件与项目无关。scene目录则是游戏主场景,而scene-game-start则为游戏启动场景,进行UI逻辑初始化,并加载游戏主场景。
自定义管线以编辑器扩展的形式存在,可将其移至项目中。管线对应自定义管线,通过在场景中新建节点并添加pipeline/graph/pipeline-graph.ts组件来查看可视化管线图。实时探针相关组件在反射探针节点上挂载,提供实时更新功能。
反射探针节点上的ReflectionUtils脚本组件实现了实时更新探针的逻辑,适用于需要实时探针的项目。此外,Cocos Cyberpunk还实现了SphereProjection修正,使得反射更符合物体形状。
静态遮挡剔除机制在Cocos Cyberpunk中实现,通过将可见关系预存入空间格子,渲染时直接查表获得渲染列表,uehtml源码极大提升效率。这一部分主要在scene场景中的static-occlusion-culling结点中处理。
机型适配策略在Cocos Cyberpunk中实现,根据设备性能选择渲染效果,确保流畅帧率。处理了不同设备上的效果调整,包括性能开关策略、机型分档策略,主要在href-settings.ts、gpu.ts和gpu-mobiles.ts文件中实现。
游戏逻辑方面,Cocos Cyberpunk包含完整的TPS游戏逻辑,init节点包含了特效、UI、对象池等节点,挂载的init.ts脚本组件确保游戏逻辑在主场景加载后持续运行。接下来,我们将对游戏逻辑相关源码进行深入解读。
UE4源码剖析——光照贴图(LightMap) 之 由烘焙到渲染流程
在离线编辑器阶段,通过构建(Build)按钮启动光照烘焙流程,UE4引擎在构建场景光照、反射球信息、预计算静态网格可见性、构建导航网格、构建HLOD、构建流式贴图等,仅关注光照相关只构建光照(Build Lighting Only)阶段,Lightmass系统负责计算光照,Swarm分布式工具加速并分担计算任务。
Swarm初始化并启动烘焙流程,Startup阶段计算光照构建的关卡与灯光信息,统计静态几何体数据并初始化Swarm,Swarm分为协调与代理程序,负责数据导出与任务分配。AmortizedExport阶段进行分摊式数据导出,SwarmKickoff阶段Swarm全面启动,AsynchronousBuilding阶段消费者程序执行任务,完成光照信息计算。AutoApplyingImport阶段根据配置决定是否自动导入烘焙结果,WaitingForImport与ImportRequested阶段等待导入烘焙数据,Import阶段完成数据导入,Finished阶段地图构建完成。
光照贴图合并大图过程,为每个静态几何体独立生成光照贴图后,UE4将多张贴图尽可能合并到一张大贴图中,以优化IO加载与渲染性能。合并算法简单,通过排序、读取最大尺寸限制与重新摆放光照贴图完成。
贴图像素设置与Mipmap生成,合并后的光照贴图设置像素值,为每种类型的光照贴图创建,最终将数据以真实形式存储。贴图包含SkyOcclusionTexture、AOMaterialMaskTexture、ShadowMapTexture与低分辨率系数贴图。
贴图渲染资源合并中,cdkey源码判断不同几何体使用的贴图集合是否一致,优化判断效率。创建FLightmapClusterResourceInput类代表贴图集合,并统计所有集合用于判断几何体是否使用相同贴图集合。
运行时光照贴图传递到Shader流程包括UE4几何体渲染架构窥探、光照信息存储、赋值LCI与生成渲染批次、绑定Shader。FLODInfo类存储光照信息,FMeshBatchElement中设置LCI字段,FBasePassMeshProcessor绑定贴图集合到Shader。在Shader代码中访问LightmapResourceCluster变量访问贴图集合中的光照贴图。
UE4通过Swarm分布式框架、Lightmass光照系统与优化的贴图合并与传递流程,实现了高效、实时的光照计算与渲染。
以上内容详细介绍了UE4引擎中光照贴图从烘焙到渲染的完整流程,包括分布式工具、数据合并、贴图存储与Shader访问,实现了高性能的光照计算与渲染。
UE4 Multi-Process Cooking(多进程烘焙)
MPCOOK(多进程Cook)是UE5.3的特色功能,它通过将Cook任务分发给多个进程,显著缩短Cook时间。由于我们项目在UE4中遇到Cook时间过长的问题,决定将MPCOOK功能移植到UE4。整个移植过程持续了约一个月,包括阅读源码、编写代码和调试。下面,我将分享这一过程中的主要思路和实现方案。
MPCOOK的核心流程涉及Host与Worker之间的通信。这两个角色通过Socket进行交互,实现任务的分发与结果的收集。在UE4中,我们面临的主要挑战是构建一个与MPCOOK结构兼容的代码框架,而不是逐行复制原代码。
网络逻辑处理中,我们选择了UE已提供的Socket功能,配合阻塞模式实现同步通信。考虑到消息处理的复杂性,我们决定用FMemoryArchive和自定义DataStream替代CompactBinary,以提升代码的可读性和可维护性。
在任务分配机制上,我们采用两种策略:LoadBalanceStriped平均分配任务,而LoadBalanceCookBurden则考虑了Cook任务和保存操作的开销,以达到更均衡的任务负载分配。在CookDirector模块中,我们实现了任务的管理,包括建立连接和分配任务等关键功能。
对于IMPCollector模块,我们简化了实现,去除了不必要的Collector,仅保留核心逻辑。IWorkerRequests接口的调整,让我们能够更清晰地区分Host与Worker的角色,优化了代码的fastqc 源码组织结构。
MPCOOK的网络相关逻辑结构复杂,为了提高代码的可读性和可扩展性,我们重新设计了Socket的实现方式,并使用FMemoryArchive和DataStream来替代CompactBinary。CookDirector的设计允许我们为每个Worker分配少量任务,每完成一批任务后再请求下一批,确保每个任务的处理时间不超过3~5分钟。
对于CookWorkerClient和CookWorkerServer模块,我们保持了与原代码相似的结构,同时考虑了拓展性需求。IMPCollector模块的调整,简化了逻辑实现,提高了移植的效率。在CookOnTheFlyServer文件的移植过程中,我们采用了继承与虚函数实现的策略,简化了代码修改流程。
在ShaderLibrary部分,由于代码的增加,移植过程非常顺利。需要注意的是,使用FMemoryArchive替代CompactBinary是关键步骤之一。
数据传输环节,我们特别关注了ShaderCode、AssetPackageData、AssetData等数据的收集与发送,确保Cook流程的完整性。在启动Worker时,我们实现了一系列步骤,包括建立连接、接收设置信息、初始化资源和开始Tick等关键操作。
对于启动Host,我们特别处理了项目中对umap资源的Cook问题,确保依赖的umap和builtdata在同一个Worker上同时加载。在Worker发现新的依赖资源时,会在Host上记录资源来源,以便在需要时重新分发给指定的Worker。
通过这一系列的移植与优化,我们成功将MPCOOK功能引入到UE4项目中。使用MPCOOK后,项目全量Cook时间从约2个半小时缩短至分钟,预计进一步优化逻辑依赖问题后,时间可以缩短至分钟以内。这一移植与优化过程不仅提升了Cook效率,也为后续的项目开发提供了更强大的技术支持。
想做一个有拼团功 秒杀 砍价功能的小程序要多少钱?
开发一款带有拼团、秒杀、砍价的小程序主要有三种方式,我们分别列一下每种方式的大概费用:
1、自己组建技术团队自己开发,需要的人员有产品经理、框架工程师、JAVA、PHP、前端、后端、测试工程师,nanohttp源码开发周期在1-2个月以上。人员成本5-万起步,后期维护成本没算。
2、购买别人的小程序源码,并且自己配置服务器,再找个技术人员专职维护。源码费用一般-,服务器一年至少,维护成本每月以上。
3、使用第三方小程序,购买第三方小程序使用账号,总费用根据自身需求,费用5千元不等,不用担心技术维护、不用建服务器,拿过来就可以使用,还可以根据自己的搭建要求设计和制作。
高瓴、源码联合领投低代码开发平台;武汉烘焙品牌获万融资 | 投资速递
今日投资速递一览 低代码开发平台ILLA Cloud艾拉云科获得天使轮融资,由高瓴创投和源码资本种子基金联合领投,资金主要用于产品研发和市场推广。艾拉云科是面向开发者的开源低代码开发平台,旨在帮助开发者快速建立企业内部应用,节约数据调用与页面设计的时间,具有面向开发者、数据整合、协同开发、灵活部署等功能与特点。 烘焙品牌麦子妍茶完成A轮融资,获得万元资金,由傲岩基金投资。麦子妍茶以现烤、咖啡、奶茶为主打的复合式烘焙坊闻名,旗下有众多创新烘焙产品。 能源技术综合解决方案提供商奥腾能源完成数千万元A轮融资,投资方为涌金资本旗下的涌铧基金,资金将主要用于技术迭代、产品研发与市场业务拓展。 富锂锰基正极材料研发生产商宁夏汉尧完成5亿元B轮融资,由金石投资、洪泰基金领投,资金主要用于产品技术升级与市场扩张。 PANONY完成A轮融资,以1亿美元估值,融资金额未披露,由NGC Ventures等参投,资金将用于业务扩张与服务产品线的扩大。 肿瘤免疫治疗药物研发商百迈生物医药完成数千万元A+轮融资,由元生创投独家领投,资金用于肿瘤免疫治疗新药临床试验的推进。 智能选矿公司好朋友科技完成近亿元B轮融资,由金沙江联合资本投资,资金将用于新产品研发与客户服务能力的提升。 医疗健康服务平台医丞健康完成数千万元天使轮融资,由长岭资本领投,资金将用于社区医院及家庭医生服务效率的提升。 高分子材料功能助剂研发生产商一化工完成首轮近千万元融资,由高瑞基金投资,资金将用于产线建设、研发投入与数字化系统搭建。 医疗器械开发商康迪泰科获得万元新一轮融资,由百心安投资,用于心血管器械的研发与生产。 AI数据服务商恺望数据获得千万元级天使轮融资,投资方包括辰韬资本、三一集团和溪山天使汇,资金将用于团队建设与技术研发,打造自动驾驶数据服务平台。 新能源技术研发商蓝京新能源完成Pre-A轮融资,由华睿领投,清流投资及部分老股东跟投,资金将用于加速大圆柱电池的技术开发和产品工程验证。 此外,还有涉及酒店、餐饮、医疗、技术、教育等多个领域的企业获得融资或完成IPO排队,展现了不同行业内的投资动态和市场趋势。一篇文章了解CI/CD管道全流程
从CI/CD过程开始,包含所有阶段并负责创建自动化和无缝的软件交付的一系列步骤称为CI/CD管道工作流。使用CI/CD管道,软件发布工件可以从代码提交阶段到测试、构建、部署和生产阶段在管道中移动和前进。这个概念非常强大,因为一旦指定了一个管道,它的一部分或全部就可以实现自动化,从而加快流程并减少错误。换句话说,CI/CD管道使企业更容易一天自动多次交付软件。
DevOps工程师经常会因为CI/CD中各个阶段的自动化而与CI/CD管道混淆。虽然不同的工具可以使CI/CD中的各个复杂阶段实现自动化,但由于人工干预,CI/CD的整个软件供应链仍然可能被打破。那么,就首先了解CI/CD过程中的各个阶段,以及CI/CD管道为什么对于组织快速、大规模地交付代码至关重要。
企业应用程序开发团队通常由开发人员、测试人员/QA工程师、运营工程师和SRE(站点可靠性工程师)或IT运营团队组成。他们紧密合作,将高质量的软件交付给客户。CI/CD是两个独立过程的组合:持续集成和持续部署。下面列出了其中的主要步骤。
CI持续集成
CI持续集成(CI)是构建软件并完成初始测试的过程。持续部署(CD)是将代码与基础设施结合起来的过程,确保完成所有测试并遵循策略,然后将代码部署到预期的环境中。当然,许多公司都有自己的流程,但主要步骤如下。
CI:代码提交
人员:开发人员和工程师、数据库管理员(DBA)、基础架构团队
技术:GitHub、Gitlab、BitBucket
过程:代码提交阶段也称为版本控制。提交是将开发人员编写的最新更改发送到存储库的操作。开发人员编写的代码的每个版本都被无限期地存储。在与合作者讨论和审查变更之后,开发人员将编写代码,并在软件需求、功能增强、bug修复或变更请求完成后提交。管理编辑和提交变更的存储库被称为源代码管理(SCM工具)。在开发人员提交代码(代码推送请求)后,代码更改被合并到存储在中央存储库(如GitHub)中的基本代码分支中。
CI:静态代码分析
人员:开发人员和工程师、数据库管理员(DBA)、基础设施团队、测试人员
技术:GitHub、Gitlab、BitBucket
过程:一旦开发人员编写了代码并将其推送到存储库,系统就会自动触发,开始下一个代码分析过程。想象一下这样一个步骤:提交的代码直接进行构建,但在构建或部署过程中失败了。就资源利用率而言,无论是机器还是人力,这都是一个缓慢而昂贵的过程。必须检查代码的静态策略。SAST(Static Application Security Test):SAST是一种白盒测试方法,使用SonarQube、Veracode、Appscan等SAST工具从内部检查代码,以发现软件缺陷、漏洞和弱点(如SQL注入等)。这是一个快速检查过程,检查代码是否有语法错误。虽然此阶段缺少检查运行时错误的功能,但这将在稍后的阶段执行。
将附加的策略检查放到自动化管道中可以显著减少稍后在该过程中发现的错误数。
CI:build
人员:开发人员和工程师
技术:Jenkins、Bamboo CI、Circle CI、Travis CI、Maven、Azure DevOps
过程:持续集成流程的目标是接受常规的代码提交,并持续构建二进制工件。持续集成过程通过检查添加的新模块是否与现有模块配合良好,有助于更快地发现bug。这有助于减少验证新代码更改的时间。构建工具有助于编译和创建可执行文件或包(.exe、.dll,.jar等)取决于用于编写源代码的编程语言。在构建过程中,还会生成SQL脚本,然后与基础设施配置文件一起测试。简而言之,构建阶段是编译应用程序的阶段。构建过程的其他子活动包括工件存储、构建验证和单元测试。
CI:测试阶段
人员:测试人员和QA工程师
技术:Selenium、Appium、Jmeter、SOAP UI、Tarantula
过程:发布一个构建过程一系列自动化测试来验证代码的准确性。这一阶段有助于防止错误到达产品。根据构建的大小,此检查可以持续数秒到数小时。对于由多个团队提交和构建代码的大型组织,这些检查将在并行环境中运行,以节省宝贵的时间并尽早将Bug通知给开发人员。
这些自动化测试是由测试人员(或者称为QA工程师)建立的,他们已经根据用户故事建立了测试用例和场景。他们进行回归分析,压力测试,以检查与预期产出的偏差。测试中涉及的活动有健全性测试、集成测试和压力测试。这是一个非常先进的测试水平。在这里会发现开发代码的开发人员可能不知道的问题。
集成测试:
集成测试是使用Cucumber、Selenium等工具来执行的,其中各个应用程序模块作为一个组进行组合和测试,同时评估是否符合指定的功能需求。在集成测试之后,需要有人批准将该组中的更新集移动到下一阶段,这通常是性能测试。这个验证过程可能很麻烦,但它是整个过程的重要组成部分。核查过程中出现了一些新的解决办法。
负载和压力测试:
负载平衡和压力测试也使用自动化测试工具(如Selenium、JMeter等)来执行,以检查应用程序在高流量环境下是否稳定和性能良好。此测试通常不会在每个更新上运行,因为完整的压力测试是长期运行的。在发布主要的新功能时,将对多个更新进行分组,并完成完整的性能测试。在单个更新被转移到下一个阶段的情况下,管道可能包括金丝雀测试作为替代方案。
持续部署:bake和部署
人员:基础设施工程师、现场可靠性工程师(SRE)、运维工程师
技术:Spinnaker、Argo CD、Tekton CD
过程:测试阶段完成后,清除了标准的代码就可以部署到服务器中,在那里它们将与主应用程序集成。在部署到生产环境之前,它们将被部署到产品团队内部使用的测试/暂存或beta环境中。在将构建移动到这些环境之前,构建必须经过两个子阶段Bake和Deploy。这两个阶段都是Spinnaker固有的。
CD:Bake
Bake是指从源代码中创建一个不可变的映像实例,该实例在生产环境中具有当前配置。这些配置可能是数据库更改和其他基础设施更新之类的内容。Spinnaker可以触发Jenkins来执行这个任务,有些组织更喜欢使用Packer。
CD:部署
Spinnaker将自动将烘焙的映像传递到部署阶段。这是将服务器组设置为部署到集群的位置。与上述测试过程类似,在部署阶段执行功能相同的过程。部署首先转移到测试、阶段,最后转移到生产环境,然后进行批准和检查。整个过程由Spinnaker之类的工具处理。
CD:验证
这也是团队优化整个CI/CD流程的关键所在。因为现在已经进行了很多测试,所以失败应该很少。但此时的任何故障都需要尽快解决,以便将对最终客户的影响降到最低。团队也应该考虑自动化这部分流程。
部署到生产环境是使用部署策略(如蓝绿部署、金丝雀分析、滚动更新等)执行的。在部署阶段,将监视正在运行的应用程序,以验证当前部署是否正确或是否需要回滚。
CD:监控
人员:SRE,运维团队
技术:Zabbix、Nagios、Prometheus、Elastic Search、Splunk、Appdynamics、Tivoli
过程:要使一个软件发行版具有故障安全性和健壮性,在生产环境中跟踪发行版的运行状况是至关重要的。应用程序监控工具将跟踪CPU利用率和发布延迟等性能指标。日志分析器将扫描底层中间件和操作系统产生的日志流,以识别行为并跟踪问题的来源。在生产过程中出现任何问题时,都会通知相关人员,以确保生产环境的安全性和可靠性。此外,监视阶段帮助企业收集有关新软件更改如何为收入做出贡献的信息,并帮助基础架构团队跟踪系统行为趋势和进行容量规划。
持续部署:反馈和协作工具
人员:SRE、Ops和维护团队
技术:禅道、ServiceNow、Slack、Email、Hipchat
DevOps团队的目标是更迅速、持续地发布,然后不断减少错误和性能问题。这是通过slack或电子邮件频繁地向开发人员和项目经理反馈新版本的质量和性能,并在ITSM工具中及时提高票价来实现的。通常,反馈系统是整个软件交付过程的一部分;因此交付过程中的任何更改都会频繁地记录到系统中,以便交付团队可以对其采取行动。
企业必须评估一个整体的持续交付解决方案,它可以自动化或促进上述阶段的自动化。
UE5 ModelingMode & GeometryScript源码学习(一)
前言
ModelingMode是虚幻引擎5.0后的新增功能,用于直接在引擎中进行3D建模,无需外接工具,实现快速原型设计和特定需求的模型创建。GeometryScript是用于通过编程方式创建和操控3D几何体的系统,支持蓝图或Python脚本,提供灵活控制能力。
本文主要围绕ModelingMode与GeometryScript源码学习展开,涵盖DMC简介、查找感兴趣功能源码、动态网格到静态网格的代码介绍。
起因
在虚幻4中,通过RuntimeMeshComponent或ProceduralMeshComponent组件实现简单模型的程序化生成。动态网格组件(DynamicMeshComponent)在UE5中提供了额外功能,如三角面级别处理、转换为StaticMesh/Volume、烘焙贴图和编辑UV等。
将动态网格对象转换为静态网格对象时,发现官方文档对DMC与PMC对比信息不直接涉及此转换。通过搜索发现,DynamicMesh对象转换为StaticMesh对象的代码位于Source/Runtime/MeshConversion目录下的UE::Modeling::CreateMeshObject函数中。
在UE::Modeling::CreateMeshObject函数内,使用UEditorModelingObjectsCreationAPI对象进行动态网格到静态网格的转换,通过HasMoveVariants()函数接受右值引用参数。UEditorModelingObjectsCreationAPI::CreateMeshObject函数进一步处理转换参数,UE::Modeling::CreateStaticMeshAsset函数负责创建完整的静态网格资产。
总结转换流程,DynamicMesh对象首先收集世界、变换、资产名称和材质信息,通过FCreateMeshObjectParams对象传递给UE::Modeling::CreateMeshObject函数,该函数调用UE::Modeling::CreateStaticMeshAsset函数创建静态网格资产。
转换为静态网格后,程序创建了一个静态网格Actor和组件。此过程涉及静态网格属性设置,最终返回FCreateMeshObjectResult对象表示转换成功。
转换静态网格为Volume、动态网格同样在相关函数中实现。
在Modeling Mode中添加基础形状涉及UInteractiveToolManager::DeactivateToolInternal函数,当接受基础形状时,调用UAddPrimitiveTool::GenerateAsset函数,根据面板选择的输出类型创建模型。
最后,UAddPrimitiveTool::Setup函数创建PreviewMesh对象,UAddPrimitiveTool::UpdatePreviewMesh()函数中通过UAddPrimitiveTool::GenerateMesh生成网格数据填充FDynamicMesh3对象,进而更新到PreviewMesh中。
文章总结了Modeling Mode与GeometryScript源码的学习路径,从动态网格到静态网格的转换、基础形状添加到输出类型对应函数,提供了一条完整的流程概述。
2024-12-23 23:41
2024-12-23 22:46
2024-12-23 22:39
2024-12-23 22:23
2024-12-23 21:48