小.大咘這粉重要!~(關於卡CPU...
2 posters
:: 遊戲技術建議
第1頁(共1頁)
小.大咘這粉重要!~(關於卡CPU...
小.大咘XD
我去浪漫找到1篇文章關於卡CPU...
因為我看不懂所以給你看XD...- -"
沒用也沒辦法-//-
引用自:http://bbs.yoyo-do.com/thread-797962-1-2.html
解決辦法:
1、在源碼下 ItemSortHandler.java 這個文件 打開後內容如下.:
package net.sf.odinms.net.channel.handler;
import net.sf.odinms.client.MapleClient;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.client.MapleInventoryType;
import net.sf.odinms.client.MapleInventory;
import net.sf.odinms.server.MapleInventoryManipulator;
import net.sf.odinms.server.maps.FakeCharacter;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
public class ItemSortHandler extends AbstractMaplePacketHandler {
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
c.getPlayer().resetAfkTime();
slea.readInt();
byte mode = slea.readByte();
boolean sorted = false;
MapleInventoryType pInvType = MapleInventoryType.getByType(mode);
MapleInventory pInv = c.getPlayer().getInventory(pInvType);
while (!sorted) { //我懷疑是這裡導致死循環造成的服務器卡CPU的。。
byte freeSlot = pInv.getNextFreeSlot();
if (freeSlot != -1) {
byte itemSlot = -1;
for (byte i = (byte) (freeSlot + 1); i <= 100; i++) {
if (pInv.getItem(i) != null) {
itemSlot = i;
break;
}
}
if (itemSlot <= 100 && itemSlot > 0) {
MapleInventoryManipulator.move(c, pInvType, itemSlot, freeSlot);
} else {
sorted = true;
}
}
}
c.getSession().write(MaplePacketCreator.finishedSort(mode));
c.getSession().write(MaplePacketCreator.enableActions());
}
}
以上部分代碼是端裡原始的代碼。。個人分析因為上面的排列算法。 使用的 while (!sorted) WHILE循環導致當道具滿的時候,點排列按扭無法跳出循環而造成死循環,從而導致占用服務器CPU過大。。。。 下面是我修改的代碼。。大家可以複製整個,替換這個文件的內容..重新編譯即可....
package net.sf.odinms.net.channel.handler;
import net.sf.odinms.client.MapleClient;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.client.MapleInventoryType;
import net.sf.odinms.client.MapleInventory;
import net.sf.odinms.server.MapleInventoryManipulator;
import net.sf.odinms.server.maps.FakeCharacter;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
public class ItemSortHandler extends AbstractMaplePacketHandler {
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
c.getPlayer().resetAfkTime();
slea.readInt();
byte mode = slea.readByte();
byte s=0;
MapleInventoryType pInvType = MapleInventoryType.getByType(mode);
MapleInventory pInv = c.getPlayer().getInventory(pInvType);
for(s=0 ;s<90;s++){ //用這個替代while循環,從而解決死循環卡CPU問題
byte freeSlot = pInv.getNextFreeSlot();
if (freeSlot != -1) {
byte itemSlot = -1;
for (byte i = (byte) (freeSlot + 1); i <= 100; i++) {
if (pInv.getItem(i) != null) {
itemSlot = i;
break;
}
}
if (itemSlot <= 100 && itemSlot > 0) {
MapleInventoryManipulator.move(c, pInvType, itemSlot, freeSlot);
}else {
break;
}
}
} c.getSession().write(MaplePacketCreator.finishedSort(mode));
c.getSession().write(MaplePacketCreator.enableActions());
c.getSession().write(MaplePacketCreator.serverNotice(1, "重新排序完成!"));
}
引用自:http://bbs.yoyo-do.com/thread-797962-1-2.html
我去浪漫找到1篇文章關於卡CPU...
因為我看不懂所以給你看XD...- -"
沒用也沒辦法-//-
引用自:http://bbs.yoyo-do.com/thread-797962-1-2.html
解決辦法:
1、在源碼下 ItemSortHandler.java 這個文件 打開後內容如下.:
package net.sf.odinms.net.channel.handler;
import net.sf.odinms.client.MapleClient;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.client.MapleInventoryType;
import net.sf.odinms.client.MapleInventory;
import net.sf.odinms.server.MapleInventoryManipulator;
import net.sf.odinms.server.maps.FakeCharacter;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
public class ItemSortHandler extends AbstractMaplePacketHandler {
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
c.getPlayer().resetAfkTime();
slea.readInt();
byte mode = slea.readByte();
boolean sorted = false;
MapleInventoryType pInvType = MapleInventoryType.getByType(mode);
MapleInventory pInv = c.getPlayer().getInventory(pInvType);
while (!sorted) { //我懷疑是這裡導致死循環造成的服務器卡CPU的。。
byte freeSlot = pInv.getNextFreeSlot();
if (freeSlot != -1) {
byte itemSlot = -1;
for (byte i = (byte) (freeSlot + 1); i <= 100; i++) {
if (pInv.getItem(i) != null) {
itemSlot = i;
break;
}
}
if (itemSlot <= 100 && itemSlot > 0) {
MapleInventoryManipulator.move(c, pInvType, itemSlot, freeSlot);
} else {
sorted = true;
}
}
}
c.getSession().write(MaplePacketCreator.finishedSort(mode));
c.getSession().write(MaplePacketCreator.enableActions());
}
}
以上部分代碼是端裡原始的代碼。。個人分析因為上面的排列算法。 使用的 while (!sorted) WHILE循環導致當道具滿的時候,點排列按扭無法跳出循環而造成死循環,從而導致占用服務器CPU過大。。。。 下面是我修改的代碼。。大家可以複製整個,替換這個文件的內容..重新編譯即可....
package net.sf.odinms.net.channel.handler;
import net.sf.odinms.client.MapleClient;
import net.sf.odinms.net.AbstractMaplePacketHandler;
import net.sf.odinms.client.MapleInventoryType;
import net.sf.odinms.client.MapleInventory;
import net.sf.odinms.server.MapleInventoryManipulator;
import net.sf.odinms.server.maps.FakeCharacter;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
public class ItemSortHandler extends AbstractMaplePacketHandler {
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
c.getPlayer().resetAfkTime();
slea.readInt();
byte mode = slea.readByte();
byte s=0;
MapleInventoryType pInvType = MapleInventoryType.getByType(mode);
MapleInventory pInv = c.getPlayer().getInventory(pInvType);
for(s=0 ;s<90;s++){ //用這個替代while循環,從而解決死循環卡CPU問題
byte freeSlot = pInv.getNextFreeSlot();
if (freeSlot != -1) {
byte itemSlot = -1;
for (byte i = (byte) (freeSlot + 1); i <= 100; i++) {
if (pInv.getItem(i) != null) {
itemSlot = i;
break;
}
}
if (itemSlot <= 100 && itemSlot > 0) {
MapleInventoryManipulator.move(c, pInvType, itemSlot, freeSlot);
}else {
break;
}
}
} c.getSession().write(MaplePacketCreator.finishedSort(mode));
c.getSession().write(MaplePacketCreator.enableActions());
c.getSession().write(MaplePacketCreator.serverNotice(1, "重新排序完成!"));
}
引用自:http://bbs.yoyo-do.com/thread-797962-1-2.html
bb9782011 在 周五 6月 25, 2010 9:11 pm 作了第 1 次修改 (原因 : 怕有人拿來作怪)
bb9782011- 文章數 : 4
注冊日期 : 2010-06-06
年齡 : 28
來自 : 台中
:: 遊戲技術建議
第1頁(共1頁)
這個論壇的權限:
您 無法 在這個版面回復文章