定义了一些材质模板。
我没有深究其他的,只考虑TwoLayerLightmap这个材质。
不记得是在哪个文件夹下,有一个文件FairyTerrain.material,其中就是地形的材质。
我修改了一些内容,将设tex_coord = 0. 设tex_coord=1,设tex_coord=2。这是因为我想让ETM原有的地形和天龙八部的地形共存,而原有地形纹理坐标刚好和纹理坐标相符合,所以设为同一层。
这是我改过的材质
material Terrain/TwoLayerLightmap {
technique { pass { fragment_program_ref Terrain/TwoLayerLightmap_ps { }
texture_unit { texture_alias texture tex_address_mode clamp tex_coord_set 1 }
texture_unit { texture_alias texture tex_address_mode clamp tex_coord_set 2 }
texture_unit { texture_alias texture tex_address_mode clamp tex_coord_set 0
} } }
}
,,是一个pass中的3个texture_unit.也就是3层纹理。顾名思义是第一层纹理,是第二层纹理,是光照图纹理(阴影图),具体如何使用,如何使天龙八部的地形贴图资源对应到layer0,layer1,我下面会讲到。
从FairyTerrain.cg中我们可以找到对应的shader。 void TwoLayerLightmap_ps( in float2 uv0 : TEXCOORD0, in float2 uv1 : TEXCOORD1, in float2 uvLightmap : TEXCOORD2, in uniform sampler2D layer0, in uniform sampler2D layer1, in uniform sampler2D lightmap, in float4 diffuse : COLOR0, in float4 specular : COLOR1, out float4 oColour : COLOR) { float4 c0 = tex2D(layer0, uv0); float4 c1 = tex2D(layer1, uv1); float3 texturedColour = lerp(c0.rgb, c1.rgb, c1.a); float4 lightmapColour = tex2D(lightmap, uvLightmap); float4 baseColour = diffuse * lightmapColour; float3 finalColour = baseColour.rgb * texturedColour + specular.rgb * (1-c0.a) * (1-c1.a) * lightmapColour.a; float3 resultColour = Fogging(finalColour); oColour = float4(finalColour, baseColour.a); }
很容易看出其大致思路是的alpha值控制和进行混合。
可见,天龙八部的地形应该是部分像魔兽一样的格子式地形,部分权重图地形,也就是ETM原有的那种贴图模式,很多层纹理,然后又1-2层手动生成的纹理数据控制各层纹理的alpha值,达到混合的效果,只不过这里是只有一个alpha通道来控制纹理混合。
两层纹理的效果比单独一层纹理好的多,我用OneLayerLightmap材质试过,效果比较赫人...
地形纹理的实现
纹理很明显,是一整张纹理贴到整个地形,没什么好说的。
但 这两层地形纹理应该怎么贴上去呢?
对于材质中的这两层纹理,有两种可能。
1.,本身只是材质模板中纹理的名字,没有实际意义,在实际的程序中会为每一块地形从材质模板继承一个模板,然后修改材质中纹理的名称。
2.在程序中手动创建,。
先说两种不能实现的方法:
1. 在程序中手动创建,, 为极大极大的贴图(和真实的地形一样大),该贴图根据.Terrain和.Gridinfo中的信息来组成,和lightmap一样,整个贴到地形上。
在小游戏,只有可能一个屏幕那么大的地形,也许可以用,而且效果可能不错,但在这种地形相对较大的游戏中是不可能的,首先,极大的浪费资源,一个地砖的纹理,可能被用到几十次几百次,那么在这个大纹理中,就会有几百个地砖纹理的拷贝,其次,不可能创建这么大的纹理(硬件不支持?反正我试过创建不出来..)
2. 像ETM一样,将所有要用到的纹理(假设有n张)一个一个作为texture_unit放在材质里面,然后用n/4张手动生成的纹理去控制这些纹理的alpha值。这个方法不是对于天龙八部的地形不是很现实,一般每个天龙八部的地形有大概十几个不同的纹理,如果用这个方法,每个pass一般支持8个texture_unit,十几个纹理,加n/4张控制纹理需要3-4个pass,效率似乎... 而且我们通过天龙的材质文件可以看出,游戏应该不是用的这个方法来实现的。
3. 每一个格子都有自己独自的材质,修改每个格子材质中的, , 改为它需要的材质文件,如 "05武当\褐色土地底层.jpg” 相当于将每一个格子作为单独的mesh。这个是可以实现的,我试过,将ETM的TileSize设为1,然后生成每个Tile的时候修改其材质,成功了,地形也显示出来了,完全正确,但帧率..... 呵呵,debug模式下fps 大于0小于1... 到release也许可以到十几吧,我没试,显然是不能这样搞的...
我最后实现地形贴图用的是texture atlas,手动创建一张纹理,将所有要用到的地形纹理组合成一张大纹理,然后每一个顶点设基于这张大纹理的UV坐标,texture atlas比每个格子设材质更好的原因很显而易见,具体可以参考附件中所带的文章,《“Batch, Batch, Batch:”What Does It Really Mean?》中的第30页:Batch Breaker: Texture Change.
下图就是将wudang.Terrain中
... ...
所定义的所有纹理组合成的一张大纹理。
可以发现,天龙八部中的地形贴图大小是不同的,但最大是256x256(就我目前所知),所以我干脆将每一格划为256x256,共可容纳有ROW_SIZExCOL_SIZE张小贴图,这样大贴图的大小应该是256*COL_SIZE x 256*ROW_SIZE。
我这台机器支持的最大纹理大小似乎为4096x4096,那么理论上因该可以最多容纳16*16张小贴图,绰绰有余了。这样虽然浪费一点空间,但可以很方便地通过ID索引贴图坐标。
比如 通过这样一块pixmap的定义,我们可以根据textureId=2找到它所所在的位置。
其所在行为textureId/COL_SIZE,所在列为textureId%COL_SIZE。如上面那张大纹理的COLE_SIZE = 8(一行有8张小贴图)
所以textureId=2的这张小贴图所在行row=0,坐在列col=2.
我们知道纹理坐标范围为0.0f-1.0f,所以textureId=2的小贴图左上角的UV坐标为U = (float)col/COL_SIZE = 0.25f , V = (float)row/ROW_SIZE = 0.0f.
再根据pixmap中的信息left ,right, top, bottom 可以计算出小贴图四个点的坐标。在创建顶点时将纹理坐标附上即可。
具体的过程应该是
1.手动创建名字为的texture
代码如下:
TexturePtr layer0 = TextureManager::getSingletonPtr()->createManual( "", "General",TEX_TYPE_2D, layerTextureWidth,layerTextureHeight, 1, 3, PF_BYTE_RGBA, TU_WRITE_ONLY );
2. 将材质中的texture_unit 中的texture_name 由改为,因为我们两层用的是同一张纹理,没必要复制一遍,直接改名指向同一张纹理就行了。
代码如下:
MaterialPtr material (MaterialManager::getSingleton().getByName("Terrain/TwoLayerLightmap")); material->getTechnique(0)->getPass(0)->getTextureUnitState( 1 )->setTextureName( "");
3.读取.Texture文件,将要用到的纹理拼接为大纹理,如上面那张图。
地形的顶点与索引
若地图为192x192,它就是应该有192*192个格子。一般情况下的做法下,它应该有193*193个顶点,织成一个网状,但由于我用的atlas,
可以知道,每一个非边缘的顶点将会有4个纹理坐标(左上,右上,左下,右下 )
如下图
中间的顶点要同时负责A块的右下,B块的左下,C块的右上,D块的左上。
话说一个顶点确实是同时又多个纹理坐标的,只要设置不同的tex_coord。但天龙八部地形贴图一般有3层,,,,分别是两层地形,一层预处理的阴影。
一层不用多说的,就是一张大纹理,每个顶点的坐标是u=col/terrainColSize, v=row/terrainRowSize.
另外两层就是我们需要考虑的,因为有两层,这样每个点不止同时负责4块,要同时负责两层共8块,这样这个pass的8个texture_unit都满了,必须再用一个pass来做那一层,效率不行。
所以只好用另一方法,就是在非边缘的每一个位置,将4个顶点重合在一起,这4个顶点的纹理坐标不同,但位置相同,即每一个格子都有四个独立的顶点,相邻的两个格子有两个点重合。
也就是说192x192的地图,需要有192*192*4个顶点。索引方式还是差不多,每一个格子需要6个索引,所以一共要192*192*6个索引。
这样,ETM中生成顶点和索引的部分代码都需要改,生成顶点的代码在void Tile::createVertexData(size_t startx, size_t startz)中,生成索引的代码在void Tile::createIndexData()中。
天龙八部的.Terrain文件一般有这么一行,说明地形在3个方向都是放大100倍,x,z本是一格大小为1x1为单位的,放大后即为100x100,
一个192x192的地形实际游戏中的大小应该为19200*19200,而天龙的坐标系是正中间坐标为.Terrain文件中的
的值,若不存在则中心为(0,0), 正方向为正,负方向为负,所以当值为(0,0),192x192的地形实际坐标范围应该是 (-9600,-9600)到(9600,9600)。
要注意的是不是将所有顶点作为一个mesh,而是应该根据.Terrain文件中的规定每一个TerrainTile的大小,每个TerrainTile中包含tileSize x tileSize 个地形网格,一个TerrainTile作为一个Entity插入到一个场景节点。
顶点位置和索引考虑完了,该是要考虑每个顶点的纹理坐标的问题了。
要给每个顶点设UV必须用到.Gridinfo文件中的信息,该文件中定义了每一个格子对应的纹理信息。
具体的文件格式可参考,我在这就不赘述了。
http://www.cppblog.com/mybios/archive/2009/07/26/91267.html
此处是正解,其他地方似乎多多少少都有错,特别是op=8的时候,要注意是与对角线两边的两个点(不是对角线上的点)从上面复制到下面。
如图1应该是将左上角的顶点纹理坐标复制到右下角
图2应该是将右上角的纹理坐标复制到左下角。
图1 图2
但还有一处我有不同,op=4的时候,我觉得应该是顺时针转90度,测试下来似乎没问题。
这是我的根据op操作UV坐标的代码,op=4的时候我貌似确实是在顺时针转吧……
void changeGridInfoUV ( AutoTexCoord & leftTop , AutoTexCoord & rightTop , AutoTexCoord & leftBottom , AutoTexCoord & rightBottom , uchar state , bool bIndex )
{
//0 不变
//1 图片水平翻转
//2 图片垂直翻转
//4 顺时针旋转度
//8 对角线上方顶点纹理坐标复制到对角线下方顶点。(与对角线垂直的两个顶点)
uchar res1 = state &1;
uchar res2 = state &2;
uchar res3 = state &4;
uchar res4 = state &8;
if ( res1 != 0 )
{
leftTop .Exchange ( rightTop );
leftBottom .Exchange ( rightBottom );
}
if ( res2 != 0 )
{
leftTop .Exchange ( leftBottom );
rightTop .Exchange ( rightBottom );
}
if ( res3 != 0 )
{
leftTop .Exchange ( rightTop );
leftBottom .Exchange ( rightTop );
rightBottom .Exchange ( rightTop );
}
if ( res4 != 0 )
{
// 非正常索引
if ( bIndex ) {
(leftBottom .setX ( rightTop .getX ) );
leftBottom .setY ( rightTop .getY () );
}
// 正常索引
else {
rightBottom .setX ( leftTop .getX () );
rightBottom .setY ( leftTop .getY () );
}
}
}
读取场景环境与模型
先阶段我读取了一部分场景,包括环境和一些模型,粒子等部分还没看,所以这个场景是不完整的,不过大概的轮廓都出来了。
读取场景其实就是用TinyXML读取.Scene中的各种XML项,然后根据读取的数据创建相应的场景节点,或设置相应的场景环境,如雾,skydome等。
具体代码下载附件看吧,有点无聊,都是switch-case语句。
但有一点一定要注意,在读取资源前一定要先调用一个函数
setlocale( LC_CTYPE, "" );
不然中文路径或文件名的.mesh文件是读不了的。
地形和场景都搞定了,可以看看结果了!然而,悲剧出现了!
远景的效果图,很明显,地形一格一格像有裂缝一样……
近处的效果图, 近了以后,就没地形的裂缝了……
地形裂缝问题
问了一下我的一个学长,自己也思考些时间。估计是由于是用的atlas texture, 然后一定距离后的mipmap和texture filtering,产生了裂缝的问题。
通过附件中的《Improve Batching Using Texture Atlases 》在Applying Texture Filtering To Atlases节可以看讨论到texture filtering对texture atlas造成的影响,但是解决方案只是理论上的,并没有实现,一个是写shader,在不同的mipmap下调整纹理坐标,另一个是预留纹理,就是在已有纹理上加一圈和边缘相同的像素。文章中还提到:enabling anisotropic filtering minimizes these errors,我试了一下,设置了filtering anisotropic , 并且将anisotropic_max 设为最大,结果却是略有好转,但帧率损失了50fps左右… 也许是我的显卡太水了?我最后还是没采用这个解决方案。
我最后的解决方案是
1,手动创建纹理的时候,设置其mipmap的级别最多为3,这样就不会有更高级别的mipmap,导致更严重的失真。
2,手动创建mipmap,而不是让其自动生成。比如原来是1024*1024大小的贴图,1级mipmap的大小应该为512*512,默认它是自动生成的,我设为手动生成,先把个小贴图缩小为50%,再把他们组成一张512x512的贴图作为原来的贴图的mipmap,一次类推手动生成3层mipmap.这样情况稍微有了点改善。
3,小贴图合成大贴图之前,将他们统一resize到256*256的大小,在组合成大贴图,这样后感觉裂缝问题好转了不少。
4,预留纹理坐标,虽然天龙八部开始就预留了纹理坐标,可以.Terrain文件中的纹理坐标很多都不是绝对的0.0f 0.25f 0.5f 等,都是一些 0.2480469 ,0.00390625,0.4960938等,我不知道它本是出于什么原因。但我用了这样的坐标还是不行,还是要把它设地更加靠内才能避免裂缝。
所以读取纹理坐标的时候加上了一个fixFloat的过程,这个过程很不科学,但我试了一下似乎有点用处就用上了。
static void fixFloat ( float & f )
{
if ( f < 0.01f )
f = 0.005f;
else if ( f > 0.24f && f < 0.25f )
f = 0.245f;
else if ( f > 0.25f && f < 0.26f )
f = 0.255f;
else if ( f > 0.49f && f < 0.50f )
f = 0.495f;
else if ( f > 0.5f && f < 0.51f )
f = 0.505f;
else if ( f > 0.74f && f < 0.75f )
f = 0.745f;
else if ( f > 0.75f && f < 0.76f )
f = 0.755f;
else if ( f > 0.99f )
f = 0.995f;
}
这样也在一定程度上改善了裂缝的问题,但有的贴图看上去会不太吻合,但总比裂缝好。
随后地形基本上看不出有裂缝了,但还是有一点痕迹。
这个地形裂缝的问题困扰了我许久,最后的解决方案我也觉得不甚满意,不知道有哪位有好点的解决方案请告诉我。
代码下载:(包含修改过的ETM和一个天龙八部的场景Demo代码) 操作方式:WSAD上下左右平移,按住鼠标中间滚轮移动鼠标壳转换摄像机角度。
两篇引用到的文章下载
注:
由于大小问题大部分资源文件,静态库都未包含,所以若要编译请自行添加Ogre自带的一些资源文件,静态库和TTLB的资源文件,并可能需要修改项目的一些路径设置。TTLB资源文件可由提取工具从游戏中提取。
bin/Release文件夹下有可执行文件及其所需的动态库,包含了所需要的资源后应该就可以运行Demo。 所需要的资源有:shaolin场景所需要的.mesh文件(media/TTLB/model)及其对应的纹理(media/TTLB/material/textures),地形贴图文件(media/TTLB/brush)。
Temp文件夹中有all.material文件,是所有模型的材质,现在的新版本TTLB中是加密的,建议不要加到资源目录中,不然载入很慢,可以挑要用到的新建一个材质文件。media/TTLB/material/scripts中已有少林场景要用到的材质文件。
完整带资源版本下载( TTLBSceneDemo.rar 162.12M ) (提取码 083b253e)
注:
带全部所需美术资源,debug和release文件夹下有所有需要的动态库和可执行文件,放在QQ文件中转站,估计一个星期后就没了~
已经不行了,只能下载⑦次,太万恶了,要的留个QQ邮箱吧,发邮件应该不限制的吧。
最近搞毕业的事情太忙,实在不好意思,很多留言都没回,我的QQ附件太久没动,早就过期了,现在也暂时没有可用版本,要的话找以前留过言的人要吧....
转载于:https://www.cnblogs.com/syqking/archive/2009/10/20/1586993.html
你可能感兴趣的:(游戏)
【星火 Orbit-F1 开发板】按键驱动设计:从“手忙脚乱”到“行云流水” [特殊字符][特殊字符]
智木芯语
【星火 Orbit-F1开发板】 stm32 单片机 算法 物联网 嵌入式硬件
【星火Orbit-F1开发板】按键驱动设计:从“手忙脚乱”到“行云流水”引言:按键的“哲学”想象一下,你正在用STM32做一个炫酷的电子项目,结果按键一按就“抽风”——单击变双击、长按不认账、组合键像在玩猜谜游戏……为什么按键总让人抓狂?答案很简单:机械抖动和状态管理!今天,我们用一篇“说人话”的博客,教你如何用状态机+事件驱动,让STM32的按键像德芙一样丝滑!(文末附完整代码和逻辑图,代码强迫
WPF实现简单的3D图形
0仰望星空007
C#的GUI:WPF基础 wpf 软件 C# UI .Net
简述Windows演示基础(WPF)提供了一种功能,用于根据应用程序要求绘制、转换3D图形并为其添加动画效果。它不支持完整的3D游戏开发,但在某种程度上,您可以创建3D图形。通过组合2D和3D图形,您还可以创建丰富的控件、提供复杂的数据插图或增强应用程序界面的用户体验。“视口3D”元素将3D模型托管到我们的WPF应用程序中。示例让我们举一个简单的例子来了解如何使用3D图形。创建一个名为WPF3D图
C语言综合案例:猜拳游戏1.0
kk努力学编程
c语言 游戏 开发语言
C语言综合案例:猜拳游戏1.0#include#include#include#include/***需求:猜拳游戏1.0*步骤:1.选择对手2.自己出拳3.对手出拳4.双发比较*/intmain(intargc,char*argv[]){//定义变量intis_stop=1;intis_select_ct=1;intcomputer_no;//对手的序号charcomputer_name[20]
AIGC从入门到实战:ChatGPT 需要懂得写提示词的人
AI天才研究院
计算 AI大模型企业级应用开发实战 DeepSeek R1 & 大数据AI人工智能大模型 java python javascript kotlin golang 架构 人工智能 大厂程序员 硅基计算 碳基计算 认知计算 生物计算 深度学习 神经网络 大数据 AIGC AGI LLM 系统架构设计 软件哲学 Agent 程序员实现财富自由
AIGC从入门到实战:ChatGPT需要懂得写提示词的人第1章:AIGC概述1.1AIGC的基本概念AIGC(AI-GeneratedContent),即人工智能生成内容,是指利用人工智能技术,如生成对抗网络(GAN)、变分自编码器(VAE)等,生成具有高质量、多样化、个性化的文本、图像、音频等多媒体内容。AIGC技术已经广泛应用于内容创作、智能推荐、游戏开发、虚拟现实等多个领域,极大地提升了内容
基于STM32设计的俄罗斯方块小游戏
鱼弦
单片机系统合集 stm32 嵌入式硬件 单片机
鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)基于STM32设计的俄罗斯方块小游戏1.介绍基于STM32设计的俄罗斯方块小游戏是一款利用STM32微控制器、LCD显示屏和按键实现的经典休闲游戏。该游戏具有
DeepSeek写俄罗斯方块手机小游戏
浅痕~
大模型 游戏 DeepSeek 手机小游戏
DeepSeek写俄罗斯方块手机小游戏提问根据提的要求,让DeepSeek整理的需求,进行提问,内容如下:请生成一个包含以下功能的可运行移动端俄罗斯方块H5文件:核心功能要求原生JavaScript实现,适配手机屏幕支持触摸操作:左右滑动移动、点击屏幕旋转方块、往下滑方块快速下落下方显示虚拟控制按钮(左移/旋转/右移)、暂停/继续、重新开始按钮经典下落机制(自动下落、碰撞检测、行消除)右上角全屏切
算法随笔_58: 队列中可以看到的人数
程序趣谈
算法 python 数据结构
上一篇:算法随笔_57:游戏中弱角色的数量-CSDN博客=====题目描述如下:有n个人排成一个队列,从左到右编号为0到n-1。给你以一个整数数组heights,每个整数互不相同,heights[i]表示第i个人的高度。一个人能看到他右边另一个人的条件是这两人之间的所有人都比他们两人矮。更正式的,第i个人能看到第j个人的条件是imax(heights[i+1],heights[i+2],...,h
HDLBits刷题记录——Conwaylife
Candy_579
verilog
导言HDLBits网站Morecircuits中的Conwaylife即Gameoflife,由数学家JohnConway创造。之所以特别关注到这个题目,是因为某位同学曾拿这个游戏作为一门芯片设计课程的PJ。当时觉得生命游戏在众多坦克大战、走迷宫等小游戏中挺有新意,其实现程度比这个题目本身要复杂很多,比如精美的GUI和复杂的场景。思路题目告诉我们,这个16×16的细胞网格是一个toroid,可以理
C/C++流星雨
Want595
趣味编程 c语言 c++ 开发语言
系列文章序号直达链接1C/C++李峋同款跳动的爱心2C/C++跳动的爱心3C/C++经典爱心4C/C++满屏飘字5C/C++大雪纷飞6C/C++炫酷烟花7C/C++黑客帝国同款字母雨8C/C++樱花树9C/C++奥特曼10C/C++精美圣诞树11C/C++俄罗斯方块小游戏12C/C++贪吃蛇小游戏13C/C++孤单又灿烂的神14C/C++闪烁的爱心15C/C++哆啦A梦16C/C++简单圣诞树17
变形的宽搜 育才官网 HN036 涂色游戏
williamzhou_2013
算法 宽度优先 c++
描述李老师喜欢玩一种涂色游戏:一个由n × n个单元格组成的白色格子纸,按照事先给定的m次操作,一个接一个地把白色单元格涂黑,总共在纸上涂m个不同的单元格。李老师想知道,在涂黑的过程中,要出现一个边长为3的黑色方块,需要进行多少次操作?输入描述第一行包含两个整数n和m(1 ≤ n ≤ 1000,分别表示方格纸的大小和操作次数)然后,m行包含操作的描述。第i行包含两个整数xi,yi(1 ≤ xi,
骁龙 8 至尊版:AI 手机的变革先锋
倔强的小石头_
人工智能 大数据
目录引言性能跃升:AI手机的强劲根基(一)CPU性能革命(二)GPU图形进化(三)NPU智能核心AI体验革新:多维度的智能进化(一)个性化多模态AI助手(二)影像体验的AI重塑(三)游戏体验的AI赋能生态合作与未来展望引言在当今科技飞速发展的时代,智能手机领域正经历着深刻的变革。而骁龙8至尊版的出现,犹如一颗璀璨的明星,在手机芯片领域中闪耀着独特的光芒,其重要性和影响力不容小觑。它不仅仅是一款芯片
青少年软件编程(C语言)等级三级考试试题(2)
李余博睿(新疆)
算法
Minecraft题目描述Minecraft是一个几乎无所不能的沙盒游戏,玩家可以利用游戏内的各种资源进行创造,搭建自己的世界。在Minecraft中,基本的建筑元素是边长为1个单位的立方体,Tony想用N个这种小立方体搭建一个长方体,并用他珍藏已久的贴纸对其进行装饰。如果一张贴纸可以贴满小立方体的一个面。那么,他需要用掉多少张贴纸呢?输入格式一个整数N,表示小明所拥有的小立方体的个数。N不会超过
洛谷 P1908:逆序对 ← 微调“归并排序”代码可得
hnjzsyjyj
信息学竞赛 # 排序与查找 数据结构 逆序对 归并排序
【题目来源】https://www.luogu.com.cn/problem/P1908【题目描述】猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且ia[j]的元素对(a[i],a[j])。求逆序对
基于启扬嵌入式硬件的智能桌子解决方案
浙江启扬智能科技有限公司
分享 解决方案 嵌入式硬件 android 解决方案 平板 联发科
智能化的脚步逐渐进入到日常生活场景,带来许多“新”产品,智能桌就是其中之一。智能桌与一般桌子最大的不同在于安装了类似于平板电脑的超大触摸屏,结合信息技术、触控技术,内置应用软件;不仅具备普通桌子的置物功能,还能够根据桌子的不同应用场合,配置娱乐游戏、音乐播放、无线充电、高度调节等功能,广泛应用于KTV、酒吧、电影院、餐厅、企业会客室等场景。图片来源于网络智能桌子采用大尺寸电容触摸屏,自动识别,准确
【多模态处理篇二】【深度揭秘:DeepSeek视频理解之时空注意力机制解析】
再见孙悟空_
「2025 DeepSeek技术全景实战」 音视频 自动化 DeepSeek DeepSeek R1 人工智能 机器学习 视频理解
一、为啥要搞视频理解这事儿咱先唠唠为啥视频理解这么重要哈。现在这互联网时代,视频那可是铺天盖地的。你刷短视频平台,看在线电影,玩游戏直播,到处都是视频。但是计算机它一开始可不懂视频里到底是啥意思,它看到的就是一堆像素点和声音信号。视频理解呢,就是要让计算机像人一样,能看懂视频里的内容。比如说,知道视频里是谁在干啥,发生了啥事儿,啥时候发生的。这在很多领域都特别有用,像安防监控,能自动识别视频里的异
英伟达(NVIDIA)芯片全解析:专业分类、应用场景与真实案例
嵌入式Jerry
AI 分类 人工智能 数据挖掘 嵌入式硬件 linux 数据分析 算法
引言你知道吗?你每天使用的智能手机、AI语音助手、自动驾驶汽车,甚至是电影特效背后,都有英伟达(NVIDIA)的芯片在默默工作。NVIDIA不仅仅是“游戏显卡”的代名词,它的GPU和AI计算平台已经广泛应用于人工智能(AI)、自动驾驶、医疗影像、工业自动化、智能家居等领域。那么,NVIDIA的芯片有哪些分类?它们分别用在哪里?普通人又能从哪些场景感受到它的存在?今天,我们就来用最通俗易懂的方式,带
启元世界(Inspir.ai)技术浅析(八):AI 数值设计
爱研究的小牛
AIGC—游戏制作 人工智能 机器学习 算法 AIGC
启元世界(Inspir.ai)的AI数值设计模块是AIBeings平台的重要组成部分,旨在通过精细化的数值设计和智能化的AI决策,为游戏、虚拟世界或其他互动应用提供高度复杂和动态的AI行为。1.AI数值设计模块概述AI数值设计模块的核心目标是创建和管理AI角色的数值属性和行为逻辑。这些数值属性和行为逻辑决定了AI角色在虚拟环境中的表现,包括其能力、决策、互动方式等。该模块主要分为以下几个子模块:1
Unity 权限 之 Android 【权限 动态申请】功能的简单封装
仙魁XAN
Unity 进阶 unity android 权限申请 动态权限申请 permission
Unity权限之Android【权限动态申请】功能的简单封装目录Unity权限之Android【权限动态申请】功能的简单封装一、简单介绍二、Android权限动态申请三、实现原理四、注意事项五、案例实现简单步骤附录:一、进一步优化二、多个权限申请代码参考一、简单介绍Unity是一个功能强大的跨平台游戏引擎,广泛用于开发视频游戏和其他实时3D互动内容,如模拟器和虚拟现实应用。游戏引擎:Unity:U
Android HID设备(键盘、遥控等)功能实现流程及键值映射关系
飞猿_SIR
android 计算机外设
HID(HumanInterfaceDevice,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、遥控器、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。之前文章android键盘(遥控)键值定义大全中整理了android中各种功能键值定义,那么从键盘按键到安卓设备控制生效的流程是怎样的呢?Android设备上的键盘操作实现流程:EventHub从evdev
QQ游戏百万人同时在线服务器架构实现
JsenLong
QQ游戏于前几日终于突破了百万人同时在线的关口,向着更为远大的目标迈进,这让其它众多传统的棋牌休闲游戏平台黯然失色,相比之下,联众似乎已经根本不是QQ的对手,因为QQ除了这100万的游戏在线人数外,它还拥有3亿多的注册量(当然很多是重复注册的)以及QQ聊天软件900万的同时在线率,我们已经可以预见未来由QQ构建起来的强大棋牌休闲游戏帝国。服务器程序,其可承受的同时连接数目是有理论峰值的,通过C++
高精度+区间dp 洛谷P1005矩阵取数游戏
花王江不语
高精度 区间dp 动态规划
两点教训:用#define自定义的东西是原模原样的替换过去在某些情况要记得加括号#definebase(1000*1000*1000)z.a[i]+=((x.a[i]+y.a[i])%base);z.a[i+1]+=(x.a[i]+y.a[i])/base;如果不加括号的话,就会变成z.a[i]+=((x.a[i]+y.a[i])%1000*1000*1000);z.a[i+1]+=(x.a[i]
分享一个常用的录屏软件
2501_90713682
其他 经验分享 微信公众平台
爱拍录屏软件是一款非常好用的电脑录屏软件,用户可以使用软件对自己的电脑桌面去进行录制,可以帮助自己的工作或者是生活方面去进行便捷的服务,录制的过程中可以设定不同的画质还有录屏的界面大小,非常人性化。超清录屏】自由选择分辨率进行画面录制,支持720P、1080P、2K、4K及无损画质;【录制模式】支持全屏、区域、游戏和摄像头录制等;可录制多种屏幕内容:软件操作、游戏实况、网络教学、课件制作、在线视频
借助低功耗网状网络技术降低网关能耗
电子科技圈
Silicon Labs 网络 嵌入式硬件 物联网 iot mcu 智能家居 智能硬件
作者:WaelGuibene,芯科科技生态系统技术主管互联网宽带业务历来竞争激烈,终极目标在于实现最高吞吐量。然而,可持续发展意识日渐增强,包括欧盟关于待机模式的生态设计法规等能源法规日趋严格,正在改变互联网服务提供商(ISP)的游戏规则。ISP必须时刻保持竞争状态,持续参与吞吐量竞争;与此同时,还必须从根本上降低网关能耗,从而遵守法规并呼吁客户积极响应环保倡议。但是,如何在不影响智能家居用户体验
C/C++跳动的爱心
Want595
趣味编程 c语言 c++ 开发语言
系列文章序号直达链接1C/C++李峋同款跳动的爱心2C/C++跳动的爱心3C/C++经典爱心4C/C++满屏飘字5C/C++大雪纷飞6C/C++炫酷烟花7C/C++黑客帝国同款字母雨8C/C++樱花树9C/C++奥特曼10C/C++精美圣诞树11C/C++俄罗斯方块小游戏12C/C++贪吃蛇小游戏13C/C++孤单又灿烂的神14C/C++闪烁的爱心15C/C++哆啦A梦16C/C++简单圣诞树17
算法随笔_57 : 游戏中弱角色的数量
程序趣谈
算法 python 数据结构
上一篇:算法随笔_56:好子数组的最大分数-CSDN博客=====题目描述如下:你正在参加一个多角色游戏,每个角色都有两个主要属性:攻击和防御。给你一个二维整数数组properties,其中properties[i]=[attacki,defensei]表示游戏中第i个角色的属性。如果存在一个其他角色的攻击和防御等级都严格高于该角色的攻击和防御等级,则认为该角色为弱角色。更正式地,如果认为角色i弱
提升游戏性能的魔法:C#与Unity中不容错过的脚本优化技巧
墨夶
C#学习资料1 游戏 c# unity
在当今竞争激烈的电子游戏市场,流畅的游戏体验和高效的性能表现往往是吸引玩家的关键因素。而作为开发者,如何在有限的资源条件下最大限度地发挥硬件潜力,成为了我们不得不面对的重要课题。幸运的是,在Unity这个广受欢迎的游戏开发平台上,借助C#的强大功能,我们可以采取一系列有效的措施来优化代码,确保游戏运行得既快又稳。今天,就让我们一起揭开这些隐藏在幕后的秘密武器,探索如何让您的作品脱颖而出!Unity
Rust编程语言入门教程 (七)函数与控制流
yoona1020
Rust rust 开发语言 区块链 学习方法
Rust系列Rust编程语言入门教程(一)安装RustRust编程语言入门教程(二)hello_worldRust编程语言入门教程(三)HelloCargoRust编程语言入门教程(四)猜数游戏:一次猜测Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测Rust编程语言入门教程(六)变量与可变性Rust编程语言入门教程(七)函数与控制流目录Rust系列引言一、函数二、函数的参
【C】用c写贪吃蛇
钰爱&
C语言 开发语言 1024程序员节 c语言 学习 笔记 嵌入式硬件
1.输入正确的账号密码及其用户名,登录成功进入贪吃蛇游戏界面,2.随机生成蛇头★、食物▲的位置(x,y),并使用□打印地图3.使用wsad按键,完成蛇头的上下左右移动4.蛇头碰撞到食物后,吃下食物变成蛇身的一部分●,重新生成食物位置,显示在地图上5.蛇撞墙后或蛇咬到自己的身体,程序结束,统计吃到的食物数量#include#include//gotoxy()函数头文件#include//getch(
在C++中嵌入Lua脚本引擎:解析代码实现
煤炭里de黑猫
c++ lua 开发语言
1.背景与概述Lua是一种轻量级的脚本语言,它被广泛应用于游戏开发、嵌入式系统以及许多需要扩展功能的应用程序中。由于Lua的内存占用小、执行效率高且易于嵌入,许多开发者选择将Lua作为C++应用的嵌入式脚本引擎。在本篇文章中,我们将详细分析一段C++代码,展示如何将Lua脚本嵌入到C++程序中,实现C++和Lua之间的交互。该代码通过调用Lua的CAPI,加载并执行Lua脚本文件。2.代码结构分析
XUnity.AutoTranslator 开源项目常见问题解答
尚建民Maxwell
XUnity.AutoTranslator开源项目常见问题解答XUnity.AutoTranslator项目地址:https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator项目基础介绍及编程语言XUnity.AutoTranslator是一个高级的翻译插件,专为基于Unity的游戏设计,旨在自动翻译游戏内容,并提供手动翻译工具。该插件依赖于互联网
ViewController添加button按钮解析。(翻译)
张亚雄
c
<div class="it610-blog-content-contain" style="font-size: 14px"></div>// ViewController.m
// Reservation software
//
// Created by 张亚雄 on 15/6/2.
mongoDB 简单的增删改查
开窍的石头
mongodb
在上一篇文章中我们已经讲了mongodb怎么安装和数据库/表的创建。在这里我们讲mongoDB的数据库操作
在mongo中对于不存在的表当你用db.表名 他会自动统计
下边用到的user是表明,db代表的是数据库
添加(insert):
log4j配置
0624chenhong
log4j
1) 新建java项目
2) 导入jar包,项目右击,properties—java build path—libraries—Add External jar,加入log4j.jar包。
3) 新建一个类com.hand.Log4jTest
package com.hand;
import org.apache.log4j.Logger;
public class
多点触摸(图片缩放为例)
不懂事的小屁孩
多点触摸
多点触摸的事件跟单点是大同小异的,上个图片缩放的代码,供大家参考一下
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener
有关浏览器窗口宽度高度几个值的解析
换个号韩国红果果
JavaScript html
1 元素的 offsetWidth 包括border padding content 整体的宽度。
clientWidth 只包括内容区 padding 不包括border。
clientLeft = offsetWidth -clientWidth 即这个元素border的值
offsetLeft 若无已定位的包裹元素
数据库产品巡礼:IBM DB2概览
蓝儿唯美
db2
IBM DB2是一个支持了NoSQL功能的关系数据库管理系统,其包含了对XML,图像存储和Java脚本对象表示(JSON)的支持。DB2可被各种类型的企 业使用,它提供了一个数据平台,同时支持事务和分析操作,通过提供持续的数据流来保持事务工作流和分析操作的高效性。 DB2支持的操作系统
DB2可应用于以下三个主要的平台:
工作站,DB2可在Linus、Unix、Windo
java笔记5
a-john
java
控制执行流程:
1,true和false
利用条件表达式的真或假来决定执行路径。例:(a==b)。它利用条件操作符“==”来判断a值是否等于b值,返回true或false。java不允许我们将一个数字作为布尔值使用,虽然这在C和C++里是允许的。如果想在布尔测试中使用一个非布尔值,那么首先必须用一个条件表达式将其转化成布尔值,例如if(a!=0)。
2,if-els
Web开发常用手册汇总
aijuans
PHP
一门技术,如果没有好的参考手册指导,很难普及大众。这其实就是为什么很多技术,非常好,却得不到普遍运用的原因。
正如我们学习一门技术,过程大概是这个样子:
①我们日常工作中,遇到了问题,困难。寻找解决方案,即寻找新的技术;
②为什么要学习这门技术?这门技术是不是很好的解决了我们遇到的难题,困惑。这个问题,非常重要,我们不是为了学习技术而学习技术,而是为了更好的处理我们遇到的问题,才需要学习新的
今天帮助人解决的一个sql问题
asialee
sql
今天有个人问了一个问题,如下:
type AD value
A
意图对象传递数据
百合不是茶
android 意图Intent Bundle对象数据的传递
学习意图将数据传递给目标活动; 初学者需要好好研究的
1,将下面的代码添加到main.xml中
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http:/
oracle查询锁表解锁语句
bijian1013
oracle object session kill
一.查询锁定的表
如下语句,都可以查询锁定的表
语句一:
select a.sid,
a.serial#,
p.spid,
c.object_name,
b.session_id,
b.oracle_username,
b.os_user_name
from v$process p, v$s
mac osx 10.10 下安装 mysql 5.6 二进制文件[tar.gz]
征客丶
mysql osx
场景:在 mac osx 10.10 下安装 mysql 5.6 的二进制文件。
环境:mac osx 10.10、mysql 5.6 的二进制文件
步骤:[所有目录请从根“/”目录开始取,以免层级弄错导致找不到目录]
1、下载 mysql 5.6 的二进制文件,下载目录下面称之为 mysql5.6SourceDir;
下载地址:http://dev.mysql.com/downl
分布式系统与框架
bit1129
分布式
RPC框架 Dubbo
什么是Dubbo
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。其核心部分包含: 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。 集群容错: 提供基于接
那些令人蛋痛的专业术语
白糖_
spring Web SSO IOC
spring
【控制反转(IOC)/依赖注入(DI)】:
由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
简单的说:对象的创建又容器(比如spring容器)来执行,程序里不直接new对象。
Web
【单点登录(SSO)】:SSO的定义是在多个应用系统中,用户
《给大忙人看的java8》摘抄
braveCS
java8
函数式接口:只包含一个抽象方法的接口
lambda表达式:是一段可以传递的代码
你最好将一个lambda表达式想象成一个函数,而不是一个对象,并记住它可以被转换为一个函数式接口。
事实上,函数式接口的转换是你在Java中使用lambda表达式能做的唯一一件事。
方法引用:又是要传递给其他代码的操作已经有实现的方法了,这时可以使
编程之美-计算字符串的相似度
bylijinnan
java 算法 编程之美
public class StringDistance {
/**
* 编程之美 计算字符串的相似度
* 我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:
* 1.修改一个字符(如把“a”替换为“b”);
* 2.增加一个字符(如把“abdd”变为“aebdd”);
* 3.删除一个字符(如把“travelling”变为“trav
上传、下载压缩图片
chengxuyuancsdn
下载
/**
*
* @param uploadImage --本地路径(tomacat路径)
* @param serverDir --服务器路径
* @param imageType --文件或图片类型
* 此方法可以上传文件或图片.txt,.jpg,.gif等
*/
public void upload(String uploadImage,Str
bellman-ford(贝尔曼-福特)算法
comsci
算法 F#
Bellman-Ford算法(根据发明者 Richard Bellman 和 Lester Ford 命名)是求解单源最短路径问题的一种算法。单源点的最短路径问题是指:给定一个加权有向图G和源点s,对于图G中的任意一点v,求从s到v的最短路径。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore zu 也为这个算法的发展做出了贡献。
与迪科
oracle ASM中ASM_POWER_LIMIT参数
daizj
ASM oracle ASM_POWER_LIMIT 磁盘平衡
ASM_POWER_LIMIT
该初始化参数用于指定ASM例程平衡磁盘所用的最大权值,其数值范围为0~11,默认值为1。该初始化参数是动态参数,可以使用ALTER SESSION或ALTER SYSTEM命令进行修改。示例如下:
SQL>ALTER SESSION SET Asm_power_limit=2;
高级排序:快速排序
dieslrae
快速排序
public void quickSort(int[] array){
this.quickSort(array, 0, array.length - 1);
}
public void quickSort(int[] array,int left,int right){
if(right - left <= 0
C语言学习六指针_何谓变量的地址 一个指针变量到底占几个字节
dcj3sjt126com
C语言
# include <stdio.h>
int main(void)
{
/*
1、一个变量的地址只用第一个字节表示
2、虽然他只使用了第一个字节表示,但是他本身指针变量类型就可以确定出他指向的指针变量占几个字节了
3、他都只存了第一个字节地址,为什么只需要存一个字节的地址,却占了4个字节,虽然只有一个字节,
但是这些字节比较多,所以编号就比较大,
phpize使用方法
dcj3sjt126com
PHP
phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,下面介绍一个它的使用方法,需要的朋友可以参考下
安装(fastcgi模式)的时候,常常有这样一句命令:
代码如下:
/usr/local/webserver/php/bin/phpize
一、phpize是干嘛的?
phpize是什么?
phpize是用来扩展php扩展模块的,通过phpi
Java虚拟机学习 - 对象引用强度
shuizhaosi888
JAVA虚拟机
本文原文链接:http://blog.csdn.net/java2000_wl/article/details/8090276 转载请注明出处!
无论是通过计数算法判断对象的引用数量,还是通过根搜索算法判断对象引用链是否可达,判定对象是否存活都与“引用”相关。
引用主要分为 :强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Wea
.NET Framework 3.5 Service Pack 1(完整软件包)下载地址
happyqing
.net 下载 framework
Microsoft .NET Framework 3.5 Service Pack 1(完整软件包)
http://www.microsoft.com/zh-cn/download/details.aspx?id=25150
Microsoft .NET Framework 3.5 Service Pack 1 是一个累积更新,包含很多基于 .NET Framewo
JAVA定时器的使用
jingjing0907
java timer 线程 定时器
1、在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作等。
对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。
privatejava.util.Timer timer;
timer = newTimer(true);
timer.schedule(
newjava.util.TimerTask() { public void run()
Webbench
流浪鱼
webbench
首页下载地址 http://home.tiscali.cz/~cz210552/webbench.html
Webbench是知名的网站压力测试工具,它是由Lionbridge公司(http://www.lionbridge.com)开发。
Webbench能测试处在相同硬件上,不同服务的性能以及不同硬件上同一个服务的运行状况。webbench的标准测试可以向我们展示服务器的两项内容:每秒钟相
第11章 动画效果(中)
onestopweb
动画
index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/
windows下制作bat启动脚本.
sanyecao2314
java cmd 脚本 bat
java -classpath C:\dwjj\commons-dbcp.jar;C:\dwjj\commons-pool.jar;C:\dwjj\log4j-1.2.16.jar;C:\dwjj\poi-3.9-20121203.jar;C:\dwjj\sqljdbc4.jar;C:\dwjj\voucherimp.jar com.citsamex.core.startup.MainStart
Java进行RSA加解密的例子
tomcat_oracle
java
加密是保证数据安全的手段之一。加密是将纯文本数据转换为难以理解的密文;解密是将密文转换回纯文本。 数据的加解密属于密码学的范畴。通常,加密和解密都需要使用一些秘密信息,这些秘密信息叫做密钥,将纯文本转为密文或者转回的时候都要用到这些密钥。 对称加密指的是发送者和接收者共用同一个密钥的加解密方法。 非对称加密(又称公钥加密)指的是需要一个私有密钥一个公开密钥,两个不同的密钥的
Android_ViewStub
阿尔萨斯
ViewStub
public final class ViewStub extends View
java.lang.Object
android.view.View
android.view.ViewStub
类摘要: ViewStub 是一个隐藏的,不占用内存空间的视图对象,它可以在运行时延迟加载布局资源文件。当 ViewSt