【游戏开发】游戏开发思路-优化

[复制链接]
查看18230 | 回复42 | 2021-8-22 01:20:14 | 显示全部楼层 |阅读模式
本帖最后由 wuojbk 于 2021-8-22 01:36 编辑

最近在群里看到很多兄弟 学会了基础 想做游戏脚本  但是不知道如何下手。
还有的兄弟 做了游戏 不知道如何优化。
今天我来写一篇 游戏开发思路-以及优化


    首先思路呢  就是分析游戏种类 以我自己在做的SLG类型游戏来分析。


分析游戏首先就是 登陆注册 单号 多号 过验证 。
     --单号不用说了 独立账号无限循环事件。
     --说一下 多号 ,多号肯定是有文本或者Sqlite进行保存 取出所有账号 分割成数组 循环,废话不多 直接上代码。

  1. --取出所有账号
  2. 账号 = {账号1,账号2,账号3,账号4}

  3. for key,val in pairs(账号)) do
  4.   当前账号个数 = key
  5.   当前账号     = val
  6.   
  7.   --登陆操作
  8. end
复制代码
    --在说一下过验证,比如很多游戏登陆后都会有滑块验证,群文件都有 这里我就直接贴上代码。
  1. --过滑块
  2. --x1y1x2y2 ==滑块的范围  shadowlen阴影的长度 strat_x 滑动开始坐标x 滑动结束坐标y runtime 滑动时间
  3. function Sys.swipe_push(x1,y1,x2,y2,shadowlen,start_x,start_y,runtime)
  4.         
  5.         local x1,y1,x2,y2=x1,y1,x2,y2   --滑块的范围
  6.         local shadowLen = shadowlen  --阴影的长度,一定要填准确哦
  7.         
  8.         local dt --滑块距离
  9.         local s = "";
  10.         local judge = 0;
  11.         local function slider()
  12.                 for i=1,shadowLen do
  13.                         s = s..0;
  14.                 end
  15.                 s2 = "1"..s.."01"
  16.                 s3 = "1"..s.."001"
  17.                 s4 = "1"..s.."0001"
  18.                 s = "1"..s.."1"
  19.                 local result=0;
  20.                 for y=y1,y2 do
  21.                         dt = ""  --两个滑块间的距离
  22.                         local width,hright,arr = getScreenPixel(x1,y,x2,y);
  23.                         for k,v in pairs(arr) do
  24.                                 local r, g , b = colorToRGB(v)
  25.                                 local sum = r + g + b;
  26.                                 if sum < 384 then
  27.                                         sum = 0;
  28.                                 else
  29.                                         sum = 1;
  30.                                 end
  31.                                 dt = dt..sum;
  32.                         end
  33.                         result = string.find(dt,s,331) or string.find(dt,s2,331) or string.find(dt,s3,331) or string.find(dt,s4,331);
  34.                         if result ~=nil then
  35.                                 judge = judge + 1;
  36.                                 if judge == 6 then
  37.                                         result = result + x1
  38.                                         return result;
  39.                                 end
  40.                         end
  41.                 end
  42.         end
  43.         keepCapture();
  44.         local tick = tickCount()
  45.         local result = slider();
  46.         print("获取滑块坐标耗时:"..(tick/1000));
  47.         if result == nil then
  48.                 releaseCapture();
  49.                 return -1
  50.         end
  51.         print(start_x,start_y,result,runtime)
  52.         swipe(start_x,start_y,result-5,start_y,runtime);
  53.         releaseCapture();
  54. end
复制代码

SLG类型游戏特点 2D,平面,大地图,需要精准坐标,采集。

我的开发思路呢 首先 就是执行方法 main() 这里main所有执行的都是游戏的逻辑 比如登陆注册 活动 打怪 领礼包 等等。。。
  1. --主程序运行
  2. function main()

  3.         --模式选择()
  4.     --游戏初始化()
  5.     --登陆()
  6.     --领取礼包()
  7.     --打怪()
  8.     --等等
  9. end
