有任何问题可以留言,请尽量不要贴图,以文字形式描述遇到的问题为佳,因为是在内地,不翻墙经常看不到图片。
不定期会上来回答问题并与大家相互学习。
问题包括但不限于源码、变身档编译(包括跑步、残影编译)等等,但是登陆器方面确实不懂,可能解答不了。
PS:
先分享一个解决容易造成CPU爆炸的代码写法吧。
如果你要从世界获取一个物件来长期使用,请不要使用 for (xxxx xx : world.get().getXXX(X) 的代码,而应该在最初期就把这个对象定义下来。
比如,你要一个随身助手,或者随身祭司(奶妈)等等,或者获取一个固定的怪物目标。
可以使用类似 L1Character XXX
XXX = World.get().getFindObjId(objid)
或者
pc.XXX = this(物件) 之类
之后调用这个对象的时候就直接使用 XXX 即可
尤其是
- for (L1Object obj : World.get().getAllObj()) {
- if (obj.getXXX() == xxx) {
- dosomething();
- }
- }
複製代碼
这样的代码,一定要慎用。
假设,你要写两只编号分别为 123、321的BOSS靠近后产生特殊效果(比如靠近十码内无敌),就一定不能用这种循环写法,哪怕是32核的CPU,也会在极短时间内爆掉。
那么应该怎么写呢?
我们在L1NpcInstance先定义一个变量,比如 isCloseBoss
在怪物出生或者你需要它变成这样的时候就给它定义好,直接
- switch(npc.getNpcId()) {
- case 123:
- case 312:
- setCloseBoss(true);
- break;
- }
複製代碼
- if (npc.isCloseBoss) dosomething();
複製代碼
以上呢,是我经历过多次爆CPU后抓线程抓出来的一点经验,哪怕是连续攻击封包中的,都建议不要使用 World.get().getFindObjId(targetAttackId),表面看是瞬间的事,实际上还是遍历了一次世界编号,然后到 targetAttackId 才停止的,世界物件太多可能就会对资源使用造成影响,累积过多可能还会造成频繁GC,然后爆内存。
当尽量减少这些低效代码之后,伺服端连续几天不重启都不会有什么烦恼了。
同样的道理,如果是写自动打怪,建议直接用 getKnownObjects()去寻找目标,而不要用World循环,可以减少很多重复的运算,以此类推,各种重复的代码,我们也应该把它整理成一个方法来调用,这样看起来舒心,新添加东西时引用也方便。
做版本,最重要的是想法,是创新,而不是代码能力,写代码也一样,很多能实现目标的代码,我们也要看它是不是够简洁,够直接,够粗暴。