我的计算机上有Launch4J,这是一个很棒的程序.我感兴趣的一个功能是能够在一般.EXE文件中捆绑JRE.但是,我找不到任何描述如何执行此操作的文档.
如何将JRE与EXE捆绑在一起?另外,我在哪里可以运行紧凑的便携式JRE?Oracle上的下载链接用于安装程序包.
我有一个基于LWJGL的游戏引擎,要运行它我需要将所需的本机库放在用户的计算机上.在Windows上,我通过以下方式找到Application Data目录:
System.getenv("APPDATA");
Run Code Online (Sandbox Code Playgroud)
一切都很容易,很好.我创建一个File对象,必要时调用mkDir,如果文件不在机器上,则写入文件.
(注:创建的目录不应该是一个临时文件,因为我想为未来的运行.此外,保存提取文件,创建该目录给出了保存游戏和其他类似数据的简单和易于使用的文件夹.)
但是,如果计算机是Macintosh或Linux,我想做类似的事情,但我不熟悉如何使用这两个系统,我并没有真正处于良好的测试位置.我目前找到目标目录的方法是这样的:
private static String defaultDirectory()
{
String OS = System.getProperty("os.name").toUpperCase();
if (OS.contains("WIN"))
return System.getenv("APPDATA");
else if (OS.contains("MAC"))
return System.getProperty("user.home") + "/Library/Application "
+ "Support";
else if (OS.contains("NUX"))
return System.getProperty("user.home");
return System.getProperty("user.dir");
}
Run Code Online (Sandbox Code Playgroud)
那么,这是正确的方法吗?我正在尝试访问Mac上的应用程序支持(我已经知道这相当于Windows上的AppData文件夹)而我正在尝试在Linux上使用类似的文件夹,但我不确定是否"用户.家"找到正确的.
我正在使用Socket与ServerSocket通信.字符串正从服务器发送到我的Socket.每条不同的行都是一条消息,在解析时包含信息.要阅读这些文本行,请使用扫描仪.
问题是数据正在"爆发".虽然服务器连续均匀地发送数据,但客户端扫描器读取的数据似乎暂停,一次读取一堆消息(30-40),然后再次暂停.它无限期地重复这个循环.
如果我增加发送数据的速率,则暂停的持续时间减少; 如果我减慢数据速度(每秒1条消息),则错误仍然存在,暂停时间变长.这几乎就像Socket在向扫描器发送任何数据之前等待其缓冲区溢出一样; 然后冲洗所有东西并再次等待溢出.但是,如果我减小Socket缓冲区的大小,则根本没有任何变化.
应该注意的是,我之前在这个方法中使用过Scanner和Socket - 从服务器端 - 并且一切都按照需要工作.另外,我a)尝试使用像Java Tutorials这样的BufferedReader(没有更改bug)和b)将服务器传输列表打印到文件中,并以相同的方式从文件中读取,并且程序按预期工作(消息接收率恒定等)因此问题似乎在Socket本身.
那么:我该如何解决这个问题呢?我没有想法,我真的不知道发生了什么.
代码(根据要求):
// In try block
// Makes the connection
Socket connection = new Socket(TARGET_MACHINE, PORT_NUMBER);
Scanner reader = new Scanner(connection.getInputStream());
Run Code Online (Sandbox Code Playgroud)
// In new Thread
// In run()
while(!finished) // Boolean exit strategy
{
if(reader.hasNextLine())
Sring message = reader.nextLine();
}
Run Code Online (Sandbox Code Playgroud)
这就是我连接和检索字符串的方式.
另外,我收到的字符串通常大约20-40个字符.
所以,我正在开发一款游戏引擎,并取得了不错的进步.但是,我的引擎是单线程的,将更新和渲染拆分为单独的线程的优点听起来是一个非常好的主意.
我该怎么做?单线程游戏引擎(概念上)非常容易制作,你有一个循环,你更新 - >渲染 - >睡眠 - >重复.但是,我想不出一个打破更新和渲染分离的好方法,特别是如果我改变他们的更新速率(比如我经历更新循环25x一秒,并且有60fps用于渲染) - 如果我开始中途更新怎么办?通过渲染循环,反之亦然?
我怎样才能有一个类型引用引用任何实现一组接口的对象?
例如,我可以有这样的泛型类型:
Java的:
public class Foo<T extends A & B> { }
Run Code Online (Sandbox Code Playgroud)
C#
public class Foo<T> where T : A, B { }
Run Code Online (Sandbox Code Playgroud)
这就是如何拥有类范围的泛型类型.但是,我想简单地拥有一个数据成员,它引用任何扩展给定接口集的对象.
例:
public class Foo
{
protected <? extends A, B> object;
public void setObject(<? extends A, B> object)
{
this.object = object;
}
}
Run Code Online (Sandbox Code Playgroud)
如果有可能有这种类型的语法,我怎么能在Java和C#中做到这一点?
我意识到我可以创建另一个扩展所有所需接口的接口.但是,我不认为这是最优的,因为它不必要地添加另一种类型,其唯一目的是绕过语法.虽然这是一个非常小的问题,但就优雅而言,它有点令人痛苦.
所以,我最近在Java中发现了finalize方法(不知道为什么我之前错过了它,但它确实存在).这似乎可能是我正在处理的许多问题的答案,但我想首先获得更多信息.
在线,我发现这个图表说明了垃圾收集和完成的过程:

