如果你在基于Linux的平台上编译一个程序,比如C,然后移植它来使用MacOS库,它会起作用吗?
核心机器代码是来自兼容Mac和Linux的编译器吗?
我问这个的原因是因为两者都是"基于UNIX的"所以我认为这是真的,但我不太确定.
不要SoftReference和WeakReference当为实例变量创建真的只有帮助吗?在方法范围内使用它们有什么好处吗?
另一个重要的部分是ReferenceQueue.除了能够跟踪确定垃圾的哪些引用外,还Reference.enqueue()可以用来强行注册垃圾回收对象?
例如,是否值得创建一个方法,该方法在对象中占用大量内存资源(由强引用持有)并创建引用以将它们排入队列?
Object bigObject;
public void dispose() {
ReferenceQueue<Object> queue = new ReferenceQueue<Object>();
WeakReference<Object> ref = new WeakReference<Object>(bigObject, queue);
bigObject = null;
ref.enqueue();
}
Run Code Online (Sandbox Code Playgroud)
(想象一下,在这种情况下,Object表示一个使用大量内存的对象类型...喜欢BufferedImage什么的)
这有什么现实的效果吗?或者这只是浪费代码?
java memory garbage-collection weak-references soft-references
我目前正致力于将OpenGL驱动的渲染器实现到2D游戏引擎中.
因为OpenGL屏幕坐标空间是[-1,1],所以我对如何与通用的笛卡尔2D世界坐标系接口感到困惑.
让我们说世界上的视口是[-500,-500]到[1200,1200],其中[0,0]是世界的起源.我只需要翻译并缩小到-1和1之间的坐标吗?或者是否需要执行其他形式的转换?
如何计算在屏幕上绘制已在您自己的坐标系中定义位置的对象的位置?
我很感激有和没有glOrtho的解释(因此我们也可以使用Z轴进行透视效果).
在我看来较新的Android设备在NAT后面,那里的本地地址是内部的载体或LAN地址与公网地址是路由器或运营商分配的外部地址运行.
然而,使用NetworkInterface时,较新的电话不会像访问IP检测服务时那样返回相同的地址.
因此,通过直接P2P SocketChannel连接本身就会失败.
针对Android平台设计此问题是否有任何常见的解决方法?任何人都可以澄清导致这种类似NAT的安全问题的原因吗?
任何指向Java NAT遍历教程或示例(不是论文或论文)的链接也会被视为有用(因为我不太确定如何在Java中实现它).
我当然也会接受任何人提供的任何其他解决方案!
我最近读到,在较新的计算机中,由于多核计算机的新可用性,Java的I/O性能优于NIO.
我运行了一个快速测试,使用localhost环回地址比较LAN上I/O和NIO的传输时间.
注意:这是使用JDK 7
结果(3项试验):
I/O传输平均为21789.3ms
NIO转移平均为22771.0ms
值得注意的是,与I/O相比,每次NIO传输的CPU使用率似乎高出约10%.
我的问题是,如果我的比较代码是公平的吗?我是否写好/等于I/O和NIO代码?如果没有,我该如何改进并重新运行此测试?
public static void main(String[] args) {
System.out.println("Initiating test sequence...");
new Thread(new Client()).start();
try {
System.out.println("Server I/O initiating...");
ServerSocket server = new ServerSocket(5555);
Socket sock = server.accept();
System.out.println("Server connected to client successfully");
InputStream is = sock.getInputStream();
File output = new File("C:/test_root/video.avi");
FileOutputStream fos = new FileOutputStream(output);
byte[] data = new byte[1024];
int len=0;
System.out.println("Server initiating transfer - Timer starting");
long start = System.currentTimeMillis();
while((len=is.read(data))>0) {
fos.write(data, 0, len);
fos.flush();
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试将TabHost中的选项卡内容设置为RelativeLayout(在我的一个XML文件的顶层中定义).
我已经尝试通过使用R.layout.lobby_tab和R.id.lobby_base来识别它(ID被添加为XML声明中的项目).
无论哪种方式,我在setContent(View)方法中得到NullPointerException:
02-12 22:42:12.907: E/AndroidRuntime(2028): FATAL EXCEPTION: main
{webs.winbatch.dwd/webs.winbatch.dwd.HostActivity}: java.lang.NullPointerException
02-12 22:42:12.907: E/AndroidRuntime(2028): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
02-12 22:42:12.907: E/AndroidRuntime(2028): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
02-12 22:42:12.907: E/AndroidRuntime(2028): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
02-12 22:42:12.907: E/AndroidRuntime(2028): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
02-12 22:42:12.907: E/AndroidRuntime(2028): at android.os.Handler.dispatchMessage(Handler.java:99)
02-12 22:42:12.907: E/AndroidRuntime(2028): at android.os.Looper.loop(Looper.java:123)
02-12 22:42:12.907: E/AndroidRuntime(2028): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-12 22:42:12.907: E/AndroidRuntime(2028): at java.lang.reflect.Method.invokeNative(Native Method)
02-12 22:42:12.907: E/AndroidRuntime(2028): at java.lang.reflect.Method.invoke(Method.java:507)
02-12 22:42:12.907: E/AndroidRuntime(2028): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-12 22:42:12.907: E/AndroidRuntime(2028): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-12 22:42:12.907: E/AndroidRuntime(2028): at dalvik.system.NativeStart.main(Native Method)
02-12 22:42:12.907: E/AndroidRuntime(2028): Caused by: java.lang.NullPointerException
02-12 …Run Code Online (Sandbox Code Playgroud) 我从其他几个报告中读到,人们通常会在一个简单的基本JNI呼叫上大约4-80 ns:
对于琐碎的原生方法,去年我发现在我的Windows桌面上平均调用40 ns,在我的Mac桌面上调用11 ns.
然而,JNI通常需要大约30 ns.
当我在我的JNI代码中调用简单方法时(简单来说,我的意思是时间int返回类型int只有一个参数),我的往返调用时间(用System.nanoTIme测量)在50,000-80,000 ns之间.
如果我做一个VM"预热"并在计时之前运行几百次,我仍然会得到大约2000-4000 ns(800-1000以下).(如上所述,我听到其他人报告<100 ns ..并且比频繁呼叫时加起来高10到20倍.)
这是正常速度吗?什么可能导致我的本机代码被调用这么慢?
更新:
JNIEXPORT jint JNICALL Java_com_snap2d_gl_RenderControl_correctGammaNative
(JNIEnv *env, jobject obj, jint pixel) {
return X2D_correctGamma(pixel, 1.0f);
}
Run Code Online (Sandbox Code Playgroud)
其中X2D_correctGamma(int,float)是一种校正像素伽玛值的方法(自发布以来我实现了本机代码).
Java基准测试:
for(int i = 0; i < 100; i++) {
long t1 = System.nanoTime();
correctGammaNative(0xFFF);
long t2 = System.nanoTime();
System.out.println(t2 - t1);
}
Run Code Online (Sandbox Code Playgroud)
这是"热身"代码.初次调用后,大多数printlns读取800-1000ns.
不幸的是,我可能不得不废弃它,因为它应该用于渲染,并且每秒调用数千次将帧速率降低到1 FPS.
系统信息:
行为类似:JDK1.6.0_32(64位),JDK1.7.0_04(64位)和JRE1.7.0_10(32位)
Windows 7 64位
16GB RAM
i7-3770四核CPU @ 3.4-3.9ghz
GNU GCC MinGW编译器(32位和64位)
我对C多长时间有点困惑.
如果我在Java中要求long的最大值,我会在quintillions中得到一个数字.如果我用C签名,签名或未签名,那就是数十亿.
Java建立在C语言上...所以差异来自哪里?
我也尝试用长long值,unsigned/signed long值和long int值表示文字.他们似乎都没有处理过数十亿中期的数字.为什么?我犯了错误吗?
我编写了一个类来覆盖类Object中的equals(Object)方法,以使用对象的实例值将类类型的对象与类类型的其他对象进行比较.
当我将一个对象的实例作为键放在HashMap中,然后在地图上调用get(Object)时,一个新的但相同的对象作为键,它返回null.
我已经尝试将一个新的,相同的对象传递给equals方法,它返回true,所以问题不是我的比较代码.
从我通过调试收集到的内容,我的对象中的equals(Object)方法永远不会被调用.
但是,如果在HashMap中使用String键,然后将具有相同字符的新实例传递给get(Object),则会成功返回该值.
为什么会这样?如何根据MY equals方法获取HashMap测试键?
我一直在将第三方库JAR提取到我的开源Java库中,以便依赖项在运行时工作.
我记得当我在Eclipse中尝试这样做的时候(不同的项目)它产生了警告,在执行此操作之前检查许可.
关于何时可以将库内容重新打包到JAR中,应该如何完成以及哪些广泛使用的许可证禁止它的一般规则究竟是什么?
具体来说,我重新打包的库使用BSD和LGPL.
在此先感谢您的帮助.
编辑
我实际上最终分离出依赖项以防止代码冲突,正如几位评论者所建议的那样.再次感谢您提供的建议和信息.
java ×7
c ×3
android ×2
networking ×2
benchmarking ×1
collections ×1
compilation ×1
coordinates ×1
executable ×1
hashmap ×1
io ×1
jar ×1
licensing ×1
linux ×1
long-integer ×1
macos ×1
memory ×1
nat ×1
nio ×1
object ×1
opengl ×1
p2p ×1
packaging ×1
performance ×1
rounding ×1
screen ×1