代码优化

代码注入式游戏修改器的优化问题

不打扰是莪最后的温柔 提交于 2019-11-28 03:23:57
我们玩单机游戏时,游戏难度可能过大, 或者游戏已经比较熟练,想要增加游戏的玩法,这时候可以使用修改器。 内存式游戏修改器主要对游戏内存修改 修改时有两种方式,一是定时对内存数值进行修改。实现类似锁定的效果。 这样方案需要程序时刻运行。一旦关闭游戏中的数值,例如生命值等就会产生变动。 需要注意的是,修改网络游戏和有反作弊机制的游戏,除了使游戏臃肿,没有别的好处。且有数据失去同步的风险。 第二种方案则是对程序的代码进行修改。例如将 子弹数减1修改为子弹数加1,一旦进行射击操作,子弹就会增加。 由于程序代码可能是动态加载。当你进行射击时代码才会加载入内存。想要修改代码,就必须找到代码的位置。 代码位置会变化但是代码是不变的,我们只要搜索一段独一无二的代码,就可以找到位置。 我们把这段代码叫做特征码。搜索特征码时如果代码加载时偏移量大于特征码,直接暴力搜索即可。 如果代码加载时偏移量小于特征码,可以使用kmp算法,或者bm算法搜索。 搜索时注意,内存读取函数运行较慢,但是读取数据量大小对运行速度影响小。我们可以将大量数据读取入缓存中。 这样可以减少内存读取函数的调用次数,当使用40kb缓存时,仅读取1000次左右就可以完成搜索,时间为400ms。 除了用缓存来加速外,我们也可以缩小内存搜索范围,通过多次重开游戏,发现内存位置是 0XXXXXX1到4XXXXXX1之间

尾调用和尾递归

感情迁移 提交于 2019-11-28 01:56:48
尾调用 1. 定义 尾调用是函数式编程中一个很重要的概念,当一个函数执行时的最后一个步骤是返回另一个函数的调用,这就叫做尾调用。 注意这里函数的调用方式是无所谓的,以下方式均可: 函数调用: func(···) 方法调用: obj.method(···) call调用: func.call(···) apply调用: func.apply(···) 复制代码 并且只有下列表达式会包含尾调用: 条件操作符: ? : 逻辑或: || 逻辑与: && 逗号: , 复制代码 依次举例: const a = x => x ? f() : g(); // f() 和 g() 都在尾部。 复制代码 const a = () => f() || g(); // g()有可能是尾调用,f()不是 // 因为上述写法和下面的写法等效: const a = () => { const fResult = f(); // not a tail call if (fResult) { return fResult; } else { return g(); // tail call } } // 只有当f()的结果为falsey的时候,g()才是尾调用 复制代码 const a = () => f() && g(); // g()有可能是尾调用,f()不是 // 因为上述写法和下面的写法等效: const

zz图像、神经网络优化利器:了解Halide

风流意气都作罢 提交于 2019-11-28 00:52:44
动图示例实在太好 图像、神经网络优化利器:了解Halide Oldpan 2019年4月17日 0条评论 1,327次阅读 3人点赞 前言 Halide是用C++作为宿主语言的一个图像处理相关的DSL(Domain Specified Language)语言,全称领域专用语言。主要的作用为在软硬层面上(与算法本身的设计无关)实现对算法的底层加速,我们有必要对其有一定的了解。因为不论是传统的图像处理方法亦或是深度学习应用都使用到了halide的思想。 其中,在OpenCV(传统图像处理库)中部分算法使用了Halide后端,而TVM(神经网络编译器)也是用了Halide的思想去优化神经网络算子。 那么Halide到底是干嘛用的,看上面那张图,同样的一个算法处理(局部拉普拉斯变换),使用直接的C++语言写出来算法速度很慢,Adobe公司使用3个月对这个算法进行了优化(手工优化)使这个算法的速度快了10倍,但是如果你使用了Halide,只需要几行代码,就可以使这个算法比之前普通直接的算法快上20倍。 一句话来说,Halide大大节省了我们手动优化底层算法的时间,让我们只需要关心算法的设计。 Halide为什么可以优化算法 Halide的特点是其图像算法的计算的实现(Function和Expression)和这些计算在计算硬件单元上的调度(Schedule)是分离的

