ProjectS编年史
前言
以此文章来记录ProjectS从企划到开发到宣发到上线的全过程,其中涉及玩法构思,资源制作,技术思考,市场分析,上架操作等,几乎包含了从零开始制作独立游戏的全部知识和经验,希望对大家能有所启发,本系列文章将会持续更新
玩法设计
代号ProjectS企划案
技术方案
GamePlay框架
ET7+FariyGUI+huatuo+luban+yooasset接入教程
基于行为树的MOBA技能系统:总目录
ProjectS中的AI转向系统(Context Steering)
ProjectS中的体素碰撞和寻路
CI/DI方案
从零开始基于TeamCity搭建项目的CI工作流
剧情架构
PCG框架
ProjectS中的地形系统-Procedural Content Generation(PCG)
渲染框架
ProjectS中的GPU Driven
ProjectS中的全局光照系统-Voxel-based Global Illumination(VXGI)
ProjectS中的地形系统-Terrian Rendering
ProjectS中的地形系统-T ...
IL2CPP代码裁剪与生成全流程剖析
前言
环境:
Unity 2022.3.4f
PC Win10
Script BackEnd : IL2CPP
近期在研究IL2CPP相关内容,对其如何将C#生成C++非常感兴趣,在IL2CPPDumper中看到了下面一段
The IL2CPP AOT compiler is named il2cpp.exe. On Windows you can find it in the Editor\Data\il2cpp directory. On OSX it is in the Contents/Frameworks/il2cpp/build directory in the Unity installation. The il2cpp.exe utility is a managed executable, written entirely in C#. We compile it with both .NET and Mono compilers during our development of IL2CPP.
IL2CPP AOT编译器的名称为il2cpp.exe。在W ...
ProjectS中的地形系统-Terrian Shading(Material Id)
地形系统思路来自 ProjectS中的GPU Driven
前言
再来回顾下传统地表材质与我们定好的方案之间的对比:
传统Weight Blend方案:通过纹理 + Mask图实现多纹理混合渲染
每多一张纹理贴图,就要多一份遮罩数据。
由于每点的mask总和为1,所以改变一层需要动到其他所有层的数据,耦合度太高,不方面大规模修改迭代。
编辑器在处理edit layer时,由于需要全局的归一化操作,所以会让上层的layer表现非常奇怪。
随着edit layer的增加,内存和操作延时也会是个问题。
渲染时由于每个地块使用的weightmap各不相同,所以加大了合批处理的难度。
Material Id方案:确保每个点只有一种纹理贴图的情况下,通过一张Material Id图控制,最后通过双线性插值混合平滑,这里的材质不是指材质球,而是指一个数据结构,其中包含材质参数,贴图索引以及其他信息
优点是这张MaterialId,它相当于一个间接的索引,每个值表示一张纹理图。8位的单通道materialID图就足以支持超过200种纹理图。它的大小可控,不会随着纹理数量的增加而增加。同时 ...
用经典的生产-消费者模型解决游戏开发中异步加载和使用问题
封面来自:https://www.youtube.com/watch?app=desktop&v=VXJSJ6c3ZIs
前言
最近实践了很多有关异步记载和使用的业务场景,无一例外的,由于 异步 的存在,业务代码需要非常小心的维护各种状态,才能足够稳定和安全
只遇到一次还好,代码和人有一个能跑就行,遇到很多次心情就很烦躁了,所以准备抽空研究下这种业务场景较为通用的解决方案
正文
场景例程
整个世界被拆分成无数个nxn的tile,需要根据相机位置动态加载,卸载tile(以下简称地图流式行为
相机位置每帧都在变动,即每帧都有可能触发地图流式行为,正常视角渲染所需tile数量在32~50之间
出于表现和内存性能的平衡考虑,最大支持同时存在256个加载的tile,基于LRU策略进行调度
tile的加载是异步的
最终需要把加载的tile资源按照正确的索引上传至GPU
问题展示
直接上代码,我们以一帧的LateUpdate为例(此LateUpdate每帧执行),将资源加载和使用看为一个整体
但由于异步的特性,当某一帧的异步完成时,一些数据和状态可能已经发生了变动,会影响到另一 ...
(译)Forward Plus Bringing Deferred Lighting to the Next Level
在网上鲜少有能全面,具体介绍Forward+渲染管线的文章,所以抽空翻译下这个2015年的PPT,分享出来
摘要
这篇论文介绍了Forward+,这是一种通过剔除和仅存储对像素有贡献的光源来渲染许多光源的方法。Forward+是对传统的Forward渲染的扩展。利用GPU的计算能力实现的light-culling模块被添加到渲染管线中,用于创建有效light-list;该列表传递给最终的渲染着色器,该着色器可以访问有关光源的所有信息。尽管Forward+增加了最终着色器的工作量,但从理论上讲,它与compute-shader-based的延迟光照相比需要更少的内存带宽。此外,它避免了延迟技术的主要缺点:即对材质和光照模型的限制。
本论文进行了实验以比较Forward+和延迟光照的性能。
PS:参考Forward框架的逆袭:解析Forward+渲染 的内容,TBDR和Forward+内容对比:(注意此处的TBDR不是指移动平台的TBR架构,而是一种渲染流水线方案)
TBDR:
生成G-Buffer,这一步和传统deferred shading一样。
把G-Buffer划分成许多16 ...
《觅长生》游玩有感
印象中上一次玩这种修仙类型的RPG(其实我更倾向于叫他们策略RPG)还是小学的时候玩4399上的武林外传
我去搜了下,居然还在,没错就这个,哈哈
其实我个人一直对这种类型的游戏不太感冒,游戏开发大亨是,文明也是,虽然是有一些策略养成的乐趣在里面,但远不如一场场酣畅淋漓的战斗来的快感强烈
这次购买觅长生也是偶然瞥到一眼评论区的修仙味很浓+游戏本体打折才下手,游玩体验的话,就我个人而言,中规中矩,还有很大进步空间
概览
第一次打开游戏,头很铁,直接普通难度开局,然后全部凡人选项,我倒要看看所谓凡人修仙传到底是什么感觉
然后如愿以偿的体验了凡人修仙是什么感觉,没有奇遇,神武大会两次都是第二轮被狠狠淘汰,拜入门槛最低的门派,努力一生也只是个内门弟子,无数次存档驯服魔剑均以失败告终,最终在筑基后期再难精进半步,子然一身,身陨道消。
原来真正的凡人修仙竟是此等的无力,放在修仙小说里应当是围观主角打架但不小心被波及致死的路人甲吧
第二次重建档,直接所有buff全部拉满,单修炼速度都让旁人望而却步,再加上灵根属性加成,拜入离火宗,不费吹灰之力拿下神武大会冠军,轻松收服剑池魔剑,哪怕是林府篇的金 ...
2023个人年度总结
转眼间又快到新年了,又到了写年度总结的时候,但今年有些不一样,我缓慢闭上双眼,那些欣喜,激动,痛苦,悲伤,崩溃的记忆再次如潮水般涌入脑海,良久,舒展开紧皱的眉头,开始用文字记录我这荒诞,颓废,美好,如梦似幻的2023
一月~四月 你是良缘亦是劫
我们一生中与无数人擦肩,总有些若有若无的缘分将我们和一些人联系在一起,这是良缘,也是考验,稍有不慎,便会万劫不复
我和她本是萍水相逢,但却让我不知不觉间一次又一次打破自己的底线,最终坠入了万丈深渊
我孤掷一注,跨越千里与她相见,丈量过夜色笼罩的路,昏暗的路灯渐渐模糊了我双眼,但我依旧能看清她眼底的慌乱与犹豫不决,我当然懂得,再爱就不礼貌了
很遗憾,我的运气并不好,但我现在其实很感谢她,总归是留下了一些美好记忆
五月 深渊
但遗忘又谈何容易,只要闭上双眼就能浮现出她在我身旁的一颦一笑,那些欢声笑语,嬉笑娇嗔似就在昨天
每次她在我梦境中出现我都心跳似狂,但醒来后巨大的落差感让我难受到几乎无法呼吸
那段时间真的很难熬,有时候坐在工位上眼泪突然就要决堤,只能靠死死掐住大腿勉强控制自己的情绪,不至于失态
我无数遍的质问自己,为什么放不下,她当真有 ...
Houdini Procedural Dependency Graph(PDG)手册
在使用PDG的时候,对于一个新的节点,总有一种云里雾里的感觉,看官方文档也是迷迷糊糊的,还好基本上每个节点都有提供相应的Sample,并标注了注意事项。
本篇就记录下PDG的一些重要节点,以及使用过程中的注意点
节点
Wedge
主要有以下几个作用
创建Work Item,驱动PDG
用于生成Attribute(可以多个),对于Wedge的Attribute,可以在整个TOP中通过@xxx来引用,当然,在和常规字符混排的的时候,需要加反向单引号例如:
1$HIP/geo/boxsphere_`@wedgeindex`.bgeo.sc
强制覆写某个参数,可以理解为非侵入式的一种数据注入方案
多个Wedege之前关系为嵌套关系,比如WedgeA的WedgeCount为2,WedgeB的WedgeCount为3,当B连接到A的出口,那么B将会输出2x3 = 6个WorkItem
Partition by Index
它做的事情非常简单,就是将多个WorkItem按照index和一定的规则merge成一个WorkItem,每个WorkItem的index可以通过双击查看 ...
Houdini HeightField手册
Houdini中HeightField相关节点在地形生成中占据了非常重要的地位,虽然可以在Houdini里右键节点-Helper查看详细的官方文档,但未对整个HeightField系统有一个宏观认识的情况下,也不知道要用哪些节点。所以单独开篇文章来记录常用的HeightField几点以及使用心得
(但HeightField手册又何必只是HeightField手册^ ^ _)
基础高度场操作
HeightField
基础的高度场节点,用于指定高度场的大小,细分/模拟粒度等基础信息
这个节点用于生成两个 2D volume 基元:height体积和mask体积,具有给定的分辨率和初始值,这些基元可以由其他地形节点进行修改。
height体积 是一个 2D 网格,表示地图上每个点的地形距离地面平面的距离(这些值可以为负)。
mask体积 可以用作其他地形工具的“mask”输入。它指定了地形节点的效果应该应用于哪些区域:mask值为 0 的区域不受节点影响,掩模值为 1 的区域完全受节点影响。地形节点允许你绘制mask或从地形信息中生成mask(例如,阴影落在哪里,或低于某 ...
ProjectS中的地形系统-Procedural Content Generation(PCG)
本篇文章是对ProjectS中地形PCG模块的总结,可能需要一些前置知识,可以前往本文的 参考 部分进行相关引用
先明确下项目需求
20km x 20km的世界大小
大多数地貌为起伏幅度较小的平原
需要分tile编辑,预览
需要导出LOD高度图
支持植被和物件Instance的纹理生成和手工修改
需要一个工具统筹管理整个PCG管线,并实时查看每一步的结果
最终选择Houdini作为目标软件,因为Houdini作为一款相当成熟的PCG向的DCC软件,提供了相当多地形创建,编辑和工作流工具,应对我这个个人项目的简单地形PCG工作自然不成问题
项目概览
项目结构如下:
terrian_pdg:地形PDG模块,组织整个地形的PCG流程
terrian_sop:地形PCG中用到的所有SOP集合,大部分都导出成了HDA,供PDG使用
PDG流程
我在学习和解构一个对象的时候习惯从宏观看起,大概掌握每个环节的功能,有个全局的概念,再看具体细节的时候不会有一头雾水的感觉,所以我们从PDG开始看起
整个流程非常的直观
创建地形骨架
拆分地形
根据地形编号查找hda文件,如果存在则进行 ...