標籤: 台北網頁設計

  • Spark如何與深度學習框架協作,處理非結構化數據

    Spark如何與深度學習框架協作,處理非結構化數據

    隨着大數據和AI業務的不斷融合,大數據分析和處理過程中,通過深度學習技術對非結構化數據(如圖片、音頻、文本)進行大數據處理的業務場景越來越多。本文會介紹Spark如何與深度學習框架進行協同工作,在大數據的處理過程利用深度學習框架對非結構化數據進行處理。

    Spark介紹

    Spark是大規模數據處理的事實標準,包括機器學習的操作,希望把大數據處理和機器學習管道整合。

    Spark使用函數式編程範式擴展了MapReduce模型以支持更多計算類型,可以涵蓋廣泛的工作流。Spark使用內存緩存來提升性能,因此進行交互式分析也足夠快速(如同使用Python解釋器,與集群進行交互一樣)。緩存同時提升了迭代算法的性能,這使得Spark非常適合機器學習。

    由於Spark庫提供了Python、Scale、Java編寫的API,以及內建的機器學習、流數據、圖算法、類SQL查詢等模塊;Spark迅速成為當今最重要的分佈式計算框架之一。與YARN結合,Spark提供了增量,而不是替代已存在的Hadoop集群。在最近的Spark版本中,Spark加入了對於K8s的支持,為Spark與AI能力的融合提供了更好的支持。

     

    深度學習框架介紹

    TensorFlow

    TensorFlow最初是由Google機器智能研究部門的Google Brain團隊開發,基於Google 2011年開發的深度學習基礎架構DistBelief構建起來的。由於Google在深度學習領域的巨大影響力和強大的推廣能力,TensorFlow一經推出就獲得了極大的關注,並迅速成為如今用戶最多的深度學習框架。

    TensorFlow是一個非常基礎的系統,因此也可以應用於眾多領域。但由於過於複雜的系統設計,對讀者來說,學習TensorFlow底層運行機制更是一個極其痛苦的過程。TensorFlow的接口一直處於快速迭代之中,並且沒有很好地考慮向後兼容性,這導致現在許多開源代碼已經無法在新版的TensorFlow上運行,同時也間接導致了許多基於TensorFlow的第三方框架出現BUG。

    Keras

    Keras 於2015年3月首次發布,擁有“為人類而不是機器設計的API”,得到Google的支持。它是一個用於快速構建深度學習原型的高層神經網絡庫,由純Python編寫而成,以TensorFlow、CNTK、Theano和MXNet為底層引擎,提供簡單易用的API接口,能夠極大地減少一般應用下用戶的工作量。

    嚴格意義上講,Keras並不能稱為一個深度學習框架,它更像一個深度學習接口,它構建於第三方框架之上。Keras的缺點很明顯:過度封裝導致喪失靈活性。Keras最初作為Theano的高級API而誕生,後來增加了TensorFlow和CNTK作為後端。學習Keras十分容易,但是很快就會遇到瓶頸,因為它缺少靈活性。另外,在使用Keras的大多數時間里,用戶主要是在調用接口,很難真正學習到深度學習的內容。

    PyTorch

    PyTorch於2016年10月發布,是一款專註於直接處理數組表達式的低級API。 前身是Torch(一個基於Lua語言的深度學習庫)。Facebook人工智能研究院對PyTorch提供了強力支持。PyTorch支持動態計算圖,為更具數學傾向的用戶提供了更低層次的方法和更多的靈活性,目前許多新發表的論文都採用PyTorch作為論文實現的工具,成為學術研究的首選解決方案。

    Caffe/Caffe2.0

    Caffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習框架,於2013年底由加州大學伯克利分校開發,核心語言是C++。它支持命令行、Python和MATLAB接口。Caffe的一個重要特色是可以在不編寫代碼的情況下訓練和部署模型。如果您是C++熟練使用者,並對CUDA計算游刃有餘,你可以考慮選擇Caffe。

    在Spark大數據處理中使用深度學習框架

    在Spark程序中使用一個預訓練過的模型,將其并行應用於大型數據集的數據處理。比如,給定一個可以識別圖片的分類模型,其通過一個標準數據集(如ImageNet)訓練過。可以在一個Spark程序中調用一個框架(如TensorFlow或Keras)進行分佈式預測。通過在大數據處理過程中調用預訓練模型可以直接對非結構化數據進行直接處理。

    我們重點介紹在Spark程序中使用Keras+TensorFlow來進行模型推理。

    使用深度學習處理圖片的第一步,就是載入圖片。Spark 2.3中新增的ImageSchema包含了載入數百萬張圖像到Spark DataFrame的實用函數,並且以分佈式方式自動解碼,容許可擴展地操作。

    使用Spark’s ImageSchema:

    from pyspark.ml.image import ImageSchema
    image_df = ImageSchema.readImages("/data/myimages")
    image_df.show()

    也可以利用Keras的圖片處理庫:

    from keras.preprocessing import image
    img = image.load_img("/data/myimages/daisy.jpg", target_size=(299, 299))

    可以通過圖片路徑來構造Spark DataFrame:

    def get_image_paths_df(sqlContext, dirpath, colName):
        files = [os.path.abspath(os.path.join(dirpath, f)) for f in os.listdir(dirpath) if f.endswith('.jpg')]
        return sqlContext.createDataFrame(files, StringType()).toDF(colName)

    使用Keras接口加載預訓練模型:

    from keras.applications import InceptionV3
    model = InceptionV3(weights="imagenet")
    model.save('/tmp/model-full.h5')
    model = load_model('/tmp/model-full.h5')

    定義圖片識別推理方法:

    def iv3_predict(fpath):
                model = load_model('/tmp/model-full.h5')
                img = image.load_img(fpath, target_size=(299, 299))
                x = image.img_to_array(img)
                x = np.expand_dims(x, axis=0)
                x = preprocess_input(x)
     
                preds = model.predict(x)
                preds_decode_list = decode_predictions(preds, top=3)
                tmp = preds_decode_list[0]
                res_list = []
                for x in tmp:
                    res = [x[0], x[1], float(x[2])]
                    res_list.append(res)
                return res_list

    定義推理輸入結果Schema:

    def get_labels_type():    
        ele_type = StructType()    
        ele_type.add("class", data_type=StringType())    
        ele_type.add("description", data_type=StringType())    
        ele_type.add("probability", data_type=FloatType())    
        return ArrayType(ele_type)

    將推理方法定義成Spark UDF:

    spark.udf.register("iv3_predict", iv3_predict, returnType=get_labels_type())

    載入圖片定義為數據表:

    df = get_image_paths_df(self.sql)
    df.createOrReplaceTempView("_test_image_paths_df")

    使用SQL語句對接圖片進行處理:

    df_images = spark.sql("select fpath, iv3_predict(fpath) as predicted_labels from _test_image_paths_df")
    df_images.printSchema()
    df_images.show(truncate=False)

    結語

    在大數據Spark引擎中使用深度學習框架加載預處理模型,來進行非結構數據處理有非常多的應用場景。但是由於深度學習框架目前比較多,模型與框架本身是深度耦合,在大數據環境中安裝和部署深度學習框架軟件及其依賴軟件會非常複雜,同時不利於大數據集群的管理和維護,增加人力成本。

    華為雲DLI服務,採用大數據Serverless架構,用戶不需要感知實際物理集群,同時DLI服務已經在大數據集群中內置了AI計算框架和底層依賴庫(Keras/tensorflow/scikit-learn/pandas/numpy等)。DLI最新版本中已經支持k8s+Docker生態,並開放用戶自定義Docker鏡像能力,提供給用戶來擴展自己的AI框架、模型、算法包。在Serverless基礎上,為用戶提供更加開放的自定義擴展能力。

    DLI支持多模引擎,企業僅需使用SQL或程序就可輕鬆完成異構數據源的批處理、流處理等,挖掘和探索數據信息,揭示其中的規律並發現數據潛在價值,華為雲618年中鉅惠,大數據+AI專場,歷史低價,助力企業“智能化”,業務“數據化”。

     

    點擊關注,第一時間了解華為雲新鮮技術~

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

    FB行銷專家,教你從零開始的技巧

    聚甘新

  • 利用Azure Functions和k8s構建Serverless計算平台

    利用Azure Functions和k8s構建Serverless計算平台

    題記:昨晚在一個技術社區直播分享了“利用Azure Functions和k8s構建Serverless計算平台”這一話題。整個分享分為4個部分:Serverless概念的介紹、Azure Functions的簡單介紹、k8s和KEDA的介紹和最後的演示。

    Serverless

    Serverless其實包含了兩種概念:BaaS(Backend as a Service)和FaaS(Function as a Service)。這次的分享主要針對的是FaaS概念。

    FaaS的最大特徵就是:無需管理自己的服務器或擁有自己的持續運行的服務應用的情況下運行後端代碼。 上面加粗的地方其實也揭示了FaaS和PaaS的本質區別:你為了運行後端代碼,需不需要擁有一套持續運行的服務端完整應用(不管是WebSite還是Web API)。

    另外,FaaS還擁有如下特徵:

    • 可以使用任何語言,不需要針對特定框架和函數進行編碼
    • 部署方式和傳統系統有很大不同
    • 水平伸縮完全自動化、彈性,並由平台供應商管理
    • 函數通常由事件觸發,部分平台供應商支持接收HTTP觸發

    當然判斷什麼東西不是FaaS也有一些標準:

    • 能否在20ms啟動半秒執行完,根本區別在於伸縮性的方式
    • FaaS也可能依賴容器,但是和其他使用容器的應用區別在於伸縮性的自動化、透明和細度
    • 沒有傳統的Ops,但是應用本身運維過程還是需要,甚至更難(因為不同)

    使用FaaS有其優缺點,這裏就報喜不報憂,只列一下優點:

    • 降低運維成本
      • 基礎設施共享
      • 減少基礎設施維護人工成本
    • 降低伸縮成本
      • 按量付費:偶爾請求,流量忽高忽低
      • 優化代碼即可省錢
    • 更易運維
      • 伸縮的好處利於降低運維難度
      • 降低打包和部署複雜度
      • 快速投入市場,持續優化

    Azure Functions

    以官方文檔的介紹:Azure Functions 允許你運行小段代碼(稱為“函數”)且不需要擔心應用程序基礎結構。 藉助 Azure Functions,雲基礎結構可以提供應用程序保持規模化運行所需的所有最新狀態的服務器。 函數由特定類型的事件“觸發”。 支持的觸發器包括對數據更改做出響應、對消息做出響應、按計劃運行,或者生成 HTTP 請求的結果。 雖然你始終可以直接針對大量服務編寫代碼,但使用綁定可以簡化與其他服務的集成。 使用綁定,你能夠以聲明方式訪問各種 Azure 服務和第三方服務。

    Azure Functions包含如下功能:

    • 無服務器應用程序:使用 Functions,可在 Microsoft Azure 上開發無服務器應用程序。
    • 語言選擇:使用所選的 C#、Java、JavaScript、Python 和 PowerShell 編寫函數。
    • 按使用付費定價模型:僅為運行代碼所用的時間付費。
    • 自帶依賴項:Functions 支持 NuGet 和 NPM,允許你訪問你喜歡的庫。
    • 集成的安全性:使用 OAuth 提供程序(如 Azure Active Directory、Facebook、Google、Twitter 和 Microsoft 帳戶)保護 HTTP 觸發的函數。
    • 簡化的集成:輕鬆與 Azure 服務和軟件即服務 (SaaS) 產品/服務進行集成。
    • 靈活開發:直接在門戶中編寫函數代碼,或者通過 GitHub、Azure DevOps Services 和其他受支持的開發工具設置持續集成和部署代碼。
    • 有狀態無服務器體繫結構:使用 Durable Functions 協調無服務器應用程序。
    • 開放源代碼:Functions 運行時是開源的,可在 GitHub 上找到。

    大家看到了,Azure Functions雖然是來源於微軟Azure的技術,但是是使用MIT協議開源的,且已經貢獻給.NET Foundation

    所以,你可以使用Azure Functions來搭建(甚至定製)自己的Serverless計算平台。開源的不僅是Azure Functions框架本身,還包括了命令行工具(可以支持本地調試)和VSCode的擴展。當然,開發工具除了前面兩者,你還是可以使用宇宙第一的IDE:Visual Studio。

    下面是相關開源的地址:

    • 框架:https://github.com/Azure/azure-functions-host
    • 命令行工具:https://github.com/Azure/azure-functions-core-tools
    • VSCode擴展:https://github.com/Microsoft/vscode-azurefunctions

    只有開源的框架還不行,還需要運行環境,正如大部分開源FaaS框架一樣,Azure Functions也把k8s作為運行環境。不過為了達到自動伸縮、不使用就不消耗資源的目標,還需要搭配其他中間件才能達到效果。

    k8s和KEDA

    眾所周知,Kubernetes已經成為最主流的PaaS平台,各大公有雲提供商都提供了k8s的服務,比如微軟Azure上的AKS或者阿里雲的ACK。

    為了更好的理解為什麼k8s可以作為Serverless完美的運行環境,是需要對如下概念有一些深入的理解的:

    • Pod和Deployment:Pod代表了運行函數的實例,而Deployment用於控制函數的實例數。
    • HPA(Horizontal Pod Autoscaler):k8s內置的水平Pod自動伸縮器,其基於一些度量指標(比如內存、CPU等)來對Deployment的Pod實例數進行伸縮。
    • Helm Charts:一個強大的打包、發布k8s應用的包管理器。我們開發好的函數在編譯為Docker Image之後,可以用Helm Charts來打包(當然也可以直接用k8s的yaml文件)。

    k8s雖然提供了HPA,但是它無法基於更靈活的事件源來進行伸縮,也無法把Pod的實例數縮到0,或者由0伸到1。這個時候,就需要另外一個開源項目KEDA出場了(貢獻者來自微軟、AWS等大公司,以及很多社區志願者)。

    KEDA:Kubernetes Event-driven Autoscaling。項目地址在:https://github.com/kedacore/keda。其具有如下特點:

    • 事件驅動
    • 輕而易舉實現自動伸縮
    • 內置伸縮器
    • 多種負載類型
    • 社區開源項目
    • 支持Azure Functions

    KEDA的架構如下圖所示:

    從這個架構圖,我們看到KEDA包含了3個組件,Metric Adapter給k8s的HPA提供度量指標讓其進行1-n/n-1的伸縮,Controller控制Pod進行1-0/0-1的伸縮,Scaler偵聽配置的觸發器所觸發的事件。

    且支持的伸縮器涵蓋了大部分主流雲組件或中間件:

    • Apache Kafka
    • AWS CloudWatch
    • AWS Kinesis Stream
    • AWS SQS Queue
    • Azure Blob Storage
    • Azure Event Hubs
    • Azure Monitor
    • Azure Service Bus
    • Azure Storage Queue
    • External
    • GCP Pub/Sub
    • Huawei Cloudeye
    • Liiklus Topic
    • MySQL
    • NATS Streaming
    • PostgreSQL
    • Prometheus
    • RabbitMQ Queue
    • Redis List

    演示

    既然Azure Functions是開源技術,為了驗證技術中立性,在演示過程中特意選擇了阿里雲的ACK作為運行環境(Kubernetes託管版),並使用RabbitMQ作為伸縮觸發器。

    同時,我們採用C#/.NET Core來作為函數的開發語言。為什麼用這個選擇,是因為有第三方對AWS Lambda上的支持的語言進行了性能測試,得到的結論是.NET Core的C#和F#語言性能最高:

    來源:https://read.acloud.guru/comparing-aws-lambda-performance-of-node-js-python-java-c-and-go-29c1163c2581

    環境準備

    首先,需要到阿里雲上創建一個k8s集群,創建的選項截圖如下:

    通過如下命令來部署KEDA到k8s:

    helm repo add kedacore https://kedacore.github.io/charts
    kubectl create namespace keda
    helm install keda kedacore/keda --namespace keda

    通過如下命令來部署RabbitMQ到k8s:

    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm install rabbitmq --set rabbitmq.password=PASSWORD,service.type=LoadBalancer bitnami/rabbitmq

    這裏需要注意(當然也可能是我打開方式不對),阿里雲的ACK不能自動創建pv,所以rabbitmq部署後會有問題,所以需要到阿里雲的ACK的控制面板裏面手動創建pv,並重建rabbitmq所需的同名pvc。

    創建Azure Functions項目

    訪問:https://github.com/Azure/azure-functions-core-tools,安裝命令行工具。

    在命令行中輸入:

    func init --docker

    來初始化一個帶有Dockerfile的Azure Functions項目,worker runtime選擇dotnet。

    在命令行中輸入:

    func function create

    來創建一個函數,template選擇QueueTrigger,輸入你想要的函數名稱。

    使用你喜歡的編輯器(比如VSCode)打開項目文件夾,修改csproj文件中的PackageReference為如下內容:

    <ItemGroup>
      <PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.3" />
      <PackageReference Include="Microsoft.Azure.WebJobs.Extensions.RabbitMQ" Version="0.2.2029-beta" />
    </ItemGroup>

    修改函數代碼為如下內容:

    [FunctionName("MyMqFunction")]
    public static void Run(
        [RabbitMQTrigger("queue", ConnectionStringSetting = "RabbitMqConnection")] string inputMessage,
        [RabbitMQ(QueueName = "downstream", ConnectionStringSetting = "RabbitMqConnection")] out string outputMessage,
            ILogger log)
    {
        Thread.Sleep(5000);
        outputMessage = inputMessage;
        log.LogInformation($"RabittMQ output binding function sent message: {outputMessage}");
    }

    這個函數從一個名為”queue“的隊列中讀取inputMessage,延遲5秒后,把消息存儲到名為”downstream”的隊列中。

    打開local.settings.json文件,在Values節點下添加RabbitMqConnection:

    "Values": {
      "AzureWebJobsStorage": "UseDevelopmentStorage=true",
      "FUNCTIONS_WORKER_RUNTIME": "dotnet",
      "RabbitMqConnection":"amqp://user:PASSWORD@rabbitmq.default.svc.cluster.local:5672"
    },

    這裏RabbitMQ的地址使用了k8s內部的默認Service地址,為了方便本地調試,你可以獲取到RabbitMQ在k8s的公網IP后,給這個域名添加host配置。

    在命令行中輸入:

    func start

    就可以進行本地調試了。調試無誤,就可以進行發布到k8s的工作了。

    以上示例代碼可以在這裏找到:https://github.com/heavenwing/AzFuncOnK8S

    發布函數到k8s並驗證伸縮能力

    考慮到我用的阿里雲拉取Docker Hub比較慢,所以我是編譯出Docker Image后,push到了阿里雲的鏡像倉庫當中。 另外,我這裏還遇到一個問題,就是能在AKS中正常運行的Docker Image在ACK中無法正常運行,出現”Access to the path ‘/proc/1/map_files’ is denied”的錯誤,我的臨時解決辦法是修改Dockerfile文件,添加WORKDIR命令。

    在把Docker Image推送到鏡像倉庫后,可以在命令行中輸入:

    func kubernetes deploy --name azfunconk8s --image-name registry.cn-chengdu.aliyuncs.com/zygcloud/azfunconk8s:latest --dry-run > deploy-funcs.yaml

    得到部署的yaml文件后,我們需要對ScaledObject進行一點修改,為rabbitmq的trigger配置添加queueLength,根據需要配置maxReplicaCount屬性,如下所示:

    apiVersion: keda.k8s.io/v1alpha1
    kind: ScaledObject
    metadata:
      name: azfunconk8s
      namespace: default
      labels:
        deploymentName: azfunconk8s
    spec:
      scaleTargetRef:
        deploymentName: azfunconk8s
      maxReplicaCount: 20
      triggers:
      - type: rabbitmq
        metadata:
          type: rabbitMQTrigger
          queueName: queue
          name: inputMessage
          host: RabbitMqConnection
          queueLength: "20"

    現在就可以把函數部署到k8s了,在命令行中輸入:

    kubectl apply -f .\deploy\deploy-funcs.yaml

    這個時候應該可以看到k8s出現了名為azfunconk8s的Deployment,且需要實例和運行實例數都是為0:

    另外寫一個小程序,往RabbitMQ的queue隊列裏面放一些測試消息,經過30秒(默認pollingInterval時間)那麼就會看到這個Deployment的所需實例數在提高,一直提高到你設置的maxReplicaCount。等隊列中的消息處理完成,又會看到所需實例數在降低,等沒有消息需要處理之後過上5分鐘(默認cooldownPeriod時間),所需實例數就會變為0。

    紅包

    能看到這裏的小夥伴都是愛學習的,應該紅包獎勵,不過當然是需要回答問題的。
    問:KEDA解決的是非http的觸發器伸縮,那麼什麼東西可以解決http觸發器伸縮問題?
    在我的公眾號中輸入答案,獲取支付寶紅包口令,數量有限先答對先得。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※超省錢租車方案

    ※教你寫出一流的銷售文案?

    網頁設計最專業,超強功能平台可客製化

    聚甘新

  • 使用四叉樹優化碰撞檢測

    使用四叉樹優化碰撞檢測

    四叉樹是干什麼的?

    百度百科
    四元樹又稱四叉樹是一種樹狀數據結構,在每一個節點上會有四個子區塊。四元樹常應用於二維空間數據的分析與分類。 它將數據區分成為四個象限。數據範圍可以是方形或矩形或其他任意形狀。
    從定義我們可以看出重點信息:

    1. 樹狀結構
    2. 四個區塊
    3. 分類
    4. 矩形

    圖示講解

    講解之前需要先說明一下四叉樹是用來做什麼的,明白了原理才好理解它的行為。
    使用四叉樹就是使用分類的方法,減少碰撞節點的個數,只取出與給定碰撞體相同區域或者壓在碰撞體所在區域邊上的對象。

    1. 將遊戲屏幕分為四個區域。
    2. 插入對象
    3. 插入的對象超過了我們設置的閾值時,劃分
    4. 插入的對象再次超過了我們設置的閾值時,繼續分。

    分析

    插入

    從上面的圖示我們可以很好理解四叉樹的原理。涉及的都是插入操作。
    那麼插入操作具體都做了什麼呢?

    從代碼中我們可以看出:

    1. 當插入第一個對象的時候只走了2;這個時候沒有子樹,所以不會走1,因為objects(管理的對象)的長度還沒有超過我們設置的閾值MAX_OBJECTS,所以也不會走3。
    2. 一直插入,當objects中的數量,超過了我們設置的閾值MAX_OBJECT,就會開始劃分,產生子樹,有了nodes,劃分之後將自己管理的節點插入到子樹中。再此之前,都不會走1,因為還沒有產生子樹。
    3. 劃分之後再次插入新對象,如果對象可以獲得對應的象限,就會走1 不會走2和3,如果沒有獲得對應的象限才會走2,3(沒有獲得的情況可能是你創建的對象在屏幕外,遊戲中很多情況是敵人從屏幕外走進屏幕的,具體可參考我做的《星際迷航》或者《星際戰》遊戲)。

    更新對象

    我是把四插入作為了對象管理器使用,要不然對象也需要更新,所以有了這一步操作。如果不這樣你需要自己創建對象管理器,一個一個放進去,刪除。通過四叉樹直接管理省了不少事情。

    更新象限信息。

    這是一個遞歸操作,更新象限做的事情比較多了。

    1. 檢查對象是否存活,如果死亡就回收,我這裏使用了對象池,所以對象實現了poolAble接口。

    2. 判斷對象的所佔區域是否在四叉樹的區域內
      這裏需要說明的是一個四叉樹本身的區域是它管理的四個象限這麼大。也就是一個四叉樹管理四個象限

      不在管理區域的話需要判斷當前this是否為根節點,如果是說明對象已經出屏了。(這個時候可以通過對象實現的isVisible接口來控制是否回收,因為不是所有在屏幕外的都要回收,比如要進入屏幕的敵人,是不可能回收的,所以需要自己用isVisible接口來控制)。如果不是就將對象放入根節點,重新劃分。

    3. 在管理區域內,就看看在四叉樹管理的哪個象限里。更新象限信息。

      如果沒有變化什麼都不過,如果有變化,先判斷象限是否為-1,為什麼會出現-1,也就是不在四個象限的任何一個象限?因為壓線了。此番操作后的結果如下圖。

    根據給定矩形獲取對象列表

    1. 第一個是步長,用於獲取深度,當然深度越長,處理的時間越長,獲取的對象也精細。這個可以根據自己遊戲的同屏四叉樹層級而定了。
    2. 如果通過obj的rect獲得對象所在象限如果獲得了對應的象限,用獲得的象限的四叉樹再獲取。如果壓線的話就需要將碰撞的兩個象限的內容都取出來。
    3. 返回四叉樹中沒有分割象限的對象。

    怎麼用呢?

    自然就是把要碰撞的對象傳給retrieve函數獲得需要碰撞的對象列表進行碰撞檢測了。
    也就是文章靠頭說的:
    使用四叉樹就目的是為了減少碰撞節點的個數。使用的是分類的方法。
    至於用什麼樣的碰撞檢測函數,不是四叉樹關心的事情,

    至於用幾個四叉樹管理對象,也不是四叉樹關心的事情。

    結語

    想要demo的同學可以去我的微店或者官方creator商城購買《跨引擎遊戲框架》源碼,跟demo是一個項目。買過的同學請加我好友,群已經建好,有更新我會群里直接發包。

    源碼購買入口:

    demo展示:

    項目截圖:

    框架的相關模塊教程可以到《我的專輯》遊戲開發進階教程中獲取。
    後續還會推出更多與框架有關的教程:如:戰鬥框架,教學框架等等。並附帶完整的遊戲實現(飛行射擊遊戲為例,學會做飛行射擊遊戲不是目的,目的是通過這一款遊戲,你可以獲得做其他所有類型的遊戲的思路)。希望可以在不餓死自己的前提下幫助更過的朋友們快速找到開發思路。

    長按下方二維碼,關注《微笑遊戲》公眾號,獲取更多精彩內容。

    歡迎掃碼關注公眾號《微笑遊戲》,瀏覽更多內容。

    本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※教你寫出一流的銷售文案?

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※回頭車貨運收費標準

    ※別再煩惱如何寫文案,掌握八大原則!

    ※超省錢租車方案

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    聚甘新

  • Uber在英推出電動車隊,BYD、Nissan響應

    新式交通運輸公司Uber在英國倫敦發表了全球首支電動車車隊,並由中國比亞迪(BYD)、日商Nissan響應,分別提供E6和LEAF組成一支50輛電動車的車隊。這支車隊在8月31日正式上路,可有效減少當地空污;若反應良好,還會拓展到其他英國城市。

    倫敦市長Sadiq Khan曾承諾要將倫敦市轉型為全球最環保的城市,並積極採用低碳排放車款、設置電動車充電站。今年三月,由BYD和英國ADL聯手研發的五輛電動雙層巴士正式在倫敦上路,是全球首個電動雙層巴士車隊。

    另一方面,Uber也曾在南非、葡萄牙測試驗動車專案,並推出Uber Green實驗性服務。Uber車隊也曾採用Toyota Prius油電混和車,藉此降低行駛時的碳排放量。

    英國Uber總經理Jo Bertram表示,Uber希望能建立一個節能減碳的共乘交通模式,與Nissan、BYD的合作代表這個決心,也將是個起點。目前,英國的Uber大約有六成是油電混和車款,倫敦市對於電動車的接受度相對較高。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※帶您來了解什麼是 USB CONNECTOR  ?

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    ※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

    ※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※教你寫出一流的銷售文案?

    聚甘新

  • 電動巴士開進太魯閣,花縣繼續推動綠能公車政策

    電動巴士開進太魯閣,花縣繼續推動綠能公車政策

    花蓮縣太魯閣客運公司今年繼續辦理增資,以採購新的電動巴士。自9月起,往來於花蓮市區、太魯閣、東華大學等地的公車路線,將有電動巴士陸續開始運行。

    花蓮縣政府的「綠能公車」政策於2014年核定太魯閣客運公司的301線、302線兩條公車路線上路,且須採用電動巴士運行。一開始因電動巴士品質不夠穩定,一度改租用柴油巴士,但受到反彈而停駛;之後在地方民代的協調下,301、302線規劃復駛,並透過增資採購7輛低底盤K9電動巴士車輛,重新展開電動巴士服務。

    太魯閣客運公司經理表示,本次採購的7輛K9電動巴士為台灣凱勝綠能科技所生產,車體採用全鋁合金打造,並配有緊急自動滅火系統、ABS防鎖剎車等。車輛搭載的電池為台灣長利科技的磷酸鋰鐵電池,每次充飽電的續航力可達250公里以上。

    K9巴士的性能佳,目前在苗栗客運、捷順交通、雲林客運、南台灣客運等公司都有同款車輛正在提供服務。太魯閣客運採購K9巴士時,為挑戰巴士的續航力,還安排一輛K9巴士直接從苗栗車體廠繞過北台灣、蘇花公路一路行駛到花蓮東華大學,總里程320.7公里,全程開冷氣;駛達目的地後,電池的電量還有43.9%之多。

    目前,301線已配合東華大學開學而正式復駛。太魯閣客運希望新城到天祥的302線也能在年底前復駛,預計將有6輛電動巴士投入服役。

    (照片來源:東華大學/太魯閣客運)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※為什麼 USB CONNECTOR 是電子產業重要的元件?

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※台北網頁設計公司全省服務真心推薦

    ※想知道最厲害的網頁設計公司“嚨底家”!

    ※推薦評價好的iphone維修中心

    聚甘新

  • 電動車夯,立凱-KY 8月營收創歷史新高

    電池正極材料廠立凱-KY公布8月合併營收為1.47億元,年成長62.6%,月增23.1%,創下單月歷史新高;累計其前8月營收8.77億元、年增24.03%;公司指出,8月營收攀高,主因是受惠產品價格持續走揚、以及車電事業部新增加技術服務收入。

    立凱-KY並表示,公司在中國大陸與五龍電動車集團的合作亦有重要斬獲。9月4日在中國杭州開幕的二十國集團(G20)首腦峰會,中國作為接待地主國為體現國家綠色和可持續發展的理念,首次使用純電動汽車作為G20峰會首長貴賓接待用車,即採用210輛五龍旗下長江汽車自主研發的電動中巴車、電動商務車作為會議VIP接待用車和會議核心區域工作用車;而長江電動汽車不僅造型新穎,其科技配置、智慧駕馭模式更是為各國來賓所讚譽。

    立凱-KY已於上月底前完成與五龍的資本合作案,雙方預計將在資金及技術方面合作,以加速拓展大陸電動車市場版圖。

    (本文內容由授權提供)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    USB CONNECTOR掌控什麼技術要點? 帶您認識其相關發展及效能

    台北網頁設計公司這麼多該如何選擇?

    ※智慧手機時代的來臨,RWD網頁設計為架站首選

    ※評比南投搬家公司費用收費行情懶人包大公開

    ※回頭車貨運收費標準

    聚甘新

  • 特斯拉帶動電池需求,住友化學擬擴產四倍

    特斯拉(Tesla)雖然傳出供貨不及、營收下滑等問題,但仍明顯帶動全球市場對於電動車的關注與需求。看好電動車用鋰電池的需求量將繼續成長,日本住友化學(Sumitomo Chemical)計畫在2018年時將位於南韓的分隔膜(separator)產能擴增至2016年初水準的4倍。

    根據《日經》報導,電動車市場的擴大,直接推動電動車用鋰電池的供應鏈強度,從材料到電池包都成為產業關注的焦點。特斯拉的車用電池由日本Panasonic所提供,而Panasonic供應給特斯拉的電池所使用的分隔膜,則由住友化學供應。因應特斯拉打算在2018年將年產能提高到50萬輛、2020年增至100萬輛,住友化學預期Panasonic的分隔膜需求會在接下來暴漲,因此決定擴產。

    正極與負極材料、分隔膜、電解液是鋰電池的四大關鍵材料,且日廠佔有絕對的市佔率。除住友化學供應分隔膜給 Panasonic 之外,Toray也有供應分隔膜給Panasonic、LG Chem,且預計在2018年底時將產能提高70%。另一分隔膜廠商旭化成計畫在2020年底前倍增分隔膜產能,住友金屬礦山打算在近年將正極材料產能擴大兩倍、昭和電工則規畫在今年底前提高負極材料產能80%。

    MoneyDJ引用日本市調機構富士經濟的說法,認為全球電動車市場會在2020年左右急速擴大,到2035年時成長到567萬輛,較2015年飆漲近16倍之多。其中,又以中國、歐洲市場的成長幅度最為明顯。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

    南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

    ※教你寫出一流的銷售文案?

    ※超省錢租車方案

    聚甘新

  • 中國大陸公布電動車違規業者,市場趨緩?

    先前北京重金支持環保車,新能源車飆速成長,人人都想分杯羹。如今當局態度驟變、開始教訓業者,接連兩天公布違規廠商名單。北京政策大轉彎,新能源車恐怕會從生機蓬勃的春天一夕轉為料峭刺骨的寒冬。

    BusinessKorea、路透社報導,中國財政部8日懲處了至少五家車廠,指控他們的電動車和油電混合車計畫不實,非法取得人幣10億元補助,決定吊銷蘇州吉姆西客車製造(Suzhou Gemsea Coach Manufacturing)的生產執照,並對另外四家車廠處以罰款,其中包括中國第七大轎車廠奇瑞控股(Chery Holding)的子公司。

    專家指出,這表示中國新能源車政策出現劇變,中國企業工業協會(CAAM)副秘書長Xu Yanhua說,這對車業是一大打擊,對執法有重大影響。9日北京當局再次出擊,官媒中國證券報再公布了20家違規車廠,包括日本的日產汽車(Nissan)、韓國的現代汽車、中國的吉利汽車、江淮汽車(JAC)、比亞迪(BYD)子公司等。

    北京調查騙補,勢必會影響新能源車銷售,難以達到年度銷售70萬輛的目標。今年前八個月,新能源車僅售出24.5萬輛,和目標差距極大,當局又當頭澆下冷水,沒了補助誘因,車商更沒動力推出電動車,車市恐會驟然轉冷。

    台灣電動車概念股包括康普、F-貿聯、和大、F-乙盛、胡連、健和興、台達電等。

    北京政策急轉彎有跡可循,當局為了降低財庫負擔、促進技術發展,決定調整政策,未來擬降低補貼、拉高准入門檻,讓新能源車行業告別「野蠻生長」、迎來一輪優勝劣汰的洗牌。不過,這也意味著大陸目前超過200家的新能源車新創業者有超過9成5恐在兩年內被淘汰出局。

    大陸官營的人民日報8月27日報導,由於新能源車補貼政策的激勵和准入門檻較低,行業在快速發展的同時也產生不少問題,比如重複建設、低品質、同質化產品現象嚴重,甚至出現了企業騙補的情況。對此,財政部官員透露,近期將調整新能源汽車的補貼政策。中國已在去(2015)年超越美國成為全球最大新能源車(包括電動車、插電式油電混合車以及燃料電池車)市場。

    (本文內容由授權提供)

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※Google地圖已可更新顯示潭子電動車充電站設置地點!!

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※別再煩惱如何寫文案,掌握八大原則!

    網頁設計最專業,超強功能平台可客製化

    聚甘新

  • 推動電動車,中國要求加速住宅區充電設施建設

    為確保住宅區居民的電動車充電需求,中國國家發改委、能源局、工信不予鑄件部聯合發出通知,要求各地區加速推廣住宅區的電動車充電基礎建設,並須推動既有之住宅區停車位的電氣化改造。

    根據聯合通知,在既有停車位的改造方面,專用的固定車位需依照「一表一車位」之模式進行配套供電設施增加容量的改造,且每個停車位需配置適當的容量電能表。公用車位則需考量該區實際情形與電動車車主之充電需求,進行配套供電設施建設。

    北京政府亦將針對住宅區停車位的電氣化建設提供專項資金等政策支持。

    同時,聯合通知要求開始研究第三方充電服務企業、物業服務企業、車位產權方、業主委員會等多方共同參與住宅區充電基礎設施營運與市場化經營,並鼓勵導入集中改造、智慧充電管理、多用戶分時分享等營運模式,以提升營運水準。各地的主管部門亦可根據在地營運狀況推出合理的收費機制,以行程可永續經營的市場型態。

    該通知同時要求推動住宅區充電設施的保險配套工作,保險涵蓋範圍包括:設施製造商、營運業務方、企業、用戶個人等。

    中國將在京津冀魯、長江三角、珠江三角等三地的重點城市與各地能源發改委以及房地產主管部門合作推動示範性專案。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

    ※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    南投搬家公司費用需注意的眉眉角角,別等搬了再說!

    ※教你寫出一流的銷售文案?

    聚甘新

  • 福斯推出概念電動車,續航力上看600公里

    福斯汽車(Volkswagen)因排氣造假醜聞而加速電動車研發腳步,不僅研發電動車平台MEB,更預計在今年9月底的巴黎車展上推出首輛由MEB平台打造的電動概念車。這款電動概念車的續航力據報導可達400~600公里。

    媒體報導,福斯這款即將面世MEB平台電動概念車,外觀較接近既有車款,大小類似Golf,空間則接近Passat。為維持價格合理,並未採用太多昂貴的輕量複合材質。

    值得注意的是,在NEDC標準測試下,這款概念車的續航力可達400~600公里之遠。優異的續航性能與合理定價,將有助提高消費者對產品的接受度。此外,這款概念車據稱已十分接近量產階段,預期會在2019年正式投產。

    MEB平台也會陸續研發出多款電動汽車,如Phaeton、Budd-e等。福斯計畫在2025年之前推出至少30款電動車款,並在2030年時將電動車銷售量提高到旗下總銷量的三分之一。

    本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

    【其他文章推薦】

    ※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

    網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

    ※想知道最厲害的網頁設計公司“嚨底家”!

    ※別再煩惱如何寫文案,掌握八大原則!

    ※產品缺大量曝光嗎?你需要的是一流包裝設計!

    聚甘新