XLA

久未见 提交于 2019-11-28 00:34:52
原 TensorFlow技术内幕(七):模型优化之XLA(上) 2018年06月13日 14:53:49 jony0917 阅读数 5513 版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/gaofeipaopaotang/article/details/80679100 本章中我们分析一下TensorFlow的XLA(Accelerated Linear Algebra 加速线性代数)的内核实现。代码位置在tensorflow/compiler. XLA 在XLA技术之前,TensorFlow中计算图的执行是由runtime(运行时)代码驱动的:runtime负责加载计算图定义、创建计算图、计算图分区、计算图优化、分配设备、管理节点间的依赖并调度节点kernel的执行;计算图是数据部分,runtime是代码部分。在第五章session类的实现分析中,我们已经比较详细的分析了这个过程。在XLA出现之后,我们有了另一个选择,计算图现在可以直接被编译成目标平台的可执行代码,可以直接执行,不需要runtime代码的参与了。 本章我就来分析一下XLA是如何将tensorflow.GraphDef编译成可执行代码的。 目前XLA提供了AOT(提前编译)和JIT(即时编译)两种方式

多线程-等待唤醒+代码优化

风格不统一 提交于 2019-11-27 19:26:05
public class beginning { public static void main(String[] args) { Res r = new Res(); new Thread(new Test(r)).start(); new Thread(new TestDemo(r)).start(); } } class Test implements Runnable { Res r = new Res(); Test(Res r) { this.r = r; } public void run() { int x = 0; while(true) { if(x==0) { r.set("mike....", "nan..."); }else { r.set("里斯+++++","女女女女女+++++"); } x = (x+1)%2; } } } class TestDemo implements Runnable { Res r = new Res(); TestDemo(Res r) { this.r = r; } public void run() { while(true) { r.out(); } } } class Res { private boolean flag = false; private String name; private String

2019.08.17 Webpack4 bilibi

☆樱花仙子☆ 提交于 2019-11-27 15:26:39
将这些依赖打包吗? es6转es5,将sass,less,转成css。文件优化:压缩代码体积,合并文件。 代码分割:公共模块的处理,路由懒加载功能。模块合并:功能模块分类 自动刷新 来源: https://www.cnblogs.com/Py-king/p/11368326.html

Android性能优化之布局优化篇

谁说胖子不能爱 提交于 2019-11-27 13:46:45
怎样才能写出优秀的Android App,是每一个程序员追求的目标。那么怎么才能写出一个优秀的App呢?相信很多初学者也会有这种迷茫。一句话来回答这个问题:细节很重要。今天我们就从最基础的XML布局来谈谈怎么提高Android性能问题吧! 也许你经常会遇到比较复杂的布局,这种情况下,最简单的方法就是多层嵌套实现效果,但是最简单的方法是否是最优的方法呢? 这里需要打一个大大的问号?????经验告诉我们,往往简单的方法,得到的结果不是最优解,那么我们通过一个例子来研究一下怎么去优化我们的XML布局吧,下面通过经典微信中的“发现”tab页面中的布局来看看怎么实现。 上面这张图片是微信界面截图,看到这张效果图的第一眼会让开发者想到使用线性布局实现这种左边图片,右边文字,一行白色背景效果很方便。那么我们就按照一般思路写出如下布局代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80

Lua性能优化

和自甴很熟 提交于 2019-11-27 13:11:52
原文: Lua Performance Tips    基础实例 像其他任何编程语言一样,在Lua中,我们也要遵守以下两条优化程序的规则: 规则1 :不要优化。 规则2 :仍然不要优化(专家除外)   当用Lua编程时,这两条规则显得尤为重要。Lua以性能著称,而且在脚本语言中也因此而值得赞美。   然而,我们都知道性能是编程的一个关键因素。具有复杂指数时间的问题被称作疑难问题并不是偶然发生。太迟的结果是无用的结果。因此,每个优秀的程序员应该总是在花费资源去优化一段代码的代价和这段代码在运行代码时节约资源的收益相平衡。一个优秀的程序员关于优化的第一个问题总是会问:“程序需要优化吗?”如果答案是肯定的(仅当此时),第二个问题应该是:“哪地方?”   为了回答这两个问题我们需要些手段。我们不应该在没有合适的测量时尝试优化软件。大牛和菜鸟之前的不同不是有经验的程序员更好的指出程序的一个地方可能耗时:不同之处是大牛知道他们并不擅长那项任务。   最近几年,Noemi Rodriguez和我用Lua开发了一个CORBA ORB(Object Request Broker)原型,后来进化成OiL(Orb in Lua)。作为第一个原型,以执行简明为目标。为了避免引用额外的C语言库,这个原型用一些计算操作分离每个字节(转化成256的基数)。不支持浮点数。因为CORBA把字符串作为字符序列处理

前端项目优化 -Web 开发常用优化方案、Vue & React 项目优化

淺唱寂寞╮ 提交于 2019-11-27 10:43:46
github github-myBlob 从输入URL到页面加载完成的整个过程 首先做 DNS 查询,如果这一步做了智能 DNS 解析的话,会提供访问速度最快的 IP 地址回来 接下来是 TCP 握手,应用层会下发数据给传输层,这里 TCP 协议会指明两端的端口号,然后下发给网络层。网络层中的 IP 协议会确定 IP 地址,并且指示了数据传输中如何跳转路由器。然后包会再被封装到数据链路层的数据帧结构中,最后就是物理层面的传输了 TCP 握手结束后会进行 TLS 握手,然后就开始正式的传输数据(如果使用HTTPS) 数据在进入服务端之前,可能还会先经过负责负载均衡的服务器,它的作用就是将请求合理的分发到多台服务器上,这时假设服务端会响应一个 HTML 文件 首先浏览器会判断状态码是什么,如果是 200 那就继续解析,如果 400 或 500 的话就会报错,如果 300 的话会进行重定向,这里会有个重定向计数器,避免过多次的重定向,超过次数也会报错 浏览器开始解析文件,如果是 gzip 格式的话会先解压一下,然后通过文件的编码格式知道该如何去解码文件 文件解码成功后会正式开始渲染流程,先会根据 HTML 构建 DOM 树,有 CSS 的话会去构建 CSSOM 树。如果遇到 script 标签的话,会判断是否存在 async 或者 defer ,前者会并行进行下载并执行 JS

第四次作业——结对作业

不羁岁月 提交于 2019-11-27 10:34:18
链接 在学习通上注明结对的成员对: 1班胡晓松-1班高健 结对成员的博客连接: https://www.cnblogs.com/maxilong/p/11729323.html 代码复审 代码复审核查表(高健) 由一班胡晓松完成 1.概要部分 1)代码符合需求和规格说明吗符合? 是 2)代码设计是否考虑周全? 周全 功能和要求相符 3)代码可读性如何? 一般 4)代码容易维护么? 容易 5)代码每一行都检查过了吗? 是 2.设计规范部分 1)设计是否遵循从已知的设计模式或项目中常用的模式? 是 2)有没有硬编码或字符串/数字等存在? 是 3)代码有没有依赖于某平台,是否会影响将来的移植? 否 4)4.开发者新写的代码能否用已有Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以调用而不用全部重新实现? 是 5)5.有没有无用的代码可以清除? 否 3.代码规范部分 1)修改的部分符合代码标准和风格嘛? 是 4.具体代码部分 1)有没有对错误进行处理?对于调用外部函数,是否检查了返回值或处理了异常? 否 2)参数传递有无错误,字符串的长度是字节的长度还是字符(可能是单/双字节)的长度,是以0开始计数还是以1开始计数? 0 3)边界条件如何处理的?switch语句的default分支是如何处理的?循环有没有可能出现死循环? 否 在分支中填入跳转语句 4