我正在重写我的一个小C数学库,它最终会成为用户的静态库,并希望从我的矢量数学界面的内联中受益.
我有以下内容:
[mymath.h]
...
...
extern float clampf( float v, float min, float max );
...
...
Run Code Online (Sandbox Code Playgroud)
[mymath.c]
inline float clampf( float v, float min, float max )
{
if( v < min ) v = min;
if( v > max ) v = max;
return v;
}
Run Code Online (Sandbox Code Playgroud)
由于我的库是静态的,我只是要向用户提供.h
(和.lib
),clampf
在编译时是否会在程序中内联函数?
我做了正确的事情,但在声明函数extern
在.h
中和内联.c
?
我正在尝试创建一个将C/C++用作"脚本语言"的架构.我已经有一个原型工作基于:
http://www.codeproject.com/Articles/29999/Compiling-C-code-at-runtime
和
http://runtimecompiledcplusplus.blogspot.com
我的原型允许我重新编译动态链接库/共享对象并在运行时重新加载它.我只有一个小问题让我们举例说明以下代码:
[bot.c]
typedef struct
{
float health;
float speed;
bool alive;
} Bot;
Bot bot = { .health = 100.0f,
.speed = 1.0f,
.alive = true };
void OnCollision( void )
{
bot.health -= 10.0f;
if( bot.health <= 0.0f )
{ bot.alive = false; }
}
void OnUpdate( void )
{
if( bot.alive )
{
/* Update animation */
}
}
Run Code Online (Sandbox Code Playgroud)
如果将bot.c脚本分配给1个机器人就可以了,但是如果我将回调分配给多个机器人,它们会共享相同的数据(1个被点击,它们都会受到攻击!).如何为每个机器人"单独"运行bot脚本?
我已经在(使用了setjmp/longjmp的),但其风险对C++的构造函数和析构函数(也迫使你的宏集成的功能里面,这在我的情况不是一个选项,我的用户)在C/C++协程研究.
我正在考虑运行多个线程,但会出现同样的问题(因为数据来自dll /所以它是共享的).我不太熟悉fork/co-process,但它似乎不适用于我的情况.而且我不认为管道也是一种选择......我几乎卡住了.
反正有没有解决这个问题?
ps:是的我知道像Lua或Javascript(V8)这样的脚本语言具有内置协程或Lua lua_thread会解决我的问题,但我想坚持使用C/C++接口让用户编写代码,因为它的对于游戏性能至关重要!
我正在努力解决以下问题.我正在使用骨骼动画,我希望(即)玩家的头部跟随太空中的另一个物体.我的上轴是+ Z我的前轴是+ Y,四元数的大小是W.我试着使用gluLookAt的mesa代码并使用3x3矩阵转换为四元数但它不能按预期工作所以我走向另一个方向......
到目前为止,我得到了以下代码"几乎"工作,至少玩家的头部正在旋转(但X角度似乎影响Y旋转轴)在良好的方向,但它直视上面而不是跟随一个对象约65度的地板:
qt LookRotation( v3 lookAt, v3 upDirection )
{
qt t;
v3 forward = lookAt;
v3 up = upDirection;
OrthoNormalize( &forward, &up );
v3 right = v3_cross( up, forward );
mat3 m = mat3_make( right.x, up.x, forward.x,
right.y, up.y, forward.y,
right.z, up.z, forward.z );
t.w = sqrtf( 1.0f +
m.r[ 0 ].x +
m.r[ 1 ].y +
m.r[ 2 ].z ) * 0.5f;
float w4_recip = 1.0f / ( 4.0f * t.w );
t.x = ( m.r[ …
Run Code Online (Sandbox Code Playgroud) 我的引擎可以运行,OSX,Windows,Linux,Android和iOS; 我使用OpenAL处理3d声音.在OSX和iOS上,我正在使用为平台和其他Im使用OpenAL-soft的默认库.
使用OpenAL-soft音效可以使用ALC_EFX但是对于OSX和iOS我似乎只能访问ALC_ASA(这是Apple特有的,与EFX相比似乎有限).这是我唯一的选择吗?我无法使用OpenAL拥有真正的跨平台SFX系统?无论如何我可以在iOS/OSX上使用ALC_EFX吗?
我为我的应用程序编写了一个分析工具,我使用dladdr将函数指针转换为name.只要Im在调试中,一切正常,但只要我在发布中编译(使用XCode 5.1),所有名称转换都会失败并返回NULL ex:
#include <dlfcn.h>
int main( int argc, char **argv )
{
Dl_info info;
if( dladdr( main, &info ) != 0 )
{ fprintf( stderr, "%s\n", info.dli_sname ); }
Run Code Online (Sandbox Code Playgroud)
我尝试了多个编译器标志,我将其传递给C/C++标志:-export-dynamic -fPIC以及-Wl, - export-dynamic没有任何作用...有没有办法仍然使用优化进行编译并保留函数地址 - > dladdr的名称翻译功能?
我成功地将Lua集成到了我的应用程序中,为用户提供了脚本访问权限.现在我的问题是:我如何防止双重免费或不良访问违规?
我已经为每个结构实现了Init和Free函数,例如:
structaInit
structaFree
每次将struct指针链接到另一个时,我也会跟踪,增加我所有结构中的引用计数.
但是用户总是可以在Lua中做这样的事情:
a = structaInit();
b = structbInit();
structbSetA( b, a ); -- This add ++a.reference
a.reference = 0;
a = structaFree( a ); -- If a->reference == 0 then I free
-- Then struct b->a is still a valid pointer but that have been free.
Run Code Online (Sandbox Code Playgroud)
无论如何我可以阻止这种情况发生吗?
我正在研究如何在我的应用程序中集成完整的脚本支持,但有一点问题,规划我的C API是LUA友好的.
基本上我有一堆通过init和free函数创建的结构,如下所示:
[test.h]
typedef struct
{
char name[ 50 ];
} Test;
Test *TestAdd( char *name );
Test *TestDelete( Test *test );
Run Code Online (Sandbox Code Playgroud)
[test.c]
Test *TestAdd( char *name )
{
Test *test = ( Test * ) calloc( 1, sizeof( Test ) );
strcpy( test->name, name );
return test;
}
Test *TestDelete( Test *test )
{
free( test );
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
我使用swig生成LUA模块,因此我创建了以下接口文件:
[test.i]
%module test
%{
%}
Test *TestAdd( char *name );
Test *TestDelete( Test * test );
Run Code Online (Sandbox Code Playgroud)
如果用户代码如下所示,一切正常: …
我将一些SSE代码移动到Neon,我找不到与_mm_movelh_ps相同的任何东西.我谷歌相当有点找不到任何东西......我错过了什么?有没有任何霓虹功能做同样的事情或我将不得不在CPU上实现它(不理想).
提前致谢!