我花了一些时间研究Java的硬件加速功能,我仍然有点困惑,因为我没有直接在网上找到的网站,并清楚地回答了我的一些问题.以下是我对Java硬件加速的问题:
1)在Eclipse版本3.6.0中,使用最新的Mac OS X Java更新(我认为1.6u10),默认情况下是否启用了硬件加速?我读到了某个地方
someCanvas.getGraphicsConfiguration().getBufferCapabilities().isPageFlipping()
Run Code Online (Sandbox Code Playgroud)
应该指示硬件加速是否已启用,并且我的程序在我的主Canvas实例上运行以进行绘制时报告为true.如果我的硬件加速现在没有启用,或者默认情况下,我需要做些什么才能启用它?
2)我在这里和那里看过一些关于BufferedImage和VolatileImage之间差异的文章,主要是说VolatileImage是硬件加速图像并存储在VRAM中以便快速复制操作.但是,我也发现了BufferedImage被称为硬件加速的一些实例.BufferedImage硬件在我的环境中也加速了吗?如果两种类型都是硬件加速的话,使用VolatileImage会有什么好处?我的主要假设是,在两者都具有加速度的情况下具有VolatileImage的优点是VolatileImage能够检测其VRAM何时被转储.但是如果BufferedImage现在也支持加速,它是否也不会内置同样的检测,只是内存被丢弃的用户隐藏?
3)使用是否有任何好处
someGraphicsConfiguration.getCompatibleImage/getCompatibleVolatileImage()
Run Code Online (Sandbox Code Playgroud)
而不是
ImageIO.read()
Run Code Online (Sandbox Code Playgroud)
在一个教程中,我一直在阅读关于正确设置渲染窗口的一些一般概念(教程),它使用getCompatibleImage方法,我相信它返回一个BufferedImage,以获得快速绘制的"硬件加速"图像,这引起了质疑2关于它是否是硬件加速.
4)这是较少的硬件加速,但这是我一直很好奇的事情:我需要订购哪些图形被绘制?我知道当通过C/C++使用OpenGL时,最好确保在需要一次绘制的所有位置绘制相同的图形,以减少当前纹理需要切换的次数.从我所看到的情况来看,似乎Java会为我照顾这一点,并确保以最佳方式绘制事物,但同样,没有任何事情能够清楚地说出这样的事情.
5)什么AWT/Swing类支持硬件加速,应该使用哪些?我目前正在使用一个扩展JFrame的类来创建一个窗口,并添加一个Canvas来创建一个BufferStrategy.这是一个好的做法,还是有其他类型的方法我应该实现这个?
非常感谢您的时间,我希望我提供了明确的问题和足够的信息,以便您回答我的几个问题.
老实说,我不知道为什么会这样.我检查,双重检查,三重检查花括号,分号,移动构造函数等,它仍然给我这个错误.
相关代码如下.
BinTree.h
#ifndef _BINTREE_H
#define _BINTREE_H
class BinTree
{
private:
struct Node
{
float data;
Node *n[2];
};
Node *r;
Node* make( float );
public:
BinTree();
BinTree( float );
~BinTree();
void add( float );
void remove( float );
bool has( float );
Node* find( float );
};
#endif
Run Code Online (Sandbox Code Playgroud)
和BinTree.cpp
#include "BinTree.h"
BinTree::BinTree()
{
r = make( -1 );
}
Node* BinTree::make( float d )
{
Node* t = new Node;
t->data = d;
t->n[0] = NULL;
t->n[1] = NULL; …Run Code Online (Sandbox Code Playgroud) 好吧,这是一个双重目的的问题.我希望从中获得的主要内容是更多的多线程知识.在多线程方面,我是一个完全新手,这是我第一次尝试在多线程中做任何事情.我希望带走的另一件事是对一件作业的一些帮助,我正在变成一个更复杂的用于娱乐和学习的非常项目.在这个问题的第一部分,我将详细介绍我在家庭作业中一直在研究的主题的思路和方法.如果我正在做任何不好的做法,需要修复,无论如何,请让我知道,这样我就可以学习.我再一次对多线程几乎一无所知.
首先,我目前正在修读一门计算机科学课程,为此,我要做的是使用我已经学过的技术和数据结构的家庭作业,因此没有挑战性.为了尝试不完全厌倦我的头骨,我试图采取一个简单的项目(创建一个链接列表和一个排序的链接列表),并将其转换为一个多线程的法兰克计划.我想将添加新元素的方法放在一个单独的线程中并从队列中获取输入(对于无序列表不是完全必要的,但对于正确的排序更有用),对于有序列表,我想要一个单独的线程将巡视列表以确保所有元素都按顺序排列(我不允许更改的方法之一返回对整个节点的引用,这些节点具有完全公共数据).这些是我想要创造的两件主要事情,但绝对不是我想要尝试和弄清楚的唯一事情.这只是一个了解多线程的测试,所以我并不是特别为了实用性而设计这个项目.如果你想对什么是优秀的编程实践留下评论应该是什么线程,那么我们将非常感激.
作为我最近采取的一个步骤,通过阅读StackOverflow本身的帖子收集到的想法,我创建了一个主类,其中传递了Threads,因此它可以在程序结束时停止它们并清理所有内容.这是通过使用someThread.interrupt()并使用Thread的run()方法检查该异常来完成的.但是,我发现这个方法存在问题:大多数情况下,通过线程运行并调用interrupt()的循环实际上并不运行.以下是该方法的代码:
public static void stopAllThreads()
{
boolean stopped = false;
while( !stopped )
{
System.out.println( "Stopping all threads" );
synchronized( threads )
{
System.out.println( "Threads being stopped: " + threads.size() );
for( int i = 0; i < threads.size(); i++ )
{
System.out.println( "Stopping: " + threads.get( i ) );
threads.get( i ).interrupt();
}
threads.clear();
stopped = true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在尝试调试它时,我放入while循环尝试强制该方法最终运行for循环,但所有发生的是输出"Stopping all threads"然后我再也看不到任何其他内容了.我不知道这是一种不好的编码方式,也不知道这段代码有什么问题.任何有关如何使这项工作有所帮助的人都会受到赞赏(如果您需要查看更多课程,请告诉我.我真的不知道您需要看什么,但我不想复制和粘贴几个整个java文件).
除了这个问题之外,我还确定在运行我的程序时,它将到达最后一行并尝试在线程通过要添加到列表的数字队列之前停止所有线程.在向队列添加数字后直接尝试通过toString方法输出列表时,这也是一个问题,因为还没有添加任何内容,因此不会向控制台输出任何内容.这是我的主要方法,它显示了事情发生的顺序(虽然我认为在处理线程时它不那么重要):
public static void main( String[] args )
{
// always make sure this …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用它提供的FFI在Racket中使用Chipmunk物理库.但是,我目前在实际上让FFI找到Chipmunk库中的函数时遇到了问题,即使它似乎正确地加载了库.
我正在使用最新版本的基于Windows 8和Visual Studio 2008的Chipmunk(6.1.1).我设置了"CHIPMUNK_FFI"标志,以便加载chipmunk_ffi.h文件.我正在使用"Multi-Threaded DLL"和"Build as a dll"optoins正在使用的Release DLL配置下构建代码.我使用的Racket代码如下:
#lang scheme
(require ffi/unsafe
ffi/unsafe/define)
(define chipmunk (ffi-lib "./chipmunk"))
(define-ffi-definer define-chipmunk chipmunk)
(define _cpFloat _double)
(define cpFloat? real?)
(define _cpDataPointer _pointer)
(define _size_t _ulong)
(define _cpHashValue _size_t)
(define-cstruct _cpVect
([x _cpFloat]
[y _cpFloat]))
(define cpv
(get-ffi-obj "cpvadd" chipmunk (_fun _cpVect _cpVect -> _cpVect)))
Run Code Online (Sandbox Code Playgroud)
我收到错误:
ffi-obj: couldn't get "cpvadd" from "chipmunk.dll" (The specified procedure could not be found.; errno=127)
=== context ===
C:\Program Files (x86)\Racket\collects\ffi\unsafe.rkt:180:2: get-ffi-obj*
C:\Users\me.000\AppData\Roaming\Racket\planet\300\5.2.1\cache\jaymccarthy\chipmunk.plt\1\0\chipmunk-ffi-new.ss: [running body]
C:\Users\me.000\AppData\Roaming\Racket\planet\300\5.2.1\cache\jaymccarthy\chipmunk.plt\1\0\chipmunk-new.rkt: [traversing …Run Code Online (Sandbox Code Playgroud) 在 C 中任意大小的字节数组中,我想存储紧密打包的 14 位数字 (0-16,383)。换句话说,在序列中:
0000000000000100000000000001
Run Code Online (Sandbox Code Playgroud)
有两个数字我希望能够任意存储和检索为 16 位整数。(在这种情况下,它们都是 1,但可以是给定范围内的任何东西)如果我有函数uint16_t 14bitarr_get(unsigned char* arr, unsigned int index)and void 14bitarr_set(unsigned char* arr, unsigned int index, uint16_t value),我将如何实现这些函数?
这不是一个家庭作业项目,只是我自己的好奇心。我有一个将用于的特定项目,它是整个项目的关键/中心。
我不想要一个包含 14 位值的结构数组,因为它会为每个存储的结构生成浪费位。我希望能够将尽可能多的 14 位值压缩到一个字节数组中。(例如:在我发表的评论中,将尽可能多的 14 位值放入 64 字节的块中是可取的,没有浪费位。对于特定用例,这些 64 字节的工作方式是完全紧凑的,这样即使是一位浪费将剥夺存储另一个 14 位值的能力)
对于正在发生的事情,这是一个小故事.我目前正在构建一些东西(包括SDL,SDL_image等),并将它们连接在一个可执行文件中,并手动完成.我正在制作我自己的自定义makefile,只使用命令行,而不是Xcode.(我不喜欢Xcode)到目前为止,我已经成功完成了所有这些,但是我想开始将Lua脚本放在我的代码之上,所以我现在正在编译luajit2.0并尝试将其链接起来.
然而,虽然SDL工作正常,我可以打开一个带有加载图像的窗口,但luajit拒绝正确链接.它给了我dyld:库没有加载...消息,引用/ usr/local/lib,即使它不仅不存在,但gcc在命令行上给了-L到保存我内置的文件夹luajit.在我的二进制文件上使用otool -L给出了该目录,即使它再次在那里也不存在.
在试图谷歌这个问题时,我遇到了一个给我这个命令的解决方案:install_name_tool -id `pwd`/install/lib/libluajit-5.1.dylib install/lib/libluajit-5.1.dylib.(从SO)重建二进制文件并在其上使用otool后,我现在看到了库的正确目录.然而,现在,虽然它没有给我dyld错误,但它在我使用luajit函数时给了我一个段错误.(luaL_newstate,具体而言)
构建我的二进制文件的命令如下:
gcc -g -Wall -arch x86_64 -framework Cocoa -Iinstall/include -Linstall/lib src/native/main.c -lluajit-5.1.2.0.0 -lSDL2_image -lSDL2 -lSDL2main -lpng -lz -o game
Run Code Online (Sandbox Code Playgroud)
libluajit-5.1.2.0.0.dylib,所有相应的符号链接都在install/lib中.lua包含文件在install/include中.这里出了什么问题?我很困惑,想要开始工作.我宁愿摔跤代码而不是摔跤gcc和OS X.
编辑:每个请求,我在当前的"分段错误:11"错误之前得到的上一个错误,我得到的基本上是这样的:
dyld: Library not loaded: /usr/local/lib/luajit-5.1.2.dylib
Referenced from: <my application, forgot this exact bit>
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
如果我做了otool -L游戏,我得到了:
MacBook-Air:old freezerburn$ otool -L game
game:
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 19.0.0)
/usr/local/lib/libluajit-5.1.2.dylib (compatibility version 2.0.0, current version 2.0.0)
/Users/freezerburn/Dropbox/Code/lua_engine/old/install/lib/libSDL2_image-1.2.0.dylib (compatibility version 9.0.0, current version 9.5.0) …Run Code Online (Sandbox Code Playgroud) 我正在尝试在C++中创建一个可变长度函数(显然,heh),而我现在所拥有的功能,但仅适用于第一个参数.如果有人可以请让我知道如何使用所有通过的论点,我会非常感激.
码:
void udStaticObject::accept( udObjectVisitor *visitor, ... )
{
va_list marker;
udObjectVisitor *i = visitor;
va_start( marker, visitor );
while( 1 )
{
i->visit_staticObject( this );
//the if here will always go to the break immediately, allowing only
//one argument to be used
if( ( i = va_arg( marker, udObjectVisitor* ) ) )
break;
}
va_end( marker );
}
Run Code Online (Sandbox Code Playgroud)
根据我过去发布的帖子以及我提供的任何帮助帖子,可能会提供一些我没有提供的信息,您需要知道这些信息才能提供帮助.如果我忘了什么,我会提前道歉,请告诉我您需要知道的内容,以便我提供相关信息.