复制代码
这些都是你游戏的核心处理,你需要一个启动方法来 启动你的核心方法 和控制核心方法执行次数。
我之前说过 你需要定义一个入口方法run() 这个就是你脚本启动执行的第一个方法 ...直接上代码。
  1. --入口方法
  2. function run()
  3.         --无限循环主程
  4.         while true do
  5.                 main()
  6.         end
  7. end
复制代码
大家看到我这里是无限循环的,true 换成固定条件次数 就是次数执行 这个根据自己的业务随意更改。
大致游戏整体思路就是这样的,你想做什么样的脚本需要分析游戏,整理思路,先想好在开发 这里提一点就是有能力的兄弟 建议面向对象编程,模块化,高扩展,高维护。




    接下来说一下优化,优化部分可能新来的兄弟看着不太懂 没关系 多练习总会看懂。
优化部分 我将从这几点来说 【代码的冗余性】 【低内存占用写法】,【如果调用lua自身垃圾处理】,以及【安卓自身内存管理调用】。
  --首先说一下 代码冗余性  我看到很多兄弟 在做一个处理的时候他会写一个方法,下一个相似处理时候还会在写一个方法 这样是很不好的习惯,尽量让代码高复用,压缩 相似逻辑 尽量封装的通用。
  --低内存写法 lua的变量很好生成,但是如果 你不加local 关键字他就是全局变量,一直在占用着你的内存,如果你不把变量=nil lua自身的垃圾处理机制也不会回收,这就导致了如果你过多的去写全局变量会大大的占用你的内存,其次 图色的封装 如果你需要找一个图色的集合去循环的查找 你需要重新封装一下图色 废话不多上代码。
  1. <div class="blockcode"><blockquote>--图色找点综合
  2. -- table 返回坐标点
  3. function Sys.findColorAll(图色集合)
  4.         keepCapture()
  5.         for key,val in pairs(图色集合) do
  6.                 local x,y = findMultiColor(val[2],val[3],val[4],val[5],val[6],val[7],0,0.9)
  7.                 if x ~= -1 and y ~= -1 then
  8.                 releaseCapture()
  9.                         return val[1],x,y
  10.                 end
  11.         end
  12.         releaseCapture()
  13.         return -1,-1,-1
  14. end
复制代码

先截取内存,在循环找色 最后释放内存 这样会大量节省你截屏的内存消耗。
  --如何调用lua自身的 垃圾回收 这里我就直接贴菜鸟教程了 具体如何操作 还是要看你代码的逻辑。
  1. collectgarbage("collect"): 做一次完整的垃圾收集循环。通过参数 opt 它提供了一组不同的功能:

  2. collectgarbage("count"): 以 K 字节数为单位返回 Lua 使用的总内存数。 这个值有小数部分,所以只需要乘上 1024 就能得到 Lua 使用的准确字节数(除非溢出)。

  3. collectgarbage("restart"): 重启垃圾收集器的自动运行。

  4. collectgarbage("setpause"): 将 arg 设为收集器的 间歇率。 返回 间歇率 的前一个值。

  5. collectgarbage("setstepmul"): 返回 步进倍率 的前一个值。

  6. collectgarbage("step"): 单步运行垃圾收集器。 步长"大小"由 arg 控制。 传入 0 时,收集器步进(不可分割的)一步。 传入非 0 值, 收集器收集相当于 Lua 分配这些多(K 字节)内存的工作。 如果收集器结束一个循环将返回 true 。

  7. collectgarbage("stop"): 停止垃圾收集器的运行。 在调用重启前,收集器只会因显式的调用运行。
复制代码
  --安卓自身内存管理 它本身是Linux 系统 自身内存管理已经很强大了 但是有时候长时间的运行也会滞留垃圾文件 这个时候就需要我们手动来执行了。
  1. 所有设计命令执行的 都需要使用 懒人方法 exec("ls /") 以root执行。
复制代码




