当前位置: 首页 > news >正文

FPS游戏框架漫谈第二十二天

今天我们要谈的话题是热更新辅助翻译工具
那么什么是热更新辅助翻译工具呢 我们聊的其实是一种语言翻译工具,就我们游戏而已采用的是c#语言开发,热更采用的是lua语言,
那么我们平时热更是不是需要写lua代码呢????????
这样问题就来了lua因为是动态语言,调式麻烦,不容易发现,很难维护等各种问题,那么就引发了很多优秀的团队在研究怎么样研究一个语言翻译工具呢??
如果说我们制作出来了一个从c#语言翻译成lua语言的工具的话,是不是意味着我们在也不需要忍受lua的臭脾气了呢,完全正确,你摆脱了他。
怎么做到的呢?比如外网出现严重bug,你以往就抓紧写lua脚本,但是现在有了他你不用了写了,你还是写c#代码,写完之后交给工具流即可,他会把你写的c#翻译成lua脚本的。

不对,好像我说了很多废话,现在的问题是我怎么造一个c#语言翻译成lua的工具呢?????????????
好难,我好像无从下手,莫慌。 我们先分析下平时你注意了没有我们的c#代码写完之后编译,他会变成一个叫Mono.Ceil的库,是不是想起来了。没有想起来是吧,赶紧动手试试,然后我们会发现一个有意思的东西就是Mono.Ceil这个dll中竟然有我们写的c#类的名字 字段的类型 以及类型之间的继承关系 以及方法签名 完美,那不就非常好翻译了吗?
来看案例
c#代码 Mono.Ceil中找到的信息
public class A TypeDefinition:A
{ Fields
int a = 2; x:int
int b = 3; y:int
int Test() Methoths
{ Test:int
return a + b;
}
}

哇 好像发现了规则 那么我对应的lua 不就是local A = class(“A”)
function A:Test()
end
…类似是不是很简单 就是固定字符串+Ceil中找到的信息 进行组合然后文件写入就不可以

不对啊 我好像没有看到方法体啊,这个方法体去被编译器放哪里去了呢?经过各种资源的查询,原来已经成为CIL里面,公共中间语言。
但是好像看起来格式比较低级啊,已经到了指令集的级别啊,不慌我们反编译他,什么工具ILSPY工具啊,经过翻译之后看到了这个信息

IL语言被ILSpy工具翻编译之后的状态
stoc:int32(a,ldc,i4:int32(2))
stoc:int32(b,ldc,i4:int32(3))
ret

add:int32( ldloc:int32(a),idloc:int32(b)
)

翻译成方法体
local a = 2
local b = 3
return (a + b)

看着成功了99% 但是剩余1%的路是非常艰辛的?动手是最好的老师。

相关文章:

  • 【go】ent操作之CRUD与联表查询
  • uniapp /微信小程序 使用map组件实现手绘地图方案
  • office文件转pdf在线预览
  • 【前端高频面试题--Vue基础篇】
  • 多模态对比语言图像预训练CLIP:打破语言与视觉的界限,具备零样本能力
  • 猫头虎分享已解决Bug || 未定义的变量(Undefined Variable):ReferenceError: x is not defined
  • 获取旁站 / C 段:第三方网站(附链接)
  • 天猫数据分析(天猫数据查询工具):2023年滑雪服市场消费现状及趋势(天猫服饰行业分析报告)
  • php 函数三
  • 新型RedAlert勒索病毒针对VMWare ESXi服务器
  • 利用LLM大模型生成sql的深入应用探究
  • 新增同步管理、操作日志模块,支持公共链接分享,DataEase开源数据可视化分析平台v2.3.0发布
  • 版本控制工具——Git
  • PySpark(四)PySpark SQL、Catalyst优化器、Spark SQL的执行流程、Spark新特性
  • 【Kotlin】Kotlin环境搭建
  • SegmentFault for Android 3.0 发布
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • “大数据应用场景”之隔壁老王(连载四)
  • 《Java编程思想》读书笔记-对象导论
  • 【前端学习】-粗谈选择器
  • 08.Android之View事件问题
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • es6要点
  • Git初体验
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JAVA 学习IO流
  • JS创建对象模式及其对象原型链探究(一):Object模式
  • Python 基础起步 (十) 什么叫函数?
  • Python_网络编程
  • 大主子表关联的性能优化方法
  • 搞机器学习要哪些技能
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 浅谈Golang中select的用法
  • 无服务器化是企业 IT 架构的未来吗?
  • 译自由幺半群
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 带你开发类似Pokemon Go的AR游戏
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (day 12)JavaScript学习笔记(数组3)
  • (备忘)Java Map 遍历
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (剑指Offer)面试题34:丑数
  • (算法)Travel Information Center
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • .describe() python_Python-Win32com-Excel
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET基础篇——反射的奥妙
  • .Net转前端开发-启航篇,如何定制博客园主题
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [Android]使用Git将项目提交到GitHub
  • [Asp.net mvc]国际化
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [HCTF 2018]WarmUp (代码审计)