几个问题:
我想我应该解释为什么我感兴趣.我经常使用LWJGL,似乎如果我可以使用finalize来使Java对象自动清理OpenGL资源,那么我可以在API方面做一些非常好的事情.
java multithreading garbage-collection memory-management finalize
假设您有一个接口A和一个接口B.假设Sprite该类实现了两个接口.
假设另一个类有一个方法foo(A object),并且还有一个方法foo(B object).
当我将方法的实例传递Sprite给方法时,两者都会被调用foo()吗?如果没有,哪个优先?
如何获取GeneralPath对象的顶点?看起来这应该是可能的,因为路径是由点(lineTo,curveTo等)构成的.
我正在尝试创建一个double [] []点数据(x/y坐标数组).
我正在使用LWJGL开发Java游戏.与主游戏一起,我正在开发一些基于Swing的应用程序(启动器,配置编辑器和地图编辑器).
当我运行启动器时,我有时(大约10%的时间)会遇到致命的JVM崩溃.这很奇怪 - 我可以在几秒钟后运行该程序,一切正常.我没有编译错误或警告,当程序运行时,它完全正常.
当我运行LWJGL游戏时,我没有得到错误,只有当我首先运行启动器时才会出现错误.我用来初始化启动器的过程是:
我得到的错误如下:
# # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000007fefd800c7b, pid=6128, tid=4364 # # JRE version: 6.0_27-b07 # Java VM: Java HotSpot(TM) 64-Bit Server VM (20.2-b06 mixed mode windows-amd64 compressed oops) # Problematic frame: # C [ole32.dll+0x10c7b] # # An error report file with more information is saved as: # J:\Development\workspace\Crypt Utils\hs_err_pid6128.log # # …
这里只是有点空闲的好奇心.
基本上,如果我有一个只有少量原始数据成员的对象,它会占用少量内存,并且根本不需要很长时间来创建.但是,如果我有很多与该对象相关的方法会发生什么?对象实例化是否必须考虑到这些?
例如,假设我有一个Class(在这里插入荒谬的大数字)我可以调用的不同方法的数量.与没有方法相比,JVM是否需要更长时间来创建该类的实例?
所以,我有以下代码写入文件:
Formatter output = ....... // Creating the formatter works, writes to appropriate file.
output.format("%d\n", records.length);
for(GradeRecord gR:records)
{
output.format(gR.toString() + "\n");
}
Run Code Online (Sandbox Code Playgroud)
唯一的问题是,输出没有换行符.
如果我用"\ _"替换"\n"也不起作用.
......我不知道为什么这不起作用.输出已创建并正确写入.(我看到创建的文件,所有内容都写在其中,除了换行符.)
我正在研究一个小型游戏几何库,在一堆其他方法中,我希望能够找到圆形和矩形之间的交点中点.但是,我很难想到快速算法.有谁知道这样做的好算法?
如果这意味着算法会明显加快,我愿意牺牲完美的准确性.
我代表每个形状的基本方法是:
圈子:
矩形:
编辑:
由于似乎对"中点"的含义感到困惑,让我澄清一下:
假设圆和矩形相交,则存在由它们的重叠创建的区域.我想确定这个区域的地理中心(确切地说,或者确定一个近似的近似值).
示例:http://en.wikipedia.org/wiki/Centroid
编辑#2:
你们给了我一些想法,让我努力实现其中的一些,我会回复你.
闭幕思考:
我把Gareth的答案标记为已接受的答案,因为它给了我最终结果的想法,但我的最终实现与他的不同,所以我将在这里解释.
我想出了两种一般的方法:一种是完全准确的(但需要更复杂的编程和更多的数学运算),另一种是更简单/更快的方式,它始终相当接近.我最后选择了后者,但这里有两种方法:
方法1:形状碎片:

基本上,我们的想法是将重叠区域分解为可以轻松计算其中点和面积的离散区段,然后对整个结果进行加权平均.
此处显示的示例有三个子部分:占据区域大部分的中心矩形,以及用于圆的边缘的两个弯曲部分.
方法2:线插值

首先,您需要计算矩形中将作为基本位置的点.这应该是一个容易计算并且重叠的点.我在这一点上使用的是圆和矩形的所有边缘交点的平均值(如果不存在边缘交点,我默认为圆的位置,因为它意味着一个形状包含在另一个中).
计算圆心和该点之间的直线.然后,计算位于重叠区域内的段.该区域的中点被视为该线段的中点.
这种方法不准确,但总是在两个对象中产生一个点,并且结果点通常接近中间(因此它看起来对于随意的眼睛来说是好的).它也更简单,更快,所以我选择了它.
java ×11
2d ×2
file ×2
geometry ×2
interface ×2
performance ×2
algorithm ×1
area ×1
c# ×1
debugging ×1
directory ×1
exe ×1
fatal-error ×1
finalize ×1
formatter ×1
intersection ×1
io ×1
jvm ×1
launch4j ×1
linux ×1
lwjgl ×1
macos ×1
methods ×1
newline ×1
oop ×1
parameters ×1
portability ×1
sockets ×1
swing ×1
syntax ×1