今天先说这些 今后会多多去写一些游戏相关的帖子 。
大佬轻喷,觉得有用的兄弟 多多转发 让更多的兄弟学习 大家一起进步。

回复

使用道具 举报

wuojbk | 2021-8-22 01:38:22 | 显示全部楼层
超出字数限制了。
1、系统内存的测量:free用以获得当前系统内存的使用情况。

查看缓存的命令

  free -m

清理缓存的命令 

    echo 1 > /proc/sys/vm/drop_caches

          echo 2 > /proc/sys/vm/drop_caches

          echo 3 > /proc/sys/vm/drop_caches
保证linux有足够的物理内存,可以调整vm的如下参数        vm.min_free_kbytes        默认值是3797,保证物理内存有足够空闲空间,防止突发性换页。 如果设置的值小于1024KB,系统很容易崩溃,在负载较高时很容易死锁。如果设置的值太大,系统会经常OOM。         
        vm.vfs_cache_pressure        默认是100,增大这个参数设置了虚拟内存回收directory和i-node缓冲的倾向,这个值越大。越易回收         
        vm.swappiness       
缺省60,减少这个参数会使系统尽快通过swapout不使用的进程资源来释放更多的物理内存


改善io系统的性能        vm.overcommit_memory       
默认值为:0从内核文档里得知,该参数有三个值,分别是:0:当用户空间请求更多的的内存时,内核尝试估算出剩余可用的内存。

1:当设这个参数值为1时,内核允许超量使用内存直到用完为止,主要用于科学计算

2:当设这个参数值为2时,内核会使用一个决不过量使用内存的算法,即系统整个内存地址空间不能超过swap+50%的RAM值,50%参数的设定是在overcommit_ratio中设定。


        vm.overcommit_ratio        默认值是50,用于虚拟内存的物理内存的百分比。这个参数值只有在vm.overcommit_memory=2的情况下,这个参数才会生效。该值为物理内存比率,当overcommit_memory=2时,进程可使用的swap空间不可超过PM * overcommit_ratio/100         
        vm.dirty_ratio        默认值是40,为了保持稳定,持续的写入,把这个值调整的小一些,经验值是20。增大会使用更多系统内存用于缓冲,可以提高系统的读写性能。当需要持续、恒定的写入场合时,应该降低该数值。         
        vm.dirty_background_ratio        缺省数值是500,也就是5秒,如果系统要求稳定持续的写,可以适当降低该值,把峰值的写操作平均多次,也避免宕机丢失更多的数据         
        vm.dirty_expire_centisecs        缺省是3000,也就是30秒,如果系统写操作压力很大,可以适当减小该值,但也不要太小;建议设置为 1500
这里我就直接贴了 网上资料很多 有兴趣可以多去看看 测试。
回复

使用道具 举报

152324093 | 2021-8-22 02:27:16 | 显示全部楼层
好帖。。。欢迎原创
回复

使用道具 举报

fojiao1992 | 2021-8-22 09:35:53 | 显示全部楼层
牛比 来学习
回复

使用道具 举报

Aitlo | 2021-8-22 11:23:03 | 显示全部楼层
游戏脚本思路写的很全面,厉害~
回复

使用道具 举报

ca0111 | 2021-8-22 16:58:37 | 显示全部楼层
谢谢 分享思路 的大佬   学了基础就需要这个
回复

使用道具 举报

yjj | 2021-8-22 17:22:52 | 显示全部楼层
好贴   感谢大佬分享!!
回复

使用道具 举报

云游风起 | 2021-8-23 10:23:37 | 显示全部楼层
学习学习了
回复

使用道具 举报

newone666 | 2021-8-23 11:00:17 | 显示全部楼层
好帖 思路不错 厉害!
回复

使用道具 举报

905407220 | 2021-8-23 11:13:04 | 显示全部楼层
厉害。支持。快更新
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

2

主题

5

帖子

176

积分

注册会员

Rank: 2

积分
176