小编mon*_*tag的帖子

在java中使用大字符串时StringBuilder内存不足错误

我从成千上万的角色成长为指数大的String test += str;地方test.运行需要45分钟,可能是因为创建了大字符串并删除了垃圾.然后,我将这样的输入交错,使其达到30秒.

这似乎是一种廉价的方式,但效果很好:

  if (secondDump.length() > 50)
  {
     intermedDump = intermedDump + secondDump;
     secondDump = "";
  }      

  if (intermedDump.length() > 100)
  {
     thirdDump = thirdDump + intermedDump;
     intermedDump = "";
  }
  if (thirdDump.length() > 500)
  {
     fourthDump = fourthDump + thirdDump;
     thirdDump = "";
  }
  if (fourthDump.length() > 1000)
  {
     fifthDump = fifthDump + fourthDump;
     fourthDump = "";
  }
  //with just this and not sixth.  Runtime>>>> : 77343
  if (fifthDump.length() > 5000)
  {
     sixthDump …
Run Code Online (Sandbox Code Playgroud)

java memory heap text out-of-memory

6
推荐指数
1
解决办法
2万
查看次数

防止模拟银行数据库中的死锁

这是涉及死锁的模拟银行数据库问题.我已经有了我认为的答案,但我很好奇这是否是一个很好的解决方案.提出的问题如下:

你如何防止以下代码中的死锁?:

void transaction(Account from, Account to, double amount)
{
    Semaphore lock1, lock2;
    lock1 = getLock(from);
    lock2 = getLock(to);

    wait(lock1);
       wait(lock2);

          withdraw(from, amount);
          deposit(to, amount);

       signal(lock2);
    signal(lock1);
 }
Run Code Online (Sandbox Code Playgroud)

这可以变为死锁的方式是通过两个线程(或进程?)同时使用对立账户调用transaction()方法,即:

交易(储蓄,检查,1); 在线程1和

交易(检查,储蓄,2); 在线程2中.

从我糟糕的理解,我认为发生了什么以及它为何陷入僵局是因为没有遵守锁定顺序,因为两个线程都试图获得锁定(来自彼此?).

我的快速和肮脏的解决方案是将函数transaction()之外的锁移动到调用时它看起来像这样的位置:

 //somewhere in main
    Semaphore lock1, lock2;
    lock1 = getLock(from);
    lock2 = getLock(to);

    wait(lock1);
       wait(lock2);

       transaction(checking, savings, 2);

       signal(lock2);
    signal(lock1);
    //.....
Run Code Online (Sandbox Code Playgroud)

交易看起来像这样:

void transaction(Account from, Account to, double amount)
{
   withdraw(from, amount);
   deposit(to, amount);
}
Run Code Online (Sandbox Code Playgroud)

这样他们就永远无法同时执行,因为交易在技术上是关键部分.如果这是一个java程序,你是否也可以通过在函数声明中将void一词置为void来使用监听器?那会有用吗?这似乎是一种更聪明的方法.

我也可能根本不理解这一点,所以请随意给我上学,特别是如果我的解释不准确的话.谢谢.

database multithreading deadlock semaphore

2
推荐指数
1
解决办法
1755
查看次数

平台瓦片引擎 - 关于如何处理长瓦片的建议

我正在寻求的建议不仅仅是直接的帮助.

我正在使用XNA的8位平台游戏.我已经沉入160小时了,我开始遇到引擎问题了.它基本上是XNA平台演示的改编/修改版本.我的所有或大部分瓷砖都是32x32,但有些是64宽,32像素高,就像一张桌子.有些是32宽,64高,像植物.

我将它们一次性发送到gpu只有一个.png,类似于XNA教程的作者进行磁贴映射的方式.对于动画精灵,我会使用角色的不同帧的平铺地图.对于tile地图数据,我在文本文件中读取就像XNA教程一样.

我应该如何容纳宽而高的瓷砖?我应该制作一个两层瓦片系统(我想我应该遵守keep-it-simple-stupid规则)?

现在我正在使用透明瓷砖来扩展宽瓷砖.

办公桌椅:

椅子http://dl.dropbox.com/u/8446900/game_screen_desk.png

.....
...h.
..d".
#####
Run Code Online (Sandbox Code Playgroud)

植物和椅子:

办公桌http://dl.dropbox.com/u/8446900/game_screen_plant.png

..p...h.
..,...,.
########
Run Code Online (Sandbox Code Playgroud)

椅子是'h','d'用于桌面,'p'是植物,','用于透明背景图块(不与用户交互).'''是一个透明的瓷砖,用户可以站在那里(伸展桌子).问题是,正如你所看到的,背景似乎有一个洞.

我应该制作一个实际的瓷砖地图并将所有内容组合成一个大的png吗?我可以采取的另一个选择是将每个宽或高的瓷砖切割成两个不同的瓷砖.专业人士如何做到这一点?我不是在寻找一个快速而肮脏的解决方案,而是现代平台游戏的运行方式.

更新:在查看答案后,我发现了一个非常有用的工具,可以将精灵打包成一张纸.

http://spritesheetpacker.codeplex.com/

更新:我新升级的磁贴引擎更快,几乎一样简单.以下建议很棒.强力推荐.

tile-engine xna-4.0

1
推荐指数
1
解决办法
589
查看次数