跨操作系统的话一般选OpenGL,OpenGL是视频行业领域中用于处理2D/3D图形的最为广泛接纳的API,在此基础上,为了用于计算机视觉技术的研究,从而催生了各种计算机平台上的应用功能以及设备上的许多应用程序。
其是独立于视窗操作系统以及操作系统平台,可以进行多种不同邻域的开发和内容创作,简而言之,其帮助研发人员能够实现PC、工作站、超级计算机以及各种工控机等硬件设备上实现高性能、对于视觉要求极高的高视觉图形处理软件的开发
图形引擎是一种聚合了图形绘制能力的功能组件,“支持应用的底层函数库”。解决场景构造、对象处理、场景渲染、事件处理、碰撞检测等问题。
随着图形软硬件技术的快速发展,图形引擎也得到了快速的发展,在虚拟现实、游戏开发、仿真模拟等领域得到广泛的应用。
当谈到惊人的图形和引人入胜的游戏体验时,虚幻引擎是游戏开发者的首选。作为一种强大的游戏引擎,虚幻引擎在近年来崭露头角,并吸引了全球范围内的游戏制作公司。虚幻引擎不仅为游戏开发者提供了一套出色的工具,还为玩家带来了许多令人难以置信的视觉盛宴。本文将为您介绍虚幻引擎开发的十款疯狂图形游戏。
《神秘海域4:盗贼末路》是由Naughty Dog开发并使用虚幻引擎开发的热门动作冒险游戏。该游戏以其惊人的视觉效果和细节而闻名,从细腻的肌肤纹理到逼真的环境场景,都令人难以置信。虚幻引擎的强大图形能力将这个游戏世界呈现得栩栩如生,为玩家带来了一个令人难以忘怀的冒险故事。
《奇异人生》是由Dontnod Entertainment开发的互动冒险游戏。该游戏在图形设计方面非常独特,融合了手绘般的画面和逼真的三维环境。虚幻引擎为《奇异人生》提供了强大的渲染能力,使得这个角色扮演的故事更加生动、感人至深。
《堡垒之夜》是一款由Epic Games开发的大型多人在线射击游戏。虽然该游戏本身受欢迎程度很高,但其中令人印象深刻的图形效果是虚幻引擎的杰作。无论是丰富的光影效果还是逼真的人物模型,都使得《堡垒之夜》成为当今最具视觉冲击力的游戏之一。
《无人深空》是由Hello Games制作的一款开放世界探险游戏。虚幻引擎为这个广阔的宇宙提供了惊人的图形效果,让玩家在游戏中畅游于各种美丽的星球之间。逼真的环境细节、独特的生物设计和宏伟的宇宙风景使得《无人深空》成为一款图形壮丽的游戏之作。
《战地1》是由EA DICE开发的第一人称射击游戏,以一战为背景。该游戏使用虚幻引擎,为玩家带来了战争的真实感和震撼力。无论是废墟遍布的城市还是战场上燃起的烈火,虚幻引擎都成功地模拟了一战的残酷场景,使得玩家仿佛亲临战场,沉浸其中。
《巫师3:狂猎》是由CD Projekt Red开发的一款奇幻角色扮演游戏。虚幻引擎为这个精美的奇幻世界提供了无与伦比的视觉效果,从树木的细节到城市的繁华,都展现了虚幻引擎的强大能力。《巫师3:狂猎》不仅给玩家带来了令人惊叹的视觉盛宴,还为他们提供了一个沉浸式的剧情体验。
《死亡搁浅》由Hideo Kojima开发,是一款独特而富有艺术感的动作冒险游戏。虚幻引擎为这个神秘的世界带来了惊人的视觉效果和细节。游戏中的角色模型、环境设计以及一系列壮观的场景使得《死亡搁浅》成为了一款图形驱动的游戏杰作。
《重塑人生》是一款气氛独特的冒险游戏,由Quantic Dream开发。虚幻引擎为游戏中丰富多彩的世界提供了优秀的图形表现,使玩家仿佛置身于现实世界之中。令人惊叹的光影效果和逼真的环境细节给《重塑人生》增添了一份独特的魅力。
《极限竞速:地平线4》是一款由Playground Games开发的赛车游戏。这个游戏使用虚幻引擎,并通过其卓越的图形性能将赛车比赛的刺激感传递给玩家。细致入微的车辆模型、逼真的天气效果以及完美重现的赛车场地使得《极限竞速:地平线4》成为了一款视觉上令人惊叹的游戏。
虽然《我的世界》是由Mojang开发的沙盒游戏,但它利用虚幻引擎为玩家提供了广阔的想象空间。无论是绚丽多彩的方块世界还是玩家创造的独特建筑,虚幻引擎都为《我的世界》赋予了无限可能性。这款游戏使得玩家可以成为自己创造世界的主宰。
以上是由虚幻引擎开发的十款疯狂图形游戏。这些游戏代表了虚幻引擎在游戏界的强大影响力和无限创造力。无论是沉浸在奇幻世界中,还是体验真实的战争场景,虚幻引擎都能为玩家带来令人难以置信的视觉享受。
随着虚拟现实(VR)和增强现实(AR)技术的不断发展,游戏行业也进入了一个全新的时代。而在这个时代中,元宇宙成为了游戏产业的一颗闪亮的新星。那么,元宇宙给GPU图形引擎上市公司带来了哪些机遇和挑战呢?本文将探讨元宇宙的崛起和发展对GPU图形引擎上市公司的影响。
元宇宙是一种虚拟的数字环境,它是虚拟现实(VR)和增强现实(AR)的延伸,以及人工智能、深度学习和大数据等技术的融合。在元宇宙中,用户可以与数字世界进行交互并共同创造内容。元宇宙不仅仅是一个虚拟的游戏世界,更是一个真实世界的扩展。它为用户提供了无限的可能性,从游戏娱乐到社交交互、教育培训、数字艺术创作等各个领域。
首先,元宇宙的兴起将给GPU图形引擎上市公司带来巨大的商机。随着元宇宙的发展,游戏行业对高性能的图形引擎需求不断增加。作为元宇宙中虚拟场景的构建和渲染引擎,GPU图形引擎将成为元宇宙中不可或缺的核心技术。在元宇宙中,用户需要逼真、流畅、高度交互的虚拟环境,这就要求GPU图形引擎提供强大的计算能力和图形渲染效果。
其次,元宇宙的发展将为GPU图形引擎上市公司创造更多的合作机会。随着元宇宙的普及,越来越多的游戏开发公司、科技公司和数字艺术家将会加入到元宇宙的构建中。这些合作伙伴将需要与GPU图形引擎上市公司密切合作,共同推动元宇宙的发展。这将为GPU图形引擎上市公司带来巨大的商机,并帮助其扩大市场份额。
此外,元宇宙的兴起还将带动GPU图形引擎技术的不断创新和发展。元宇宙对图形引擎的要求非常高,不仅需要实时渲染大规模的虚拟场景,还需要支持高度自由的用户交互和创造。这将推动GPU图形引擎上市公司加大技术研究和开发力度,不断提升图形引擎的性能和功能,以满足元宇宙的需求。同时,元宇宙的发展还将带来更多的技术挑战和问题,促使GPU图形引擎上市公司走向更加成熟和稳定的发展。
尽管元宇宙给GPU图形引擎上市公司带来了巨大的机遇,但也面临着一些挑战。
首先,元宇宙的发展需要强大的图形处理能力和实时计算能力,这要求GPU图形引擎上市公司不断提升其产品的性能和效能。与此同时,由于元宇宙的规模和复杂性巨大,图形引擎需要具备良好的稳定性和可靠性。因此,GPU图形引擎上市公司需要重视产品的质量控制和技术支持,以确保其产品能够满足元宇宙的需求。
其次,元宇宙的发展还需要GPU图形引擎上市公司和其他合作伙伴之间的密切合作。元宇宙的构建涉及到多个技术领域的协同工作,包括图形引擎、人工智能、网络通信等。因此,GPU图形引擎上市公司需要与其他公司和机构建立良好的合作关系,共同推动元宇宙的发展。
此外,元宇宙的发展还带来了对隐私和安全的新挑战。在元宇宙中,用户可以与其他用户进行实时的交互和社交,这就需要对用户的个人信息和数据进行保护和管理。因此,GPU图形引擎上市公司需要加强对用户隐私和数据安全的保护,建立健全的安全机制和政策,以增强用户对元宇宙的信任。
综上所述,元宇宙的崛起和发展给GPU图形引擎上市公司带来了巨大的机遇和挑战。作为元宇宙中不可或缺的核心技术,GPU图形引擎将在元宇宙的构建和发展中发挥重要的作用。然而,要充分利用这些机遇,GPU图形引擎上市公司需要不断创新和发展,加强与合作伙伴的合作关系,并注重用户隐私和数据安全的保护。只有如此,才能在元宇宙时代中赢得更大的商机和竞争优势。
引用新浪:
2008年05月19日 15:39
暴雪《魔兽世界》制作人J. Allen Brack日前在接受媒体有关《巫妖王之怒》采访时表示,《魔兽世界》“可能”在未来将图形引擎进行整体更新。
J. Allen Brack的原话是:“我们在未来的某个时机是否需要将画面进行彻底更新呢?是,有可能。”他表示,《巫妖王之怒》的更新比较保守,只会针对顶级PC提供一些新的特效。但他确认公司已经考虑对游戏引擎进行彻底变革:“我们在开发每个扩展包时都会考虑这个问题,下一个也一定会。”
但他也承认,网游在运营过程中更新引擎的成功例子很少,比如《UO》和《无尽的任务》:“许多玩家会停留在旧版客户端,因为那样速度肯定更快,或者是让他们更习惯。对于我们开发者来说,花费过多时间精力在这种出力不讨好的事情上并不是什么明智的决定。”
很简单,显卡没有达到128M。严重怀疑你的电脑显卡是GeForce MX440另:Couldn't initialize graphics engine. 翻译成(无法初始化图像引擎)更贴切
之前看了Mahout官方示例 20news 的调用实现;于是想根据示例的流程实现其他例子。网上看到了一个关于天气适不适合打羽毛球的例子。
训练数据:
Day Outlook Temperature Humidity Wind PlayTennis
D1 Sunny Hot High Weak No
D2 Sunny Hot High Strong No
D3 Overcast Hot High Weak Yes
D4 Rain Mild High Weak Yes
D5 Rain Cool Normal Weak Yes
D6 Rain Cool Normal Strong No
D7 Overcast Cool Normal Strong Yes
D8 Sunny Mild High Weak No
D9 Sunny Cool Normal Weak Yes
D10 Rain Mild Normal Weak Yes
D11 Sunny Mild Normal Strong Yes
D12 Overcast Mild High Strong Yes
D13 Overcast Hot Normal Weak Yes
D14 Rain Mild High Strong No
检测数据:
sunny,hot,high,weak
结果:
Yes=》 0.007039
No=》 0.027418
于是使用Java代码调用Mahout的工具类实现分类。
基本思想:
1. 构造分类数据。
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
接下来贴下我的代码实现=》
1. 构造分类数据:
在hdfs主要创建一个文件夹路径 /zhoujainfeng/playtennis/input 并将分类文件夹 no 和 yes 的数据传到hdfs上面。
数据文件格式,如D1文件内容: Sunny Hot High Weak
2. 使用Mahout工具类进行训练,得到训练模型。
3。将要检测数据转换成vector数据。
4. 分类器对vector数据进行分类。
这三步,代码我就一次全贴出来;主要是两个类 PlayTennis1 和 BayesCheckData = =》
package myTesting.bayes;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.util.ToolRunner;
import org.apache.mahout.classifier.naivebayes.training.TrainNaiveBayesJob;
import org.apache.mahout.text.SequenceFilesFromDirectory;
import org.apache.mahout.vectorizer.SparseVectorsFromSequenceFiles;
public class PlayTennis1 {
private static final String WORK_DIR = "hdfs://192.168.9.72:9000/zhoujianfeng/playtennis";
/*
* 测试代码
*/
public static void main(String[] args) {
//将训练数据转换成 vector数据
makeTrainVector();
//产生训练模型
makeModel(false);
//测试检测数据
BayesCheckData.printResult();
}
public static void makeCheckVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"testinput";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-test-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-test-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeTrainVector(){
//将测试数据转换成序列化文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"input";
String output = WORK_DIR+Path.SEPARATOR+"tennis-seq";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SequenceFilesFromDirectory sffd = new SequenceFilesFromDirectory();
String[] params = new String[]{"-i",input,"-o",output,"-ow"};
ToolRunner.run(sffd, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("文件序列化失败!");
System.exit(1);
}
//将序列化文件转换成向量文件
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-seq";
String output = WORK_DIR+Path.SEPARATOR+"tennis-vectors";
Path in = new Path(input);
Path out = new Path(output);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
SparseVectorsFromSequenceFiles svfsf = new SparseVectorsFromSequenceFiles();
String[] params = new String[]{"-i",input,"-o",output,"-lnorm","-nv","-wt","tfidf"};
ToolRunner.run(svfsf, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("序列化文件转换成向量失败!");
System.out.println(2);
}
}
public static void makeModel(boolean completelyNB){
try {
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String input = WORK_DIR+Path.SEPARATOR+"tennis-vectors"+Path.SEPARATOR+"tfidf-vectors";
String model = WORK_DIR+Path.SEPARATOR+"model";
String labelindex = WORK_DIR+Path.SEPARATOR+"labelindex";
Path in = new Path(input);
Path out = new Path(model);
Path label = new Path(labelindex);
FileSystem fs = FileSystem.get(conf);
if(fs.exists(in)){
if(fs.exists(out)){
//boolean参数是,是否递归删除的意思
fs.delete(out, true);
}
if(fs.exists(label)){
//boolean参数是,是否递归删除的意思
fs.delete(label, true);
}
TrainNaiveBayesJob tnbj = new TrainNaiveBayesJob();
String[] params =null;
if(completelyNB){
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow","-c"};
}else{
params = new String[]{"-i",input,"-el","-o",model,"-li",labelindex,"-ow"};
}
ToolRunner.run(tnbj, params);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("生成训练模型失败!");
System.exit(3);
}
}
}
package myTesting.bayes;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.fs.PathFilter;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.mahout.classifier.naivebayes.BayesUtils;
import org.apache.mahout.classifier.naivebayes.NaiveBayesModel;
import org.apache.mahout.classifier.naivebayes.StandardNaiveBayesClassifier;
import org.apache.mahout.common.Pair;
import org.apache.mahout.common.iterator.sequencefile.PathType;
import org.apache.mahout.common.iterator.sequencefile.SequenceFileDirIterable;
import org.apache.mahout.math.RandomAccessSparseVector;
import org.apache.mahout.math.Vector;
import org.apache.mahout.math.Vector.Element;
import org.apache.mahout.vectorizer.TFIDF;
import com.google.common.collect.ConcurrentHashMultiset;
import com.google.common.collect.Multiset;
public class BayesCheckData {
private static StandardNaiveBayesClassifier classifier;
private static Map<String, Integer> dictionary;
private static Map<Integer, Long> documentFrequency;
private static Map<Integer, String> labelIndex;
public void init(Configuration conf){
try {
String modelPath = "/zhoujianfeng/playtennis/model";
String dictionaryPath = "/zhoujianfeng/playtennis/tennis-vectors/dictionary.file-0";
String documentFrequencyPath = "/zhoujianfeng/playtennis/tennis-vectors/df-count";
String labelIndexPath = "/zhoujianfeng/playtennis/labelindex";
dictionary = readDictionnary(conf, new Path(dictionaryPath));
documentFrequency = readDocumentFrequency(conf, new Path(documentFrequencyPath));
labelIndex = BayesUtils.readLabelIndex(conf, new Path(labelIndexPath));
NaiveBayesModel model = NaiveBayesModel.materialize(new Path(modelPath), conf);
classifier = new StandardNaiveBayesClassifier(model);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("检测数据构造成vectors初始化时报错。。。。");
System.exit(4);
}
}
/**
* 加载字典文件,Key: TermValue; Value:TermID
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<String, Integer> readDictionnary(Configuration conf, Path dictionnaryDir) {
Map<String, Integer> dictionnary = new HashMap<String, Integer>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
String name = path.getName();
return name.startsWith("dictionary.file");
}
};
for (Pair<Text, IntWritable> pair : new SequenceFileDirIterable<Text, IntWritable>(dictionnaryDir, PathType.LIST, filter, conf)) {
dictionnary.put(pair.getFirst().toString(), pair.getSecond().get());
}
return dictionnary;
}
/**
* 加载df-count目录下TermDoc频率文件,Key: TermID; Value:DocFreq
* @param conf
* @param dictionnaryDir
* @return
*/
private static Map<Integer, Long> readDocumentFrequency(Configuration conf, Path documentFrequencyDir) {
Map<Integer, Long> documentFrequency = new HashMap<Integer, Long>();
PathFilter filter = new PathFilter() {
@Override
public boolean accept(Path path) {
return path.getName().startsWith("part-r");
}
};
for (Pair<IntWritable, LongWritable> pair : new SequenceFileDirIterable<IntWritable, LongWritable>(documentFrequencyDir, PathType.LIST, filter, conf)) {
documentFrequency.put(pair.getFirst().get(), pair.getSecond().get());
}
return documentFrequency;
}
public static String getCheckResult(){
Configuration conf = new Configuration();
conf.addResource(new Path("/usr/local/hadoop/conf/core-site.xml"));
String classify = "NaN";
BayesCheckData cdv = new BayesCheckData();
cdv.init(conf);
System.out.println("init done...............");
Vector vector = new RandomAccessSparseVector(10000);
TFIDF tfidf = new TFIDF();
//sunny,hot,high,weak
Multiset<String> words = ConcurrentHashMultiset.create();
words.add("sunny",1);
words.add("hot",1);
words.add("high",1);
words.add("weak",1);
int documentCount = documentFrequency.get(-1).intValue(); // key=-1时表示总文档数
for (Multiset.Entry<String> entry : words.entrySet()) {
String word = entry.getElement();
int count = entry.getCount();
Integer wordId = dictionary.get(word); // 需要从dictionary.file-0文件(tf-vector)下得到wordID,
if (StringUtils.isEmpty(wordId.toString())){
continue;
}
if (documentFrequency.get(wordId) == null){
continue;
}
Long freq = documentFrequency.get(wordId);
double tfIdfValue = tfidf.calculate(count, freq.intValue(), 1, documentCount);
vector.setQuick(wordId, tfIdfValue);
}
// 利用贝叶斯算法开始分类,并提取得分最好的分类label
Vector resultVector = classifier.classifyFull(vector);
double bestScore = -Double.MAX_VALUE;
int bestCategoryId = -1;
for(Element element: resultVector.all()) {
int categoryId = element.index();
double score = element.get();
System.out.println("categoryId:"+categoryId+" score:"+score);
if (score > bestScore) {
bestScore = score;
bestCategoryId = categoryId;
}
}
classify = labelIndex.get(bestCategoryId)+"(categoryId="+bestCategoryId+")";
return classify;
}
public static void printResult(){
System.out.println("检测所属类别是:"+getCheckResult());
}
}
1. 请介绍一下WebGIS的概念和作用,以及在实际应用中的优势和挑战。
WebGIS是一种基于Web技术的地理信息系统,通过将地理数据和功能以可视化的方式呈现在Web浏览器中,实现地理空间数据的共享和分析。它可以用于地图浏览、空间查询、地理分析等多种应用场景。WebGIS的优势包括易于访问、跨平台、实时更新、可定制性强等,但也面临着数据安全性、性能优化、用户体验等挑战。
2. 请谈谈您在WebGIS开发方面的经验和技能。
我在WebGIS开发方面有丰富的经验和技能。我熟悉常用的WebGIS开发框架和工具,如ArcGIS API for JavaScript、Leaflet、OpenLayers等。我能够使用HTML、CSS和JavaScript等前端技术进行地图展示和交互设计,并能够使用后端技术如Python、Java等进行地理数据处理和分析。我还具备数据库管理和地理空间数据建模的能力,能够设计和优化WebGIS系统的架构。
3. 请描述一下您在以往项目中使用WebGIS解决的具体问题和取得的成果。
在以往的项目中,我使用WebGIS解决了许多具体问题并取得了显著的成果。例如,在一次城市规划项目中,我开发了一个基于WebGIS的交通流量分析系统,帮助规划师们评估不同交通方案的效果。另外,在一次环境监测项目中,我使用WebGIS技术实现了实时的空气质量监测和预警系统,提供了准确的空气质量数据和可视化的分析结果,帮助政府和公众做出相应的决策。
4. 请谈谈您对WebGIS未来发展的看法和期望。
我认为WebGIS在未来会继续发展壮大。随着云计算、大数据和人工智能等技术的不断进步,WebGIS将能够处理更大规模的地理数据、提供更丰富的地理分析功能,并与其他领域的技术进行深度融合。我期望未来的WebGIS能够更加智能化、个性化,为用户提供更好的地理信息服务,助力各行各业的决策和发展。
这块您需要了解下stm32等单片机的基本编程和简单的硬件设计,最好能够了解模电和数电相关的知识更好,还有能够会做操作系统,简单的有ucos,freeRTOS等等。最好能够使用PCB画图软件以及keil4等软件。希望对您能够有用。
1.负责区域大客户/行业客户管理系统销售拓展工作,并完成销售流程;
2.维护关键客户关系,与客户决策者保持良好的沟通;
3.管理并带领团队完成完成年度销售任务。